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()
}

bolt_storage.go的更多相关文章

随机推荐

  1. The 6th tip of DB Query Analyzer

      The 6th tip of DB Query Analyzer MA Gen feng (Guangdong Unitoll Services incorporated, Guangzhou ...

  2. 添加极光推送以及在ios中的问题

    项目为 ionic1 + angular1 1.添加极光推送插件 用cordova进行添加 cordova plugin add jpush-phonegap-plugin --variable AP ...

  3. (function(){xxx})(); 写法解释

    常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿 ...

  4. 6.4 Schema 设计对系统的性能影响

    前面两节中,我们已经分析了在一个数据库应用系统的软环境中应用系统的架构实现和系统中与数据库交互的SQL 语句对系统性能的影响.在这一节我们再分析一下系统的数据模型设计实现对系统的性能影响,更通俗一点就 ...

  5. 解决记录:win10 无法安装VS2017,visual studio installer下载进度始终为0

    问题描述:win10 下无法安装VS2017,visual studio installer下载进度始终为0,点击取消按钮后,也没有反应,visual studio installer也关闭不掉: 具 ...

  6. 常常搞不清楚SQLServer中的sp_columns来看一看

    The sp_columns catalog stored procedure is equivalent to SQLColumns in ODBC. The results returned ar ...

  7. 动态规划:给出两个字符串s1和s2,返回其中最大的公共子串

    求公共子字符串问题(连续的) 这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!现在想,当时 ...

  8. 前端Mahsup异步依赖方式不能做业务数据依赖

    很久之前流行mashup方式做内容集成,之前为了IP定位的方便,引用了第三方的IP定位JS,然后根据其内容与服务器同步地址数据并写入Cookie,可是这种方式一旦,第三方的库反应缓慢时,就会出现大问题 ...

  9. jvm垃圾回收(三)

    一.分代思想(年轻代.老年代.永久代): 1.一个新人(new对象)会优先在伊甸园(Eden区)出生,当伊甸园(Eden区)人口达到最大容量时,JVM会派MinorGC去看看哪些人还有价值 2.伊甸园 ...

  10. Phaser文档访问不了,下载英文版文档到本地,已经共享在国内网站上面

    点击链接查看, http://www.simuhunluo.top/Phaser/ 可以找到你所需要的类.