diff --git a/boltrest.go b/boltrest.go index 225a70d..37944d9 100644 --- a/boltrest.go +++ b/boltrest.go @@ -44,13 +44,25 @@ func Create(filename string) (*DB, error) { // Open opens the DB so things can be done func (b *DB) Open() error { var err error - b.localDB, err = Open(b.localFile, 0644, nil) + if !b.isOpen { + b.localDB, err = bolt.Open(b.localFile, 0644, nil) + if err == nil { + b.isOpen = true + } + } return err } // Close closes the DB func (b *DB) Close() error { - return b.localDB.Close() + var err error + if b.isOpen { + err = b.localDB.Close() + if err == nil { + b.isOpen = false + } + } + return err } // Offline sets this DB to offline mode @@ -61,8 +73,18 @@ func (b *DB) Offline() { // MkBucketPath builds all buckets in the string slice func (b *DB) MkBucketPath(path []string) error { + var err error + /* + if !b.isOpen { + err = b.Open() + if err != nil { + return err + } + defer b.Close() + } + */ b.RefreshDB() - err := b.localDB.Update(func(tx *bolt.Tx) error { + err = b.localDB.Update(func(tx *bolt.Tx) error { var err error bkt := tx.Bucket([]byte(path[0])) if bkt == nil { @@ -98,6 +120,15 @@ func (b *DB) MkBucketPath(path []string) error { func (b *DB) GetValue(path []string, key string) (string, error) { var err error var ret string + /* + if !b.isOpen { + err = b.Open() + if err != nil { + return ret, err + } + defer b.Close() + } + */ b.RefreshDB() b.localDB.View(func(tx *bolt.Tx) error { bkt := tx.Bucket([]byte(path[0])) @@ -121,8 +152,18 @@ func (b *DB) GetValue(path []string, key string) (string, error) { // SetValue sets the value at path to val // path is a slice of tokens func (b *DB) SetValue(path []string, key, val string) error { + var err error + /* + if !b.isOpen { + err = b.Open() + if err != nil { + return err + } + defer b.Close() + } + */ b.RefreshDB() - err := b.MkBucketPath(path) + err = b.MkBucketPath(path) if err != nil { return err } @@ -202,10 +243,18 @@ func (b *DB) SetTimestamp(path []string, key string, val time.Time) error { // GetBucketList returns a list of all sub-buckets at path func (b *DB) GetBucketList(path []string) ([]string, error) { - b.RefreshDB() - var err error var ret []string + /* + if !b.isOpen { + err = b.Open() + if err != nil { + return ret, err + } + defer b.Close() + } + */ + b.RefreshDB() err = b.localDB.Update(func(tx *bolt.Tx) error { bkt := tx.Bucket([]byte(path[0])) if bkt == nil { @@ -238,10 +287,18 @@ func (b *DB) GetBucketList(path []string) ([]string, error) { // GetKeyList returns a list of all keys at path func (b *DB) GetKeyList(path []string) ([]string, error) { - b.RefreshDB() - var err error var ret []string + /* + if !b.isOpen { + err = b.Open() + if err != nil { + return ret, err + } + defer b.Close() + } + */ + b.RefreshDB() err = b.localDB.Update(func(tx *bolt.Tx) error { bkt := tx.Bucket([]byte(path[0])) if bkt == nil { @@ -272,8 +329,17 @@ func (b *DB) GetKeyList(path []string) ([]string, error) { // DeletePair deletes the pair with key at path func (b *DB) DeletePair(path []string, key string) error { - b.RefreshDB() var err error + /* + if !b.isOpen { + err = b.Open() + if err != nil { + return err + } + defer b.Close() + } + */ + b.RefreshDB() err = b.localDB.Update(func(tx *bolt.Tx) error { bkt := tx.Bucket([]byte(path[0])) if bkt == nil { @@ -301,8 +367,17 @@ func (b *DB) DeletePair(path []string, key string) error { // DeleteBucket deletes the bucket key at path func (b *DB) DeleteBucket(path []string, key string) error { - b.RefreshDB() var err error + /* + if !b.isOpen { + err = b.Open() + if err != nil { + return err + } + defer b.Close() + } + */ + b.RefreshDB() err = b.localDB.Update(func(tx *bolt.Tx) error { bkt := tx.Bucket([]byte(path[0])) if bkt == nil { @@ -328,6 +403,15 @@ func (b *DB) DeleteBucket(path []string, key string) error { // RefreshDB makes sure that the DB is fresh with the server version func (b *DB) RefreshDB() error { var err error + /* + if !b.isOpen { + err = b.Open() + if err != nil { + return err + } + defer b.Close() + } + */ if b.online { // TODO: Compare latest change here with lates on server // Then sync, if needed