This commit is contained in:
sk 2024-04-15 09:53:58 +08:00
parent 44da7c7b85
commit 596cb051fd
2 changed files with 188 additions and 0 deletions

122
srvdata/dataloader.go Normal file
View File

@ -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
}

66
srvdata/datamgr.go Normal file
View File

@ -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
}