diff --git a/utils/storage/index_data.go b/utils/storage/index_data.go index c81f8cb..2b01480 100644 --- a/utils/storage/index_data.go +++ b/utils/storage/index_data.go @@ -2,7 +2,6 @@ package storage import ( "github.com/kercylan98/minotaur/utils/generic" - "time" ) // NewIndexData 创建索引数据 @@ -69,8 +68,8 @@ func (slf *IndexData[I, T]) SaveData(index I) error { // SaveAllData 保存所有数据 // - errHandle 错误处理中如果返回 false 将重试,否则跳过当前保存下一个 -func (slf *IndexData[I, T]) SaveAllData(errHandle func(err error) bool, retryInterval time.Duration) { - slf.storage.SaveAll(slf.GetName(), slf.GetAllData(), errHandle, retryInterval) +func (slf *IndexData[I, T]) SaveAllData() error { + return slf.storage.SaveAll(slf.GetName(), slf.GetAllData()) } // DeleteData 删除数据 diff --git a/utils/storage/index_data_storage.go b/utils/storage/index_data_storage.go index 1edfd89..f3a1160 100644 --- a/utils/storage/index_data_storage.go +++ b/utils/storage/index_data_storage.go @@ -2,7 +2,6 @@ package storage import ( "github.com/kercylan98/minotaur/utils/generic" - "time" ) // IndexDataStorage 全局数据存储器接口 @@ -15,7 +14,7 @@ type IndexDataStorage[I generic.Ordered, T IndexDataItem[I]] interface { // Save 保存特定索引数据 Save(name string, index I, data T) error // SaveAll 保存所有数据 - SaveAll(name string, data map[I]T, errHandle func(err error) bool, retryInterval time.Duration) + SaveAll(name string, data map[I]T) error // Delete 删除特定索引数据 Delete(name string, index I) // DeleteAll 删除所有数据 diff --git a/utils/storage/storages/index_data_file.go b/utils/storage/storages/index_data_file.go index aaa67f2..d2ab42a 100644 --- a/utils/storage/storages/index_data_file.go +++ b/utils/storage/storages/index_data_file.go @@ -8,14 +8,14 @@ import ( "os" "path/filepath" "strings" - "time" ) const ( // IndexDataFileDefaultSuffix 是 IndexDataFileStorage 的文件默认后缀 IndexDataFileDefaultSuffix = "stock" - indexNameFormat = "%s.%v.%s" + indexNameFormat = "%s.%v.%s" + indexNameFormatTemp = "%s.%v.%s.temp" ) // NewIndexDataFileStorage 创建索引数据文件存储器 @@ -83,19 +83,30 @@ func (slf *IndexDataFileStorage[I, T]) Save(name string, index I, data T) error return file.WriterFile(filepath.Join(slf.dir, fmt.Sprintf(indexNameFormat, name, index, slf.suffix)), bytes) } -func (slf *IndexDataFileStorage[I, T]) SaveAll(name string, data map[I]T, errHandle func(err error) bool, retryInterval time.Duration) { +func (slf *IndexDataFileStorage[I, T]) SaveAll(name string, data map[I]T) error { + var temps = make([]string, 0, len(data)) + defer func() { + for _, temp := range temps { + _ = os.Remove(temp) + } + }() for index, data := range data { - for { - if err := slf.Save(name, index, data); err != nil { - if !errHandle(err) { - time.Sleep(retryInterval) - continue - } - break - } - break + bytes, err := slf.encoder(data) + if err != nil { + return err + } + path := filepath.Join(slf.dir, fmt.Sprintf(indexNameFormatTemp, name, index, slf.suffix)) + temps = append(temps, path) + if err = file.WriterFile(path, bytes); err != nil { + return err } } + for _, temp := range temps { + if err := os.Rename(temp, strings.TrimSuffix(temp, ".temp")); err != nil { + return err + } + } + return nil } func (slf *IndexDataFileStorage[I, T]) Delete(name string, index I) {