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. jQuery live()方法使用及变更(事件委托)

    根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...

  2. 玩转Git入门篇

    最近项目使用到Git管理项目,所以就学习了一番,随然网上关于 Git的文章铺天盖地,我还是整理下总结下自己学习Git相关笔记,希望也能帮助到需要他的小伙伴们,O(∩_∩)O~ 简介 Git 是分布式版 ...

  3. mongodb备份还原脚本

    同步 echo off ,%-%date:~,%-%date:~,% set bak_dir=mongo_na_world_svn2win_%time_dir% set fromdb=db_erago ...

  4. 新一代大数据处理引擎 Apache Flink

    https://www.ibm.com/developerworks/cn/opensource/os-cn-apache-flink/index.html 大数据计算引擎的发展 这几年大数据的飞速发 ...

  5. JSPWiki安装配置及FCKEditor的集成

    版本:JSPWiki-2.8.2 FCKeditor_2.6.3     安装方法我参照:http://doc.jspwiki.org/2.4/wiki/InstallingJSPWiki FCKEd ...

  6. 拖拽模块move1

    刚开的博客,想着写点什么,以前写过拖拽函数,后来又学习了模块化,于是一直想把之前写的拖拽函数封成一个独立的模块,方便以后调用,说干就干,下面码代码... <script> var move ...

  7. 你需要知道的Android拍照适配方案

    拍照功能实现 Android 程序上实现拍照功能的方式分为两种:第一种是利用相机的 API 来自定义相机,第二种是利用 Intent 调用系统指定的相机拍照.下面讲的内容都是针对第二种实现方式的适配. ...

  8. 老司机告诉你高质量的Java代码是怎么练成的?

    一提起程序员,首先想到的一定是"码农",对,我们是高产量的优质"码农",我们拥有超跃常人的逻辑思维以及不走寻常路的分析.判别能力,当然,我们也有良好的编码规范, ...

  9. Storm之路-WordCount-实例

    初学storm,有不足的地方还请纠正. 网上看了很多wordcount实例,发现都不是我想要的. 实现场景:统计shengjing.txt词频到集合,一次打印结果. ● 消息源Spout 继承Base ...

  10. Flask快速入门

    flask快速入门 1.1.三种框架比较 Django: 重武器,内部包含了非常多组件:ORM.Form.ModelForm.缓存.Session.中间件.信号等 Flask:短小精悍,内部没有太多组 ...