You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
2.8 KiB
143 lines
2.8 KiB
package internal
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
"sync"
|
|
"tools/logic/cutil"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
const SPLIT = 100000
|
|
const DATA_SOURCE_FILE = "internal.json"
|
|
|
|
type Internal struct {
|
|
tableName string
|
|
Index int64
|
|
IdList map[string]int64
|
|
}
|
|
|
|
type Super struct {
|
|
sync.Mutex
|
|
DataSource map[string]*Internal
|
|
IndexMapping map[string]int64
|
|
Split int64
|
|
}
|
|
|
|
var dataSource *Super
|
|
|
|
func init() {
|
|
Load()
|
|
}
|
|
func Load() {
|
|
dataSource = &Super{DataSource: make(map[string]*Internal), IndexMapping: make(map[string]int64)}
|
|
//load
|
|
data, err := os.ReadFile(DATA_SOURCE_FILE)
|
|
if err != nil {
|
|
fmt.Println("load data file error")
|
|
return
|
|
}
|
|
|
|
err = json.Unmarshal(data, &dataSource)
|
|
if err != nil {
|
|
fmt.Println("unmarshal data error")
|
|
return
|
|
}
|
|
}
|
|
|
|
func GetInternalId(ctx *gin.Context) {
|
|
|
|
tableName := ctx.Request.Header.Get("tableName")
|
|
idstr := ctx.Request.Header.Get("ids")
|
|
ids := strings.Split(idstr, ",")
|
|
dataSource.Lock()
|
|
defer dataSource.Unlock()
|
|
ret, ok := dataSource.DataSource[tableName]
|
|
if ok {
|
|
list := ret.IdList
|
|
add := false
|
|
for _, id := range ids {
|
|
_, ok := list[id]
|
|
if ok {
|
|
continue
|
|
}
|
|
ret.Index++ //新的行
|
|
ret.IdList[id] = ret.Index
|
|
add = true
|
|
}
|
|
if add {
|
|
save()
|
|
}
|
|
ctx.JSON(200, buildRet(ids, ret.IdList))
|
|
} else {
|
|
//有新表了
|
|
var split = dataSource.Split
|
|
newIndex := split + SPLIT
|
|
dataSource.Split = newIndex
|
|
dataSource.IndexMapping[tableName] = newIndex
|
|
|
|
idmap := Internal{tableName: tableName, IdList: make(map[string]int64)}
|
|
|
|
for _, id := range ids {
|
|
newIndex++
|
|
idmap.IdList[id] = newIndex
|
|
}
|
|
idmap.Index = newIndex
|
|
dataSource.DataSource[tableName] = &idmap
|
|
save()
|
|
ctx.JSON(200, buildRet(ids, idmap.IdList))
|
|
}
|
|
}
|
|
|
|
func buildRet(ids []string, IdList map[string]int64) []int64 {
|
|
var its []int64
|
|
for i := 0; i < len(ids); i++ {
|
|
var t = ids[i]
|
|
var it = IdList[t]
|
|
its = append(its, it)
|
|
}
|
|
return its
|
|
}
|
|
|
|
func save() {
|
|
data, _ := json.MarshalIndent(dataSource, "", "\t\t")
|
|
err := cutil.SaveFile(DATA_SOURCE_FILE, data)
|
|
if err != nil {
|
|
fmt.Printf("save internal data file error %d\n", err)
|
|
return
|
|
}
|
|
//push()
|
|
}
|
|
|
|
func AuthInternalId(ctx *gin.Context) {
|
|
// 文件全路径名
|
|
pFile, err := os.Open(DATA_SOURCE_FILE)
|
|
if err != nil {
|
|
_ = fmt.Errorf("打开文件失败,filename=%v, err=%v", DATA_SOURCE_FILE, err)
|
|
return
|
|
}
|
|
defer func(pFile *os.File) {
|
|
err := pFile.Close()
|
|
if err != nil {
|
|
_ = fmt.Errorf("关闭文件失败,filename=%v, err=%v", DATA_SOURCE_FILE, err)
|
|
}
|
|
}(pFile)
|
|
md5h := md5.New()
|
|
io.Copy(md5h, pFile)
|
|
code := hex.EncodeToString(md5h.Sum(nil))
|
|
ctx.JSON(200, code)
|
|
}
|
|
|
|
func push() {
|
|
url := ""
|
|
data, _ := json.MarshalIndent(dataSource, "", "\t\t")
|
|
st := string(data)
|
|
cutil.Post(url, st)
|
|
|
|
}
|
|
|