waddrmgr: extend createManagerNS to also create name spaces for each scope
This commit is contained in:
parent
57cf4274ee
commit
9f71d472a3
1 changed files with 89 additions and 35 deletions
124
waddrmgr/db.go
124
waddrmgr/db.go
|
@ -1973,67 +1973,121 @@ func managerExists(ns walletdb.ReadBucket) bool {
|
||||||
return mainBucket != nil
|
return mainBucket != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// createManagerNS creates the initial namespace structure needed for all of the
|
// createScopedManagerNS creates the namespace buckets for a new registered
|
||||||
// manager data. This includes things such as all of the buckets as well as the
|
// manager scope within the top level bucket. All relevant sub-buckets that a
|
||||||
// version and creation date.
|
// ScopedManager needs to perform its duties are also created.
|
||||||
func createManagerNS(ns walletdb.ReadWriteBucket) error {
|
func createScopedManagerNS(ns walletdb.ReadWriteBucket, scope *KeyScope) error {
|
||||||
mainBucket, err := ns.CreateBucket(mainBucketName)
|
// First, we'll create the scope bucket itself for this particular
|
||||||
|
// scope.
|
||||||
|
scopeKey := scopeToBytes(scope)
|
||||||
|
scopeBucket, err := ns.CreateBucket(scopeKey[:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
str := "failed to create main bucket"
|
str := "failed to create sync bucket"
|
||||||
return managerError(ErrDatabase, str, err)
|
return managerError(ErrDatabase, str, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = ns.CreateBucket(addrBucketName)
|
_, err = scopeBucket.CreateBucket(acctBucketName)
|
||||||
if err != nil {
|
|
||||||
str := "failed to create address bucket"
|
|
||||||
return managerError(ErrDatabase, str, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = ns.CreateBucket(acctBucketName)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
str := "failed to create account bucket"
|
str := "failed to create account bucket"
|
||||||
return managerError(ErrDatabase, str, err)
|
return managerError(ErrDatabase, str, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = ns.CreateBucket(addrAcctIdxBucketName)
|
_, err = scopeBucket.CreateBucket(addrBucketName)
|
||||||
|
if err != nil {
|
||||||
|
str := "failed to create address bucket"
|
||||||
|
return managerError(ErrDatabase, str, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// usedAddrBucketName bucket was added after manager version 1 release
|
||||||
|
_, err = scopeBucket.CreateBucket(usedAddrBucketName)
|
||||||
|
if err != nil {
|
||||||
|
str := "failed to create used addresses bucket"
|
||||||
|
return managerError(ErrDatabase, str, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = scopeBucket.CreateBucket(addrAcctIdxBucketName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
str := "failed to create address index bucket"
|
str := "failed to create address index bucket"
|
||||||
return managerError(ErrDatabase, str, err)
|
return managerError(ErrDatabase, str, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err = scopeBucket.CreateBucket(acctNameIdxBucketName)
|
||||||
|
if err != nil {
|
||||||
|
str := "failed to create an account name index bucket"
|
||||||
|
return managerError(ErrDatabase, str, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = scopeBucket.CreateBucket(acctIDIdxBucketName)
|
||||||
|
if err != nil {
|
||||||
|
str := "failed to create an account id index bucket"
|
||||||
|
return managerError(ErrDatabase, str, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = scopeBucket.CreateBucket(metaBucketName)
|
||||||
|
if err != nil {
|
||||||
|
str := "failed to create a meta bucket"
|
||||||
|
return managerError(ErrDatabase, str, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// createManagerNS creates the initial namespace structure needed for all of
|
||||||
|
// the manager data. This includes things such as all of the buckets as well
|
||||||
|
// as the version and creation date. In addition to creating the key space for
|
||||||
|
// the root address manager, we'll also create internal scopes for all the
|
||||||
|
// default manager scope types.
|
||||||
|
func createManagerNS(ns walletdb.ReadWriteBucket,
|
||||||
|
defaultScopes map[KeyScope]ScopeAddrSchema) error {
|
||||||
|
|
||||||
|
// First, we'll create all the relevant buckets that stem off of the
|
||||||
|
// main bucket.
|
||||||
|
mainBucket, err := ns.CreateBucket(mainBucketName)
|
||||||
|
if err != nil {
|
||||||
|
str := "failed to create main bucket"
|
||||||
|
return managerError(ErrDatabase, str, err)
|
||||||
|
}
|
||||||
_, err = ns.CreateBucket(syncBucketName)
|
_, err = ns.CreateBucket(syncBucketName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
str := "failed to create sync bucket"
|
str := "failed to create sync bucket"
|
||||||
return managerError(ErrDatabase, str, err)
|
return managerError(ErrDatabase, str, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// usedAddrBucketName bucket was added after manager version 1 release
|
// We'll also create the two top-level scope related buckets as
|
||||||
_, err = ns.CreateBucket(usedAddrBucketName)
|
// preparation for the operations below.
|
||||||
|
scopeBucket, err := ns.CreateBucket(scopeBucketName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
str := "failed to create used addresses bucket"
|
str := "failed to create scope bucket"
|
||||||
|
return managerError(ErrDatabase, str, err)
|
||||||
|
}
|
||||||
|
scopeSchemas, err := ns.CreateBucket(scopeSchemaBucketName)
|
||||||
|
if err != nil {
|
||||||
|
str := "failed to create scope schema bucket"
|
||||||
return managerError(ErrDatabase, str, err)
|
return managerError(ErrDatabase, str, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = ns.CreateBucket(acctNameIdxBucketName)
|
// Next, we'll create the namespace for each of the relevant default
|
||||||
if err != nil {
|
// manager scopes.
|
||||||
str := "failed to create an account name index bucket"
|
for scope, scopeSchema := range defaultScopes {
|
||||||
return managerError(ErrDatabase, str, err)
|
// Before we create the entire namespace of this scope, we'll
|
||||||
}
|
// update the schema mapping to note what types of addresses it
|
||||||
|
// prefers.
|
||||||
|
scopeKey := scopeToBytes(&scope)
|
||||||
|
schemaBytes := scopeSchemaToBytes(&scopeSchema)
|
||||||
|
err := scopeSchemas.Put(scopeKey[:], schemaBytes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
_, err = ns.CreateBucket(acctIDIdxBucketName)
|
err = createScopedManagerNS(scopeBucket, &scope)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
str := "failed to create an account id index bucket"
|
return err
|
||||||
return managerError(ErrDatabase, str, err)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
_, err = ns.CreateBucket(metaBucketName)
|
err = putLastAccount(ns, &scope, DefaultAccountNum)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
str := "failed to create a meta bucket"
|
return err
|
||||||
return managerError(ErrDatabase, str, err)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if err := putLastAccount(ns, DefaultAccountNum); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := putManagerVersion(ns, latestMgrVersion); err != nil {
|
if err := putManagerVersion(ns, latestMgrVersion); err != nil {
|
||||||
|
|
Loading…
Reference in a new issue