index_levedb.go

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()
}

原文地址:https://www.cnblogs.com/zhangboyu/p/7461617.html