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. win32多线程学习笔记

    <多核程序设计技术> 第五章--线程api,一个使用windows事件的线程应用程序,vs2008下编译调试通过. // 线程通信机制.cpp : 定义控制台应用程序的入口点. // #i ...

  2. iOS开发常用第三方库

    UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...

  3. search a 2D matrix(在二维数组中搜索一个元素)

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  4. 在 javascript 中,为什么 [1,2] + [3,4] 不等于 [1,2,3,4]?

    在 stackoverflow 上有人提问:arrays - Why does [1,2] + [3,4] = "1,23,4" in JavaScript? 问题 我想将一个数组 ...

  5. 公司内网搭建代理DNS使用内网域名代替ip地址

    企业场景 一般在企业内部,开发.测试以及预生产都会有一套供开发以及测试人员使用的网络环境.运维人员会为每套环境的相关项目配置单独的Tomcat,然后开放一个端口,以 IP+Port 的形式访问.然而随 ...

  6. Django升级1.8的一些问题

    1.最明显的问题当然是Settings设置中关于模板的设置数据结构发生变化,这个就不细说了,你开个Django的1.8的新项目就知道怎么改了 2.migrations问题,这个问题是1.8最主要的修改 ...

  7. ubuntu 14.04 安装svn server (subversionedge )

    ubuntu 14.04 安装subversionedge 请仔细阅读安装包自带的readme文件! 1.先去官网,找安装包: http://subversion.apache.org/ http:/ ...

  8. spring cloud 入门系列五:使用Feign 实现声明式服务调用

    一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...

  9. JS中$含义和用法

    原博客:https://www.cnblogs.com/jokerjason/p/7404649.html$在JS中本身只是一个符号而异,在JS里什么也不是.但在JS应用库JQUERY的作者将之做为一 ...

  10. 微信小程序入门一

    基本的准备工作 -知识储备 --基础:HTML+JS+CSS --进阶:React.Vue -工具安装 --工具由微信官方提供 ---下载地址:https://github.com/zce/weapp ...