代码拉取完成,页面将自动刷新
同步操作将从 huangpeizhi2018/rosedb 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package rosedb
import (
"github.com/roseduan/rosedb/ds/list"
"github.com/roseduan/rosedb/index"
"github.com/roseduan/rosedb/utils"
"io"
"sort"
"strconv"
"strings"
"time"
)
// DataType 数据类型定义
type DataType = uint16
// 数据类型定义
const (
String DataType = iota
List
Hash
Set
ZSet
)
// 字符串相关操作标识
const (
StringSet uint16 = iota
StringRem
)
// 列表相关操作标识
const (
ListLPush uint16 = iota
ListRPush
ListLPop
ListRPop
ListLRem
ListLInsert
ListLSet
ListLTrim
)
// 哈希相关操作标识
const (
HashHSet uint16 = iota
HashHDel
)
// 集合相关操作标识
const (
SetSAdd uint16 = iota
SetSRem
SetSMove
)
// 有序集合相关操作标识
const (
ZSetZAdd uint16 = iota
ZSetZRem
)
// buildStringIndex 建立字符串索引
func (db *RoseDB) buildStringIndex(idx *index.Indexer, opt uint16) {
if db.listIndex == nil || idx == nil {
return
}
now := uint32(time.Now().Unix())
if deadline, exist := db.expires[string(idx.Meta.Key)]; exist && deadline <= now {
return
}
switch opt {
case StringSet:
db.strIndex.idxList.Put(idx.Meta.Key, idx)
case StringRem:
db.strIndex.idxList.Remove(idx.Meta.Key)
}
}
// buildListIndex 建立列表索引
func (db *RoseDB) buildListIndex(idx *index.Indexer, opt uint16) {
if db.listIndex == nil || idx == nil {
return
}
key := string(idx.Meta.Key)
switch opt {
case ListLPush:
db.listIndex.indexes.LPush(key, idx.Meta.Value)
case ListLPop:
db.listIndex.indexes.LPop(key)
case ListRPush:
db.listIndex.indexes.RPush(key, idx.Meta.Value)
case ListRPop:
db.listIndex.indexes.RPop(key)
case ListLRem:
if count, err := strconv.Atoi(string(idx.Meta.Extra)); err == nil {
db.listIndex.indexes.LRem(key, idx.Meta.Value, count)
}
case ListLInsert:
extra := string(idx.Meta.Extra)
s := strings.Split(extra, ExtraSeparator)
if len(s) == 2 {
pivot := []byte(s[0])
if opt, err := strconv.Atoi(s[1]); err == nil {
db.listIndex.indexes.LInsert(string(idx.Meta.Key), list.InsertOption(opt), pivot, idx.Meta.Value)
}
}
case ListLSet:
if i, err := strconv.Atoi(string(idx.Meta.Extra)); err == nil {
db.listIndex.indexes.LSet(key, i, idx.Meta.Value)
}
case ListLTrim:
extra := string(idx.Meta.Extra)
s := strings.Split(extra, ExtraSeparator)
if len(s) == 2 {
start, _ := strconv.Atoi(s[0])
end, _ := strconv.Atoi(s[1])
db.listIndex.indexes.LTrim(string(idx.Meta.Key), start, end)
}
}
}
// buildHashIndex 建立哈希索引
func (db *RoseDB) buildHashIndex(idx *index.Indexer, opt uint16) {
if db.hashIndex == nil || idx == nil {
return
}
key := string(idx.Meta.Key)
switch opt {
case HashHSet:
db.hashIndex.indexes.HSet(key, string(idx.Meta.Extra), idx.Meta.Value)
case HashHDel:
db.hashIndex.indexes.HDel(key, string(idx.Meta.Extra))
}
}
// buildSetIndex 建立集合索引
func (db *RoseDB) buildSetIndex(idx *index.Indexer, opt uint16) {
if db.hashIndex == nil || idx == nil {
return
}
key := string(idx.Meta.Key)
switch opt {
case SetSAdd:
db.setIndex.indexes.SAdd(key, idx.Meta.Value)
case SetSRem:
db.setIndex.indexes.SRem(key, idx.Meta.Value)
case SetSMove:
extra := idx.Meta.Extra
db.setIndex.indexes.SMove(key, string(extra), idx.Meta.Value)
}
}
// buildZsetIndex 建立有序集合索引
func (db *RoseDB) buildZsetIndex(idx *index.Indexer, opt uint16) {
if db.hashIndex == nil || idx == nil {
return
}
key := string(idx.Meta.Key)
switch opt {
case ZSetZAdd:
if score, err := utils.StrToFloat64(string(idx.Meta.Extra)); err == nil {
db.zsetIndex.indexes.ZAdd(key, score, string(idx.Meta.Value))
}
case ZSetZRem:
db.zsetIndex.indexes.ZRem(key, string(idx.Meta.Value))
}
}
// loadIdxFromFiles 从文件中加载String、List、Hash、Set、ZSet索引
func (db *RoseDB) loadIdxFromFiles() error {
if db.archFiles == nil && db.activeFile == nil {
return nil
}
var fileIds []int
dbFile := make(ArchivedFiles)
for k, v := range db.archFiles {
dbFile[k] = v
fileIds = append(fileIds, int(k))
}
dbFile[db.activeFileId] = db.activeFile
fileIds = append(fileIds, int(db.activeFileId))
sort.Ints(fileIds)
for i := 0; i < len(fileIds); i++ {
fid := uint32(fileIds[i])
df := dbFile[fid]
var offset int64 = 0
for offset <= db.config.BlockSize {
if e, err := df.Read(offset); err == nil {
idx := &index.Indexer{
Meta: e.Meta,
FileId: fid,
EntrySize: e.Size(),
Offset: offset,
}
offset += int64(e.Size())
if err := db.buildIndex(e, idx); err != nil {
return err
}
} else {
if err == io.EOF {
break
}
return err
}
}
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。