• bolt_storage.go


    package storage
    //bolt存储引擎实现  
    import (
        "github.com/boltdb/bolt"
        "time"
    )

    var wukong_documents = []byte("wukong_documents")
    //bolt结构体 实现  同时实现storage接口
    type boltStorage struct {
        db *bolt.DB
    }
    //实现存储引擎map集合  实现value  对应的函数  
    func openBoltStorage(path string) (Storage, error) {
        db, err := bolt.Open(path, 0600, &bolt.Options{Timeout: 3600 * time.Second})
        if err != nil {
            return nil, err
        }
        err = db.Update(func(tx *bolt.Tx) error {
            _, err := tx.CreateBucketIfNotExists(wukong_documents)
            return err
        })
        if err != nil {
            db.Close()
            return nil, err
        }
        return &boltStorage{db}, nil
    }

    func (s *boltStorage) WALName() string {
        return s.db.Path()
    }

    func (s *boltStorage) Set(k []byte, v []byte) error {
        return s.db.Update(func(tx *bolt.Tx) error {
            return tx.Bucket(wukong_documents).Put(k, v)
        })
    }

    func (s *boltStorage) Get(k []byte) (b []byte, err error) {
        err = s.db.View(func(tx *bolt.Tx) error {
            b = tx.Bucket(wukong_documents).Get(k)
            return nil
        })
        return
    }

    func (s *boltStorage) Delete(k []byte) error {
        return s.db.Update(func(tx *bolt.Tx) error {
            return tx.Bucket(wukong_documents).Delete(k)
        })
    }

    func (s *boltStorage) ForEach(fn func(k, v []byte) error) error {
        return s.db.View(func(tx *bolt.Tx) error {
            b := tx.Bucket(wukong_documents)
            c := b.Cursor()
            for k, v := c.First(); k != nil; k, v = c.Next() {
                if err := fn(k, v); err != nil {
                    return err
                }
            }
            return nil
        })
    }

    func (s *boltStorage) Close() error {
        return s.db.Close()
    }

  • 相关阅读:
    DateTime.TryParseExact 万能时间格式转化 DateTime.TryParse
    post接收raw传递数据
    下载文件到本地
    ICollection<T>转lsit
    导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf、Csv和Html
    Task.Run() 和Task.Factory.StarNew()的区别
    策略模式与简单工厂模式
    Task
    sql语句select group by order by where一般先后顺序
    拼接in时注意事项
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7461659.html
Copyright © 2020-2023  润新知