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. Java数据类型之byte、char

    Java 有8中基本数据类型,分别是byte.int.long.char.float.double.boolean. 1.byte.char的简单介绍 有时候总是搞不清byte.char,所以就现在好 ...

  2. MOOS学习笔记4——独立线程不同回调

    MOOS学习笔记4--独立线程不同回调 /** * @fn 独立线程不同回调 * @version v1.0 * @author */ #include "MOOS/libMOOS/Comm ...

  3. JAVA线程与线程、进程与进程间通信

    I.线程与线程间通信 一.基本概念以及线程与进程之间的区别联系: 关于进程和线程,首先从定义上理解就有所不同1.进程是什么?是具有一定独立功能的程序.它是系统进行资源分配和调度的一个独立单位,重点在系 ...

  4. struts2线程安全

     struts2线程安全 2012-02-16 21:07:58 分类: 系统运维 问题:Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题.Spring的Ioc容器管理 ...

  5. get请求URL的转码

    String name = new String(json.getString("name").getBytes("iso8859-1"),"UTF- ...

  6. Mybatis 系列2

    上篇文章 写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们以 SqlSessionFactoryBuilder 去创建 SqlSes ...

  7. TabBarController和其他view无法建立Relationship segue的原因

    拖拽怎么也没有那个出现,最后看sourcecode发现是那个那个viewcrontroler的XML 元素不是TabBarController.在Sourcecode里面改了一下,解决了这个问题. 总 ...

  8. .gitignore文件不起作用的解决方法

    http://keendawn.blog.163.com/blog/static/88880743201531554431124/ git rm -r --cached . git add . git ...

  9. js实现地图打印功能

    注意:js对地图的打印功能在arcgis10.1中才有提供,所以如果要使用esri自带的地图打印功能,必须使用arcgis 10.1或更高版本的地图打印模板.(由于官网和arcgis desktop提 ...

  10. RabbitMQ Linux(Redhat6.5)安装(二 )

    一.安装erlang 由于RabbitMq的linux运行环境需要erlang环境,所以需要先安装erlang: 1.erlang下载: http://erlang.org/download/(我下载 ...