feat: 新增 storage 支持数据持久化
This commit is contained in:
parent
1dcbd0a220
commit
f59354db3f
|
@ -0,0 +1,49 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
// NewGlobalData 创建全局数据
|
||||||
|
func NewGlobalData[T any](name string, storage GlobalDataStorage[T]) *GlobalData[T] {
|
||||||
|
data := &GlobalData[T]{
|
||||||
|
name: name,
|
||||||
|
data: storage.Load(name),
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
// GlobalData 全局数据
|
||||||
|
type GlobalData[T any] struct {
|
||||||
|
storage GlobalDataStorage[T] // 存储器
|
||||||
|
name string // 全局数据名称
|
||||||
|
data T // 数据
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetName 获取名称
|
||||||
|
func (slf *GlobalData[T]) GetName() string {
|
||||||
|
return slf.name
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetData 获取数据
|
||||||
|
func (slf *GlobalData[T]) GetData() T {
|
||||||
|
return slf.data
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadData 加载数据
|
||||||
|
func (slf *GlobalData[T]) LoadData(storage GlobalDataStorage[T]) *GlobalData[T] {
|
||||||
|
return LoadGlobalData(slf, storage)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveData 保存数据
|
||||||
|
func (slf *GlobalData[T]) SaveData(storage GlobalDataStorage[T]) *GlobalData[T] {
|
||||||
|
return SaveGlobalData(slf, storage)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle 处理数据
|
||||||
|
func (slf *GlobalData[T]) Handle(handler func(name string, data T)) *GlobalData[T] {
|
||||||
|
handler(slf.GetName(), slf.GetData())
|
||||||
|
return slf
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleWithCallback 处理数据
|
||||||
|
func (slf *GlobalData[T]) HandleWithCallback(handler func(name string, data T) error, callback func(err error)) *GlobalData[T] {
|
||||||
|
callback(handler(slf.GetName(), slf.GetData()))
|
||||||
|
return slf
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
// GlobalDataStorage 全局数据存储器接口
|
||||||
|
type GlobalDataStorage[T any] interface {
|
||||||
|
// Load 加载全局数据
|
||||||
|
// - 当全局数据不存在时,应当返回新的全局数据实例
|
||||||
|
Load(name string) T
|
||||||
|
// Save 保存全局数据
|
||||||
|
Save(name string, data T)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadGlobalData 加载全局数据
|
||||||
|
func LoadGlobalData[T any](globalData *GlobalData[T], storage GlobalDataStorage[T]) *GlobalData[T] {
|
||||||
|
globalData.data = storage.Load(globalData.GetName())
|
||||||
|
return globalData
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveGlobalData 保存全局数据
|
||||||
|
func SaveGlobalData[T any](globalData *GlobalData[T], storage GlobalDataStorage[T]) *GlobalData[T] {
|
||||||
|
storage.Save(globalData.GetName(), globalData.GetData())
|
||||||
|
return globalData
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/kercylan98/minotaur/utils/generic"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewIndexData 创建索引数据
|
||||||
|
func NewIndexData[I generic.Ordered, T any](name string, storage IndexDataStorage[I, T]) *IndexData[I, T] {
|
||||||
|
data := &IndexData[I, T]{
|
||||||
|
name: name,
|
||||||
|
data: map[I]T{},
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
// IndexData 全局数据
|
||||||
|
type IndexData[I generic.Ordered, T any] struct {
|
||||||
|
storage GlobalDataStorage[T] // 存储器
|
||||||
|
name string // 数据组名称
|
||||||
|
data map[I]T // 数据
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetName 获取名称
|
||||||
|
func (slf *IndexData[I, T]) GetName() string {
|
||||||
|
return slf.name
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetData 获取数据
|
||||||
|
func (slf *IndexData[I, T]) GetData(index I) T {
|
||||||
|
return slf.data[index]
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllData 获取所有数据
|
||||||
|
func (slf *IndexData[I, T]) GetAllData() map[I]T {
|
||||||
|
return slf.data
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadData 加载数据
|
||||||
|
func (slf *IndexData[I, T]) LoadData(index I, storage IndexDataStorage[I, T]) *IndexData[I, T] {
|
||||||
|
return LoadIndexData(slf, index, storage)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveData 保存数据
|
||||||
|
func (slf *IndexData[I, T]) SaveData(storage IndexDataStorage[I, T], index I) *IndexData[I, T] {
|
||||||
|
return SaveIndexData(slf, index, storage)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle 处理数据
|
||||||
|
func (slf *IndexData[I, T]) Handle(index I, handler func(name string, index I, data T)) *IndexData[I, T] {
|
||||||
|
handler(slf.GetName(), index, slf.GetData(index))
|
||||||
|
return slf
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleWithCallback 处理数据
|
||||||
|
func (slf *IndexData[I, T]) HandleWithCallback(index I, handler func(name string, index I, data T) error, callback func(err error)) *IndexData[I, T] {
|
||||||
|
callback(handler(slf.GetName(), index, slf.GetData(index)))
|
||||||
|
return slf
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import "github.com/kercylan98/minotaur/utils/generic"
|
||||||
|
|
||||||
|
// IndexDataStorage 全局数据存储器接口
|
||||||
|
type IndexDataStorage[I generic.Ordered, T any] interface {
|
||||||
|
// Load 加载特定索引数据
|
||||||
|
// - 通常情况下当数据不存在时,应当返回空指针
|
||||||
|
Load(name string, index I) T
|
||||||
|
// LoadAll 加载所有数据
|
||||||
|
LoadAll(name string) map[I]T
|
||||||
|
// Save 保存特定索引数据
|
||||||
|
Save(name string, index I, data T)
|
||||||
|
// SaveAll 保存所有数据
|
||||||
|
SaveAll(name string, data map[I]T)
|
||||||
|
// Delete 删除特定索引数据
|
||||||
|
Delete(name string, index I)
|
||||||
|
// DeleteAll 删除所有数据
|
||||||
|
DeleteAll(name string)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadIndexData 加载索引数据
|
||||||
|
func LoadIndexData[I generic.Ordered, T any](indexData *IndexData[I, T], index I, storage IndexDataStorage[I, T]) *IndexData[I, T] {
|
||||||
|
indexData.data[index] = storage.Load(indexData.GetName(), index)
|
||||||
|
return indexData
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadIndexDataAll 加载所有索引数据
|
||||||
|
func LoadIndexDataAll[I generic.Ordered, T any](indexData *IndexData[I, T], storage IndexDataStorage[I, T]) *IndexData[I, T] {
|
||||||
|
indexData.data = storage.LoadAll(indexData.GetName())
|
||||||
|
return indexData
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveIndexData 保存索引数据
|
||||||
|
func SaveIndexData[I generic.Ordered, T any](indexData *IndexData[I, T], index I, storage IndexDataStorage[I, T]) *IndexData[I, T] {
|
||||||
|
storage.Save(indexData.GetName(), index, indexData.GetData(index))
|
||||||
|
return indexData
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveIndexDataALl 保存所有所索引数据
|
||||||
|
func SaveIndexDataALl[I generic.Ordered, T any](indexData *IndexData[I, T], storage IndexDataStorage[I, T]) *IndexData[I, T] {
|
||||||
|
storage.SaveAll(indexData.GetName(), indexData.GetAllData())
|
||||||
|
return indexData
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteIndexData 删除索引数据
|
||||||
|
func DeleteIndexData[I generic.Ordered, T any](indexData *IndexData[I, T], index I, storage IndexDataStorage[I, T]) *IndexData[I, T] {
|
||||||
|
storage.Delete(indexData.GetName(), index)
|
||||||
|
delete(indexData.data, index)
|
||||||
|
return indexData
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteIndexDataAll 删除所有索引数据
|
||||||
|
func DeleteIndexDataAll[I generic.Ordered, T any](indexData *IndexData[I, T], storage IndexDataStorage[I, T]) *IndexData[I, T] {
|
||||||
|
storage.DeleteAll(indexData.GetName())
|
||||||
|
for k := range indexData.data {
|
||||||
|
delete(indexData.data, k)
|
||||||
|
}
|
||||||
|
return indexData
|
||||||
|
}
|
Loading…
Reference in New Issue