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 11th tip of DB Query Analyzer

          The 11th tip of DB Query Analyzer                                            MA Gen feng       ...

  2. sqlite 数据类型 <转>

    一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断.SQLite具有以下五种数据类型: 1.NULL:空值.2.INTEGER:带符号的整型,具体取决有存入数字 ...

  3. miniUI Grid添加汇总行,Grid绑定数据,IDEA免编译设置

    坑1: 2017-6-5周二,上午解决了昨天摸索一下午的问题,使用miniui显示汇总行数据,要点有这么几个 在创建Grid div的时候一定要加上以下两个属性: //显示汇总行开关 showSumm ...

  4. htmlDOM操作1

    DOM 是 Document Object Model(文档对象模型)的缩写. HTML 的标准对象模型 HTML 的标准编程接口 HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它 ...

  5. BAT面试技巧

    很多人都质疑面试前去google一下面试题,是否有用....其实真实情况往往是这样:前台告诉经理,有个面试者来了,经理一拍头:啊!差点忘了!拿起电话:小谢,你有空吧,帮忙面个试! 小谢答应后,goog ...

  6. 数据库导入Excel数据的简易方法

    当然,最糙猛的方式就是自己写程序读取Excel程序然后插进数据库,但那种方式要求太高.说个简单方法,主流数据库的管理工具支持CSV文件格式数据向表导入,而Excel可以另存外CSV文件,这种导入就手工 ...

  7. Install OpenCV 3.0 and Python 2.7+ on Ubuntu

    为了防止原文消失或者被墙,转载留个底,最好还是去看原贴,因为随着版本变化,原贴是有人维护升级的 http://www.pyimagesearch.com/2015/06/22/install-Open ...

  8. Python函数式实现单例特性

    传统的单例一般是基于类的特性实现,Python模块是天生的单例,下面来个简单的借助模块和函数实现单例特性: gdb = None def get_gdb(): global gdb if gdb is ...

  9. 使用Selenium对新浪微博模拟登录

    Selenium的配置 在项目中引入Selenium库 下载chromedriver.exe 在项目代码中加入chromedriver位置的配置 使用Selenium Selenim语法 智能等待 隐 ...

  10. Django REST framework+Vue 打造生鲜超市(十三)

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...