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. SQLCODE和SQLERRM .

    Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息. OTHERS处理器应该是异常处理块中的最后的异常处理器,因为它是用来捕 ...

  2. OVS 中的哈希表: shash

    shash出现在OVS的代码中,定义如下:   struct hmap_node {     size_t hash;     struct hmap_node * next; };   struct ...

  3. Java数据结构面试题,输出 最后一个 出现次数为1的字符

    今天去面试,遇到一个数据结构题,给定一个字符串,输出 最后一个 出现次数为1的字符 回来研究了下,代码如下: package com.pine.interview.test; import java. ...

  4. ionic1 下拉刷新 上拉加载 功能

    html页面如下 <ion-content> <ion-refresher pulling-text="刷新" on-refresh="search() ...

  5. Java---SSH(MVC)面试题

    1.        谈谈你mvc的理解 MVC是Model-View-Controler的简称.即模型-视图-控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开. MVC中的模型 ...

  6. java死锁小例子

    package cn.com.io.threadDemo.ThreadSyn; /** * 通过两个属性值创建死锁 * 本程序通过两个线程各自锁定一个属性值,这样两个线程都无法结束,造成死锁 * @a ...

  7. Nginx Rewrite详解

    Nginx Rewrite详解 引用链接:http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 原文如下: 在新主机的迁移过程中,最大的困难就是W ...

  8. ffmpeg 时间戳处理

    视频的显示和存放原理 对于一个电影,帧是这样来显示的:I B B P.现在我们需要在显示B帧之前知道P帧中的信息.因此,帧可能会按照这样的方式来存储:IPBB.这就是为什么我们会有一个解码时间戳和一个 ...

  9. python---购物车---更新

    购物车程序更新: 更新商家入口,实现以下功能: 1. 商家能够修改商品价格: 2. 商家能够下线商品: 3. 商家能够增加商品: 4. 商品信息存在文件中 # -*- coding:utf-8 -*- ...

  10. element.dispatchEvent is not a function的解决

    Firebug中的出错提示: element.dispatchEvent is not a function element.dispatchEvent(event); prototype.js (第 ...