// Create creates a new entry in the database with the given ID // and returns the Pool representing it. func Create(namespace walletdb.Namespace, m *waddrmgr.Manager, poolID []byte) (*Pool, error) { err := namespace.Update( func(tx walletdb.Tx) error { return putPool(tx, poolID) }) if err != nil { str := fmt.Sprintf("unable to add voting pool %v to db", poolID) return nil, newError(ErrPoolAlreadyExists, str, err) } return newPool(namespace, m, poolID), nil }
// initialize creates the DB if it doesn't exist, and otherwise // loads the database. func initializeEmpty(namespace walletdb.Namespace) error { // Initialize the buckets and main db fields as needed. var version uint32 var createDate uint64 err := namespace.Update(func(tx walletdb.Tx) error { rootBucket := tx.RootBucket() mainBucket, err := rootBucket.CreateBucketIfNotExists( mainBucketName) if err != nil { str := "failed to create main bucket" return stakeStoreError(ErrDatabase, str, err) } _, err = rootBucket.CreateBucketIfNotExists(sstxRecordsBucketName) if err != nil { str := "failed to create sstx records bucket" return stakeStoreError(ErrDatabase, str, err) } _, err = rootBucket.CreateBucketIfNotExists(ssgenRecordsBucketName) if err != nil { str := "failed to create ssgen records bucket" return stakeStoreError(ErrDatabase, str, err) } _, err = rootBucket.CreateBucketIfNotExists(ssrtxRecordsBucketName) if err != nil { str := "failed to create ssrtx records bucket" return stakeStoreError(ErrDatabase, str, err) } _, err = rootBucket.CreateBucketIfNotExists(metaBucketName) if err != nil { str := "failed to create meta bucket" return stakeStoreError(ErrDatabase, str, err) } // Save the most recent tx store version if it isn't already // there, otherwise keep track of it for potential upgrades. verBytes := mainBucket.Get(stakeStoreVersionName) if verBytes == nil { version = LatestStakeMgrVersion var buf [4]byte byteOrder.PutUint32(buf[:], version) err := mainBucket.Put(stakeStoreVersionName, buf[:]) if err != nil { str := "failed to store latest database version" return stakeStoreError(ErrDatabase, str, err) } } else { version = byteOrder.Uint32(verBytes) } createBytes := mainBucket.Get(stakeStoreCreateDateName) if createBytes == nil { createDate = uint64(time.Now().Unix()) var buf [8]byte byteOrder.PutUint64(buf[:], createDate) err := mainBucket.Put(stakeStoreCreateDateName, buf[:]) if err != nil { str := "failed to store database creation time" return stakeStoreError(ErrDatabase, str, err) } } else { createDate = byteOrder.Uint64(createBytes) } return nil }) if err != nil { str := "failed to load database" return stakeStoreError(ErrDatabase, str, err) } return nil }