game_sync/srvdata/dataloader.go

123 lines
2.0 KiB
Go

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
}