index_levedb.go
2024-08-25 06:45:24
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()
}
最新文章
- iOS开发UI中懒加载的使用方法
- beautifulsoup测试
- Android自动化压力测试之Monkey Test Android常见的错误类型及黑白名单的使用方法(四)
- 监控系统 - check_mk_agent
- Linux命令:tail命令详解
- cocos2d-x3.0 Physics新的物理引擎
- Gengxin讲STL系列——String
- Mozilla5.0的含义
- 使用SplitContainer来实现隐藏窗口的部分内容(转)
- Win10下JDK下载与环境变量配置
- 数独计算(C#)
- MySQL初识
- Python介绍及环境配置
- 采用xtrabackup部署主从同步
- qsort代码(pascal/c/c++)与思想及扩展(随机化,TopK)
- mybatis中批量插入以及更新
- 超多的CSS3圆角渐变网页按钮
- 笔记本电脑CPU低压、标压、高压的区别
- MySQL InnoDB的一些参数说明
- TE7下的创建组件AxHost失败