package volume

import (
    "github.com/syndtr/goleveldb/leveldb"
    "encoding/binary"
    "path/filepath"
    "strconv"
)
//文件索引结构体
type LevelDBIndex struct {
    path string
    db   *leveldb.DB
}
//创建leveldb索引
func NewLevelDBIndex(dir string, vid uint64) (index *LevelDBIndex, err error) {
    path := filepath.Join(dir, strconv.FormatUint(vid, 10) + ".index")
    index = new(LevelDBIndex)
    index.path = path
    index.db, err = leveldb.OpenFile(path, nil)
    return index, err
}
//实现index接口
//文件是否存在  物理存在
func (l *LevelDBIndex)Has(fid uint64) bool {
    key := make([]byte, 8)
    binary.BigEndian.PutUint64(key, fid)
    _, err := l.db.Get(key, nil)
    return err == nil
}
//获取文件
func (l *LevelDBIndex)Get(fid uint64) (*FileInfo, error) {
    key := make([]byte, 8)
    binary.BigEndian.PutUint64(key, fid)
    data, err := l.db.Get(key, nil)
    if err != nil {
        return nil, err
    }
    fi := new(FileInfo)
    return fi, fi.UnMarshalBinary(data)
}
//存储文件
func (l *LevelDBIndex)Set(fi *FileInfo) error {
    data := fi.MarshalBinary()
    return l.db.Put(data[:8], data, nil)
}
//删除文件
func (l *LevelDBIndex)Delete(fid uint64) error {
    key := make([]byte, 8)
    binary.BigEndian.PutUint64(key, fid)
    return l.db.Delete(key, nil)
}
//关闭资源
func (l *LevelDBIndex)Close() error {
    return l.db.Close()
}

index_levedb.go的更多相关文章

随机推荐

  1. 属性动画基础之ValueAnimator

    概述 属性动画是谷歌在android3.0(API level 11)时候给我们带来了属性动画,真正意义上带来了"动画",以前的帧动画也就4中效果的组合(旋转.淡入淡出.放大缩小. ...

  2. LeetCode(60)-ZigZag Conversion

    题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  3. javascript内置对象速查(二)

    Window对象 每个浏览器窗口或框架都对应于一个Window对象,它是随body或frameset元素的每个实例一起创建的对象. function status_text(){ window.sta ...

  4. React Native Android开发环境配置

    近些年,Web前端甚是火爆,火爆程度堪比我毕业时的移动端开发一般.随着JavaScript的火爆,移动端也不安分了起来,ReactNative就异军突起了,几乎要做到"一次学习,四处开发&q ...

  5. Java IO学习--(一)概述

    在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得 ...

  6. GitHub Desktop 如何创建本地仓库,上传代码,删除仓库

    1.创建本地仓库 2.打开本地仓库,将要上传的文件放到本地仓库. 3.ctrl+p push仓库或者菜单栏Repository下push也可以用右上角的publish respository 4.左边 ...

  7. RocketMQ源码 — 七、 RocketMQ高可用(2)

    上一篇说明了RocketMQ怎么支持broker集群的,这里接着说RocketMQ实现高可用的手段之一--冗余. RocketMQ部署的时候一个broker set会有一个mater和一个或者多个sl ...

  8. jquery.js

    /*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license //@ sourceMappingUR ...

  9. Go中string转[]byte的陷阱

    Go中string转[]byte的陷阱html {overflow-x: initial !important;}#write, body { height: auto; }#write, #writ ...

  10. day10_cookie&session学习笔记

    一.会话概述 1.什么是会话?如同打电话. 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 2.会话过程要解决的问题是什么?保持 ...