From 596cb051fdab93d34386b59c3f21942e0d662ed6 Mon Sep 17 00:00:00 2001 From: sk <123456@qq.com> Date: Mon, 15 Apr 2024 09:53:58 +0800 Subject: [PATCH] init --- srvdata/dataloader.go | 122 ++++++++++++++++++++++++++++++++++++++++++ srvdata/datamgr.go | 66 +++++++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 srvdata/dataloader.go create mode 100644 srvdata/datamgr.go diff --git a/srvdata/dataloader.go b/srvdata/dataloader.go new file mode 100644 index 0000000..d7fc87b --- /dev/null +++ b/srvdata/dataloader.go @@ -0,0 +1,122 @@ +package srvdata + +import ( + "crypto/md5" + "encoding/hex" + "errors" + "os" +) + +var fileSignMap = make(map[string]string) + +type DataLoader interface { + Load(fileFullPath string) error + Reload(fileFullPath string) error +} + +type DataHolder interface { + unmarshal([]byte) error + reunmarshal([]byte) error +} + +type JsonDataLoader struct { + dh DataHolder +} + +func (this *JsonDataLoader) Load(fileFullPath string) error { + buf, err := os.ReadFile(fileFullPath) + if err != nil { + return err + } + + h := md5.New() + _, err = h.Write(buf) + if err != nil { + return err + } + fileSign := hex.EncodeToString(h.Sum(nil)) + fileSignMap[fileFullPath] = fileSign + + if this.dh != nil { + err = this.dh.unmarshal(buf) + } + + return err +} + +func (this *JsonDataLoader) Reload(fileFullPath string) error { + buf, err := os.ReadFile(fileFullPath) + if err != nil { + return err + } + + h := md5.New() + _, err = h.Write(buf) + if err != nil { + return err + } + fileSign := hex.EncodeToString(h.Sum(nil)) + if preSign, exist := fileSignMap[fileFullPath]; exist { + if preSign == fileSign { + return nil + } + } + fileSignMap[fileFullPath] = fileSign + + if this.dh != nil { + err = this.dh.reunmarshal(buf) + } + + return err +} + +type ProtobufDataLoader struct { + dh DataHolder +} + +func (this *ProtobufDataLoader) Load(fileFullPath string) error { + buf, err := os.ReadFile(fileFullPath) + if err != nil { + return err + } + + h := md5.New() + _, err = h.Write(buf) + if err != nil { + return err + } + fileSign := hex.EncodeToString(h.Sum(nil)) + fileSignMap[fileFullPath] = fileSign + + if this.dh != nil { + err = this.dh.unmarshal(buf) + } + + return err +} + +func (this *ProtobufDataLoader) Reload(fileFullPath string) error { + buf, err := os.ReadFile(fileFullPath) + if err != nil { + return err + } + + h := md5.New() + _, err = h.Write(buf) + if err != nil { + return err + } + fileSign := hex.EncodeToString(h.Sum(nil)) + if preSign, exist := fileSignMap[fileFullPath]; exist { + if preSign == fileSign { + return errors.New("content no modify") + } + } + fileSignMap[fileFullPath] = fileSign + + if this.dh != nil { + err = this.dh.reunmarshal(buf) + } + + return err +} diff --git a/srvdata/datamgr.go b/srvdata/datamgr.go new file mode 100644 index 0000000..e856b15 --- /dev/null +++ b/srvdata/datamgr.go @@ -0,0 +1,66 @@ +package srvdata + +import ( + "strings" +) + +var DataMgr = &dataMgr{ + loaders: make(map[string]DataLoader), + cacheGameFreeId: make(map[int32]CacheGameType), +} + +type dataMgr struct { + loaders map[string]DataLoader + cacheGameFreeId map[int32]CacheGameType +} +type CacheGameType struct { + Ids []int32 + GameType int32 +} + +func (this *dataMgr) RegisteLoader(name string, loader DataLoader) { + this.loaders[strings.ToLower(name)] = loader +} + +func (this *dataMgr) GetLoader(name string) DataLoader { + if loader, exist := this.loaders[strings.ToLower(name)]; exist { + return loader + } + return nil +} + +func (this *dataMgr) GetGameFreeIds(gameId, gameMode int32) (ids []int32, gameType int32) { + key := gameId<<16 | gameMode + if data, exist := this.cacheGameFreeId[key]; exist { + return data.Ids, data.GameType + } else { + for _, dbGameFree := range PBDB_GameFreeMgr.Datas.Arr { + if dbGameFree.GetGameId() == gameId && dbGameFree.GetGameMode() == gameMode { + ids = append(ids, dbGameFree.GetId()) + gameType = dbGameFree.GetGameType() + } + } + this.cacheGameFreeId[key] = CacheGameType{Ids: ids, GameType: gameType} + } + return +} + +// DataMgrAfter 配置文件监听器,这个加载数据会在DataMgr之后 +var DataMgrAfter = &dataMgrAfter{ + loaders: make(map[string][]DataLoader), +} + +type dataMgrAfter struct { + loaders map[string][]DataLoader +} + +func (this *dataMgrAfter) RegisterLoader(name string, loader DataLoader) { + this.loaders[strings.ToLower(name)] = append(this.loaders[strings.ToLower(name)], loader) +} + +func (this *dataMgrAfter) GetLoader(name string) []DataLoader { + if loader, exist := this.loaders[strings.ToLower(name)]; exist { + return loader + } + return nil +}