From 0d1a985e691fdc4f6af7bc4c23fab7687fc86238 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Thu, 20 Jul 2023 09:50:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20storage=20=E8=A6=81=E6=B1=82=20Load?= =?UTF-8?q?=20=E7=AD=89=E5=87=BD=E6=95=B0=E8=BF=94=E5=9B=9E=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++- utils/storage/global_data.go | 20 +++++++---- utils/storage/global_data_storage.go | 2 +- utils/storage/index_data.go | 34 ++++++++++++------- utils/storage/index_data_storage.go | 4 +-- utils/storage/storage.go | 26 -------------- utils/storage/storages/global_data_file.go | 7 ++-- .../storage/storages/global_data_file_test.go | 10 +++--- utils/storage/storages/index_data_file.go | 13 ++++--- .../storage/storages/index_data_file_test.go | 6 ++-- 10 files changed, 59 insertions(+), 68 deletions(-) delete mode 100644 utils/storage/storage.go diff --git a/README.md b/README.md index 4b2d07d..7d6fa25 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,12 @@ mindmap root((Minotaur)) /component 通用组件接口定义 /components 通用组件内置实现 - /config 针对配置导表的配置加载 + /configuration 配置管理功能 /game 游戏通用功能接口定义 /builtin 游戏通用功能内置实现 /notify 通知功能接口定义 /planner 策划相关工具目录 - /configexport 配置导表功能实现 + /pce 配置导表功能实现 /report 数据埋点及上报功能 /server 网络服务器支持 /cross 内置跨服功能实现 @@ -113,7 +113,6 @@ func main() { ``` 其他的一些支持事件的结构体(非所有): - `game.Room` 游戏房间实现 - - `synchronization.Map` 并发安全的`Map`实现 - ... ### 可选项 大部分的 `New` 函数均可使用可选项进行创建,具体函数前缀通常为 `With`。 diff --git a/utils/storage/global_data.go b/utils/storage/global_data.go index 63eb32c..54ebaaf 100644 --- a/utils/storage/global_data.go +++ b/utils/storage/global_data.go @@ -1,14 +1,17 @@ package storage // NewGlobalData 创建全局数据 -func NewGlobalData[T any](name string, storage GlobalDataStorage[T]) *GlobalData[T] { +func NewGlobalData[T any](name string, storage GlobalDataStorage[T]) (*GlobalData[T], error) { data := &GlobalData[T]{ storage: storage, name: name, - data: storage.Load(name), } - globalDataSaveHandles = append(globalDataSaveHandles, data.SaveData) - return data + var err error + data.data, err = storage.Load(name) + if err != nil { + return nil, err + } + return data, nil } // GlobalData 全局数据 @@ -29,8 +32,13 @@ func (slf *GlobalData[T]) GetData() T { } // LoadData 加载数据 -func (slf *GlobalData[T]) LoadData() { - slf.data = slf.storage.Load(slf.GetName()) +func (slf *GlobalData[T]) LoadData() error { + data, err := slf.storage.Load(slf.GetName()) + if err != nil { + return err + } + slf.data = data + return nil } // SaveData 保存数据 diff --git a/utils/storage/global_data_storage.go b/utils/storage/global_data_storage.go index 872c368..8103ecd 100644 --- a/utils/storage/global_data_storage.go +++ b/utils/storage/global_data_storage.go @@ -4,7 +4,7 @@ package storage type GlobalDataStorage[T any] interface { // Load 加载全局数据 // - 当全局数据不存在时,应当返回新的全局数据实例 - Load(name string) T + Load(name string) (T, error) // Save 保存全局数据 Save(name string, data T) error } diff --git a/utils/storage/index_data.go b/utils/storage/index_data.go index 71ac801..c81f8cb 100644 --- a/utils/storage/index_data.go +++ b/utils/storage/index_data.go @@ -6,13 +6,17 @@ import ( ) // NewIndexData 创建索引数据 -func NewIndexData[I generic.Ordered, T IndexDataItem[I]](name string, storage IndexDataStorage[I, T]) *IndexData[I, T] { +func NewIndexData[I generic.Ordered, T IndexDataItem[I]](name string, storage IndexDataStorage[I, T]) (*IndexData[I, T], error) { data := &IndexData[I, T]{ storage: storage, name: name, - data: storage.LoadAll(name), } - return data + var err error + data.data, err = storage.LoadAll(name) + if err != nil { + return nil, err + } + return data, nil } // IndexData 全局数据 @@ -29,11 +33,7 @@ func (slf *IndexData[I, T]) GetName() string { // GetData 获取数据 func (slf *IndexData[I, T]) GetData(index I) T { - data, exist := slf.data[index] - if !exist { - slf.LoadData(index) - data = slf.data[index] - } + data, _ := slf.data[index] return data } @@ -43,13 +43,23 @@ func (slf *IndexData[I, T]) GetAllData() map[I]T { } // LoadData 加载数据 -func (slf *IndexData[I, T]) LoadData(index I) { - slf.data[index] = slf.storage.Load(slf.GetName(), index) +func (slf *IndexData[I, T]) LoadData(index I) error { + data, err := slf.storage.Load(slf.GetName(), index) + if err != nil { + return err + } + slf.data[index] = data + return nil } // LoadAllData 加载所有数据 -func (slf *IndexData[I, T]) LoadAllData() { - slf.data = slf.storage.LoadAll(slf.GetName()) +func (slf *IndexData[I, T]) LoadAllData() error { + data, err := slf.storage.LoadAll(slf.GetName()) + if err != nil { + return err + } + slf.data = data + return nil } // SaveData 保存数据 diff --git a/utils/storage/index_data_storage.go b/utils/storage/index_data_storage.go index 4ef0d74..1edfd89 100644 --- a/utils/storage/index_data_storage.go +++ b/utils/storage/index_data_storage.go @@ -9,9 +9,9 @@ import ( type IndexDataStorage[I generic.Ordered, T IndexDataItem[I]] interface { // Load 加载特定索引数据 // - 通常情况下当数据不存在时,应当返回空指针 - Load(name string, index I) T + Load(name string, index I) (T, error) // LoadAll 加载所有数据 - LoadAll(name string) map[I]T + LoadAll(name string) (map[I]T, error) // Save 保存特定索引数据 Save(name string, index I, data T) error // SaveAll 保存所有数据 diff --git a/utils/storage/storage.go b/utils/storage/storage.go deleted file mode 100644 index 608b959..0000000 --- a/utils/storage/storage.go +++ /dev/null @@ -1,26 +0,0 @@ -package storage - -import "time" - -var ( - // globalDataSaveHandles 全局数据保存句柄 - globalDataSaveHandles []func() error -) - -// SaveAll 保存所有数据 -// - errorHandle 错误处理中如果返回 false 将重试,否则跳过当前保存下一个 -func SaveAll(errorHandle func(err error) bool, retryInterval time.Duration) { - var err error - for _, handle := range globalDataSaveHandles { - for { - if err = handle(); err != nil { - if !errorHandle(err) { - time.Sleep(retryInterval) - continue - } - break - } - break - } - } -} diff --git a/utils/storage/storages/global_data_file.go b/utils/storage/storages/global_data_file.go index 8d1e713..bfe63b4 100644 --- a/utils/storage/storages/global_data_file.go +++ b/utils/storage/storages/global_data_file.go @@ -43,14 +43,13 @@ type GlobalDataFileStorage[T any] struct { } // Load 从文件中加载数据,如果文件不存在则使用 generate 生成数据 -func (slf *GlobalDataFileStorage[T]) Load(name string) T { +func (slf *GlobalDataFileStorage[T]) Load(name string) (T, error) { bytes, err := file.ReadOnce(filepath.Join(slf.dir, fmt.Sprintf("%s.%s", name, slf.suffix))) if err != nil { - return slf.generate(name) + return slf.generate(name), nil } var data = slf.generate(name) - _ = slf.decoder(bytes, data) - return data + return data, slf.decoder(bytes, data) } // Save 将数据保存到文件中 diff --git a/utils/storage/storages/global_data_file_test.go b/utils/storage/storages/global_data_file_test.go index 9241893..6ff9996 100644 --- a/utils/storage/storages/global_data_file_test.go +++ b/utils/storage/storages/global_data_file_test.go @@ -15,28 +15,28 @@ type GlobalData struct { func TestGlobalDataFileStorage_Save(t *testing.T) { Convey("TestGlobalDataFileStorage_Save", t, func() { - data := storage.NewGlobalData[*GlobalData]("global_data_file_test", storages.NewGlobalDataFileStorage[*GlobalData]("./example-data", func(name string) *GlobalData { + data, err := storage.NewGlobalData[*GlobalData]("global_data_file_test", storages.NewGlobalDataFileStorage[*GlobalData]("./example-data", func(name string) *GlobalData { return &GlobalData{ CreateAt: time.Now(), } })) + So(err, ShouldBeNil) data.Handle(func(name string, data *GlobalData) { data.TotalCount = 10 }) - if err := data.SaveData(); err != nil { - t.Fatal(err) - } + So(data.SaveData(), ShouldBeNil) So(data.GetData().TotalCount, ShouldEqual, 10) }) } func TestGlobalDataFileStorage_Load(t *testing.T) { Convey("TestGlobalDataFileStorage_Load", t, func() { - data := storage.NewGlobalData[*GlobalData]("global_data_file_test", storages.NewGlobalDataFileStorage[*GlobalData]("./example-data", func(name string) *GlobalData { + data, err := storage.NewGlobalData[*GlobalData]("global_data_file_test", storages.NewGlobalDataFileStorage[*GlobalData]("./example-data", func(name string) *GlobalData { return &GlobalData{ CreateAt: time.Now(), } })) + So(err, ShouldBeNil) So(data.GetData().TotalCount, ShouldEqual, 10) }) } diff --git a/utils/storage/storages/index_data_file.go b/utils/storage/storages/index_data_file.go index 4459dae..aaa67f2 100644 --- a/utils/storage/storages/index_data_file.go +++ b/utils/storage/storages/index_data_file.go @@ -44,21 +44,20 @@ type IndexDataFileStorage[I generic.Ordered, T storage.IndexDataItem[I]] struct decoder FileStorageDecoder[T] } -func (slf *IndexDataFileStorage[I, T]) Load(name string, index I) T { +func (slf *IndexDataFileStorage[I, T]) Load(name string, index I) (T, error) { bytes, err := file.ReadOnce(filepath.Join(slf.dir, fmt.Sprintf(indexNameFormat, name, index, slf.suffix))) if err != nil { - return slf.generate(name, index) + return slf.generate(name, index), nil } var data = slf.generate(name, index) - _ = slf.decoder(bytes, data) - return data + return data, slf.decoder(bytes, data) } -func (slf *IndexDataFileStorage[I, T]) LoadAll(name string) map[I]T { +func (slf *IndexDataFileStorage[I, T]) LoadAll(name string) (map[I]T, error) { var result = make(map[I]T) files, err := os.ReadDir(slf.dir) if err != nil { - return result + return result, err } for _, entry := range files { if entry.IsDir() || !strings.HasPrefix(entry.Name(), name) || !strings.HasSuffix(entry.Name(), slf.suffix) { @@ -73,7 +72,7 @@ func (slf *IndexDataFileStorage[I, T]) LoadAll(name string) map[I]T { result[data.GetIndex()] = data } } - return result + return result, err } func (slf *IndexDataFileStorage[I, T]) Save(name string, index I, data T) error { diff --git a/utils/storage/storages/index_data_file_test.go b/utils/storage/storages/index_data_file_test.go index 5e12649..fc0b529 100644 --- a/utils/storage/storages/index_data_file_test.go +++ b/utils/storage/storages/index_data_file_test.go @@ -18,11 +18,12 @@ func (slf *IndexData[I]) GetIndex() I { func TestIndexDataFileStorage_Save(t *testing.T) { Convey("TestIndexDataFileStorage_Save", t, func() { - data := storage.NewIndexData[string, *IndexData[string]]("index_data_file_test", storages.NewIndexDataFileStorage[string, *IndexData[string]]("./example-data", func(name string, index string) *IndexData[string] { + data, err := storage.NewIndexData[string, *IndexData[string]]("index_data_file_test", storages.NewIndexDataFileStorage[string, *IndexData[string]]("./example-data", func(name string, index string) *IndexData[string] { return &IndexData[string]{ID: index} }, func(name string) *IndexData[string] { return new(IndexData[string]) })) + So(err, ShouldBeNil) data.Handle("INDEX_001", func(name string, index string, data *IndexData[string]) { data.Value = 10 }) @@ -35,11 +36,12 @@ func TestIndexDataFileStorage_Save(t *testing.T) { func TestIndexDataFileStorage_Load(t *testing.T) { Convey("TestIndexDataFileStorage_Load", t, func() { - data := storage.NewIndexData[string, *IndexData[string]]("index_data_file_test", storages.NewIndexDataFileStorage[string, *IndexData[string]]("./example-data", func(name string, index string) *IndexData[string] { + data, err := storage.NewIndexData[string, *IndexData[string]]("index_data_file_test", storages.NewIndexDataFileStorage[string, *IndexData[string]]("./example-data", func(name string, index string) *IndexData[string] { return &IndexData[string]{ID: index} }, func(name string) *IndexData[string] { return new(IndexData[string]) })) + So(err, ShouldBeNil) So(data.GetData("INDEX_001").Value, ShouldEqual, 10) }) }