From dac842f236d77a881988cf3aa96bef909d8e1988 Mon Sep 17 00:00:00 2001 From: cc Date: Sun, 21 Jul 2024 14:39:52 +0000 Subject: [PATCH] =?UTF-8?q?boltdb=E5=A2=9E=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=8F=92=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/boltdb/boltdb.go | 91 +++++++++++++++++++++++++++++++-------------- db/boltdb/config.go | 6 ++- 2 files changed, 67 insertions(+), 30 deletions(-) diff --git a/db/boltdb/boltdb.go b/db/boltdb/boltdb.go index 13d6113..4f547f7 100644 --- a/db/boltdb/boltdb.go +++ b/db/boltdb/boltdb.go @@ -26,7 +26,11 @@ type boltDB struct { func New(config ...Config) (db *boltDB) { cfg := configDefault(config...) db = &boltDB{} - db.db, _ = bolt.Open(cfg.Name, 0600, &bolt.Options{Timeout: 1 * time.Second}) + db.db, _ = bolt.Open(cfg.Name, 0600, &bolt.Options{ + Timeout: time.Duration(cfg.Timeout) * time.Second, + NoGrowSync: cfg.NoGrowSync, + ReadOnly: cfg.ReadOnly, + }) return } @@ -41,33 +45,41 @@ func (cc *boltDB) Close() (rer error) { } // 建表 -func (cc *boltDB) CreateBucket(bucketName ...string) { +func (cc *boltDB) CreateBucket(bucketName ...string) (rer error) { if bucketName == nil { return } - cc.db.Update(func(tx *bolt.Tx) error { + rer = cc.db.Update(func(tx *bolt.Tx) error { + var errs error for _, name := range bucketName { if name != "" { - tx.CreateBucketIfNotExists([]byte(name)) + if _, err := tx.CreateBucketIfNotExists([]byte(name)); err != nil { + errs = errors.Join(errs, err) + } } } - return nil + return errs }) + return } // 删表 -func (cc *boltDB) DeleteBucket(bucketName ...string) { +func (cc *boltDB) DeleteBucket(bucketName ...string) (rer error) { if bucketName == nil { return } - cc.db.Update(func(tx *bolt.Tx) error { + rer = cc.db.Update(func(tx *bolt.Tx) error { + var errs error for _, name := range bucketName { if name != "" { - tx.DeleteBucket([]byte(name)) + if err := tx.DeleteBucket([]byte(name)); err != nil { + errs = errors.Join(errs, err) + } } } - return nil + return errs }) + return } // 保存 @@ -148,8 +160,8 @@ func (cc *boltDB) Delete(bucketName, key string) (rer error) { }) } -// 查询所有list -func (cc *boltDB) GetList(bucketName string) (rv [][]byte, rer error) { +// 自定义遍历 +func (cc *boltDB) ForEach(bucketName string, fn func(k, v []byte) error) (rer error) { rer = ErrBucketInvalid if bucketName == "" { return @@ -159,10 +171,16 @@ func (cc *boltDB) GetList(bucketName string) (rv [][]byte, rer error) { if b == nil { return ErrBucketNotFound } - return b.ForEach(func(k, v []byte) error { - rv = append(rv, v) - return nil - }) + return b.ForEach(fn) + }) + return +} + +// 查询所有list +func (cc *boltDB) GetList(bucketName string) (rv [][]byte, rer error) { + rer = cc.ForEach(bucketName, func(k, v []byte) error { + rv = append(rv, v) + return nil }) return } @@ -170,19 +188,9 @@ func (cc *boltDB) GetList(bucketName string) (rv [][]byte, rer error) { // 查询所有map func (cc *boltDB) GetMap(bucketName string) (rv map[string][]byte, rer error) { rv = make(map[string][]byte) - rer = ErrBucketInvalid - if bucketName == "" { - return - } - rer = cc.db.View(func(tx *bolt.Tx) error { - b := tx.Bucket([]byte(bucketName)) - if b == nil { - return ErrBucketNotFound - } - return b.ForEach(func(k, v []byte) error { - rv[string(k)] = v - return nil - }) + rer = cc.ForEach(bucketName, func(k, v []byte) error { + rv[string(k)] = v + return nil }) return } @@ -341,3 +349,30 @@ func (cc *boltDB) ScanRangeMap(bucketName, start, end string) (rv map[string][]b }) return } + +// 批处理插入 +func (cc *boltDB) BatchSet(bucketName string, value map[string][]byte) (rer error) { + rer = ErrBucketInvalid + if bucketName == "" { + return + } + rer = cc.db.Batch(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(bucketName)) + if b == nil { + return ErrBucketNotFound + } + for k, v := range value { + if k == "" { + return ErrKeyInvalid + } + if value == nil { + return ErrValueInvalid + } + if err := b.Put([]byte(k), v); err != nil { + return err + } + } + return nil + }) + return +} diff --git a/db/boltdb/config.go b/db/boltdb/config.go index 1328000..83dd096 100644 --- a/db/boltdb/config.go +++ b/db/boltdb/config.go @@ -1,7 +1,10 @@ package boltdb type Config struct { - Name string + Name string + Timeout uint64 + NoGrowSync bool + ReadOnly bool } var cfg_default = Config{ @@ -17,6 +20,5 @@ func configDefault(config ...Config) Config { if cfg.Name == "" { cfg.Name = cfg_default.Name } - return cfg }