package storage
//kv 存储引擎实现
import (
    "github.com/cznic/kv"
    "io"
)
//kv 存储结构体 并且实现了storage存储接口
type kvStorage struct {
    db *kv.DB
}
//打开存储引擎   即:引擎map集合对应的value 值  函数的实现  key为path
//返回存储引擎接口  和  err  代表文件打开错误
func openKVStorage(path string) (Storage, error) {
    options := &kv.Options{}
    db, errOpen := kv.Open(path, options)
    if errOpen != nil {
        var errCreate error
        db, errCreate = kv.Create(path, options)
        if errCreate != nil {
            return &kvStorage{db}, errCreate
        }
    }
    return &kvStorage{db}, nil
}

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

func (s *kvStorage) Set(k []byte, v []byte) error {
    return s.db.Set(k, v)
}

func (s *kvStorage) Get(k []byte) ([]byte, error) {
    return s.db.Get(nil, k)
}

func (s *kvStorage) Delete(k []byte) error {
    return s.db.Delete(k)
}

func (s *kvStorage) ForEach(fn func(k, v []byte) error) error {
    iter, err := s.db.SeekFirst()
    if err == io.EOF {
        return nil
    } else if err != nil {
        return err
    }
    for {
        key, value, err := iter.Next()
        if err == io.EOF {
            break
        } else if err != nil {
            return err
        }
        if err := fn(key, value); err != nil {
            return err
        }
    }
    return nil
}

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

kv_storage.go的更多相关文章

随机推荐

  1. rails中migration数据库后测试不通过的问题

    rails项目中由于后期需求变化,需要在products数据库中增加一个字段来满足多国家商品的分类: rails g migration add_locale_to_products locale:s ...

  2. JVM学习--(四)垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...

  3. 在Redis Sentinel环境下,jedis该如何配置

    在Redis主从复制架构中,如果master出现了故障,则需要人工将slave提升为master,同时,通知应用侧更新master的地址.这样方式比较低效,对应用侧影响较大. 为了解决这个问题,Red ...

  4. use ECharts with Angular 2 and TypeScript

    https://stackoverflow.com/questions/38158318/is-it-possible-to-use-echarts-baidu-with-angular-2-and- ...

  5. vue实现淘宝商品详情页属性选择功能

    方法一是自己想出来的,方法二来自忘记哪里看到的了 不知道是不是你要的效果: 方法一:利用input[type="radio"] css代码: input { display: no ...

  6. ElasticSearch本地调测环境构建

    ElasicSearch版本:6.0.0:https://github.com/elastic/elasticsearch.git 1:安装JVM(JVM1.8以上) 2:安装gradle(3.3以上 ...

  7. PAT1126:Eulerian Path

    1126. Eulerian Path (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue In grap ...

  8. springMVC引入Validation详解

    本文简单介绍如何引入validation的步骤,如何通过自定义validation减少代码量,提高生产力.特别提及:非基本类型属性的valid,GET方法的处理,validation错误信息的统一re ...

  9. 应用服务器性能优化 之 消息队列(MQ:Message Queue)

    一,消息队列基本概念 借用百科的一句话:消息队列就是在消息的传输过程中,保存消息的容器. 从图-1和图-2对比,可以很清晰的明白,消息队列服务器,是位于应用服务器和数据库服务器之间的一个服务器.消息队 ...

  10. 拇指玩」制作的「谷歌安装器」app

    作者:匿名用户链接:https://www.zhihu.com/question/57468448/answer/153000587来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...