1 Star 1 Fork 0

凡卡 / utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
leveldb.go 4.61 KB
一键复制 编辑 原始数据 按行查看 历史
凡卡 提交于 2024-04-24 19:11 . 添加ERROR
package utilsleveldb
import (
"github.com/hyahm/golog"
"github.com/syndtr/goleveldb/leveldb"
"sync"
)
type LevelDB struct {
path string
db *leveldb.DB
tr *leveldb.Transaction
once sync.Once
}
func CreateLevelDB(path string) (*LevelDB, error) {
lldb := LevelDB{
path: path,
once: sync.Once{},
}
err := lldb.InitDB()
if err != nil {
return nil, err
}
return &lldb, nil
}
// 链接leveldb
func (this *LevelDB) InitDB() (err error) {
this.once.Do(func() {
//没有db目录会自动创建
this.db, err = leveldb.OpenFile(this.path, nil)
if err != nil {
return
}
return
})
return
}
/*
保存
*/
func (this *LevelDB) Save(key LeveldbKey, bs *[]byte) error {
if err := checkValueSize(*bs); err != nil {
return err
}
err := this.db.Delete(key.key, nil)
if err != nil {
return err
}
if bs == nil {
err = this.db.Put(key.key, nil, nil)
} else {
err = this.db.Put(key.key, *bs, nil)
}
return err
}
/*
保存 事务处理
*/
func (this *LevelDB) Save_Transaction(key LeveldbKey, bs *[]byte) error {
if err := checkValueSize(*bs); err != nil {
return err
}
err := this.tr.Delete(key.key, nil)
if err != nil {
return err
}
if bs == nil {
err = this.tr.Put(key.key, nil, nil)
} else {
err = this.tr.Put(key.key, *bs, nil)
}
return err
}
/*
保存多条数据
*/
func (this *LevelDB) SaveMore(kvps ...KVPair) error {
err := this.OpenTransaction()
if err != nil {
return err
}
err = this.SaveMore_TransacTion(kvps...)
if err != nil {
this.Discard()
return err
}
err = this.Commit()
if err != nil {
this.Discard()
return err
}
return nil
}
/*
保存多条数据 事务处理
*/
func (this *LevelDB) SaveMore_TransacTion(kvps ...KVPair) error {
var err error
for _, one := range kvps {
if one.IsAddOrDel {
//levedb保存相同的key,原来的key保存的数据不会删除,因此保存之前先删除原来的数据
err = this.tr.Delete(one.Key.key, nil)
if err != nil {
return err
}
err = this.tr.Put(one.Key.key, one.Value, nil)
} else {
err = this.tr.Delete(one.Key.key, nil)
}
if err != nil {
return err
}
}
return nil
}
/*
删除
*/
func (this *LevelDB) Remove(key LeveldbKey) error {
return this.db.Delete(key.key, nil)
}
/*
删除 事务处理
*/
func (this *LevelDB) Remove_Transaction(key LeveldbKey) error {
return this.tr.Delete(key.key, nil)
}
/*
删除多个操作
*/
func (this *LevelDB) RemoveMore(kvps ...KVPair) error {
return this.SaveMore(kvps...)
}
/*
删除多个操作 事务处理
*/
func (this *LevelDB) RemoveMore_Transaction(kvps ...KVPair) error {
return this.SaveMore_TransacTion(kvps...)
}
/*
查找
*/
func (this *LevelDB) Find(key LeveldbKey) (*DBItem, error) {
items, err := this.FindMore(key)
if err != nil {
return nil, err
}
return &items[0], nil
}
/*
查找多条记录
*/
func (this *LevelDB) FindMore(keys ...LeveldbKey) ([]DBItem, error) {
items := make([]DBItem, 0, len(keys))
sn, err := this.db.GetSnapshot()
if err != nil {
return nil, err
}
for _, one := range keys {
value, err := sn.Get(one.key, nil)
if err != nil {
sn.Release()
return nil, err
}
item := DBItem{
Key: one,
Value: value,
}
items = append(items, item)
}
sn.Release()
return items, nil
}
var once = new(sync.Once)
/*
打印所有key
*/
func (this *LevelDB) PrintAll() ([][]byte, error) {
once.Do(func() {
golog.InitLogger("logs", 0, true)
})
iter := this.db.NewIterator(nil, nil)
for iter.Next() {
golog.Info("key:%+v value:%+v", iter.Key(), len(iter.Value()))
// fmt.Println("key", hex.EncodeToString(iter.Key()), "value", hex.EncodeToString(iter.Value()))
//fmt.Println("key", iter.Key(), "value", iter.Value())
}
golog.Info("end---------------------")
iter.Release()
err := iter.Error()
return nil, err
}
/*
检查key是否存在
@return bool true:存在;false:不存在;
*/
func (this *LevelDB) Has(key LeveldbKey) (bool, error) {
sn, err := this.db.GetSnapshot()
if err != nil {
return false, err
}
has, err := sn.Has(key.key, nil)
sn.Release()
return has, err
}
/*
获取数据库连接
*/
func (this *LevelDB) GetDB() *leveldb.DB {
return this.db
}
/*
关闭leveldb连接
*/
func (this *LevelDB) Close() {
this.db.Close()
}
/*
开启事务
*/
func (this *LevelDB) OpenTransaction() error {
var err error
this.tr, err = this.db.OpenTransaction()
return err
}
/*
提交事务
*/
func (this *LevelDB) Commit() error {
err := this.tr.Commit()
if err != nil {
this.tr.Discard()
return err
}
return nil
}
/*
回滚事务
*/
func (this *LevelDB) Discard() {
this.tr.Discard()
}
/*
获取数据库所在磁盘路径
*/
func (this *LevelDB) GetPath() string {
return this.path
}
Go
1
https://gitee.com/prestonTao/utils.git
git@gitee.com:prestonTao/utils.git
prestonTao
utils
utils
a26ca6af1029

搜索帮助