NLDClient-yudde/ProjectNLD/Assets/Editor/Tools/DBTools.cs

461 lines
18 KiB
C#
Raw Normal View History

2023-08-22 19:08:45 +08:00
//////////////////////////////////////////////////////////////////////////
//
// 文件Assets/Editor/Tools/DBTools.cs
// 作者Xoen Xie
// 时间2023/06/19
// 描述db code tools
// 说明:
//
//////////////////////////////////////////////////////////////////////////
using UnityEditor;
using UnityEngine;
using System.IO;
using System.Xml;
using System.Text;
2026-01-08 13:57:00 +08:00
using cfg.ErrorCfg;
using System;
2023-08-22 19:08:45 +08:00
public static class DBTools
{
2024-01-30 12:44:07 +08:00
private static string SERVER_DIR = Application.dataPath + $"/../../../NLDServer";
2023-08-22 19:08:45 +08:00
private static string DB_DEF_PATH = SERVER_DIR + "/common/db/db_def.go";
2026-01-08 13:57:00 +08:00
static string PROTO_DIR = Application.dataPath + "/../../../NLDMisc/proto/";
2023-08-22 19:08:45 +08:00
2026-01-08 13:57:00 +08:00
[MenuItem("Tools/*配置工具/错误码比对", false, (int)NLDMenuID.ErrorCodeCompare)]
public static void ErrorCodeCompare()
2023-08-22 19:08:45 +08:00
{
2026-01-08 13:57:00 +08:00
var text = File.ReadAllText(Application.dataPath + "/Config/Data/errorcfg_errorlogcfg.json");
var json = SimpleJSON.JSON.Parse(text);
var ecfg = new ErrorLogCfg(json);
var protoText = File.ReadAllLines(PROTO_DIR + "common.proto");
var outString = "";
bool Check = false;
for(int i = 0; i < protoText.Length; i ++) {
if(!Check) {
if(protoText[i].Contains("enum OpResult {")) {
Check = true;
}
} else {
if(protoText[i].Contains("}")) {
break;
}
var txt = protoText[i].Replace(" ", "");
if(txt.Contains("=") && txt.Contains(";")) {
int start = txt.IndexOf("=");
int end = txt.IndexOf(";");
var code = txt.Substring(start+1, end-start-1);
var nCode = Convert.ToInt32(code);
bool Skip = false;
for(int J = 0; J < ecfg.DataList.Count; J ++) {
var d = ecfg.DataList[J];
if(d.ErrorID == nCode) {
Skip = true;
break;
}
}
if(Skip) {
continue;
}
outString += code;
int start2 = txt.IndexOf("//");
if(start2 != -1) {
var desc = txt.Substring(start2+2);
outString += "\t\t" + desc;
}
outString += "\n";
}
}
}
Debug.Log(outString);
2023-08-22 19:08:45 +08:00
}
private static void ExportRedisCode()
{
string redisConfig = SERVER_DIR + "/bin/scp/DBRedis.xml";
if (!File.Exists(redisConfig))
{
Debug.LogError($"{redisConfig} 不存在");
return;
}
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
string sContent = File.ReadAllText(redisConfig);
XmlReader reader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(sContent)), settings);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
XmlNode RootNode = xmlDoc.SelectSingleNode("root");
XmlNodeList nodes = RootNode.ChildNodes;
string Ids = "";
string funcs = "";
//string structs = "";
for (int i = 0; i < nodes.Count; ++i)
{
XmlElement ele = nodes[i] as XmlElement;
int id = EditorUtil.GetInt(ele, "id");
string sName = EditorUtil.GetString(ele, "name");
string sDesc = EditorUtil.GetString(ele, "desc");
string sOp = EditorUtil.GetString(ele, "op");
string sKey = EditorUtil.GetString(ele, "key");
string sFmtKey = EditorUtil.GetString(ele, "fmt_key");
string currentID = $"REDIS_{sName.ToUpper()}";
Ids += $"\t{currentID}\t\t\t= {id}\t// {sDesc}\n";
string[] names = sName.Split("_");
string funcDesc = $"// {sDesc}\n";
string funcName = "RD_";
for (int J = 0; J < names.Length; ++J)
{
funcName += EditorUtil.FirstLetterToUpper(names[J].ToLower());
}
string fullFunc = funcDesc + "func " + funcName + "(keyID uint32, keyStr string, rpc *xsf_rpc.Acceptor";
string funcContent = $"\tcfg := xsf_scp.XSFSchema().DBRedis.Get({currentID})\n";
funcContent += "\tif cfg == nil {\n";
funcContent += $"\t\txsf_log.Error(\"{funcName} cfg == nil {currentID}\")\n";
funcContent += "\t\treturn\n";
funcContent += "\t}\n\n";
funcContent += "\txsf_redis.Request(keyID, keyStr, cfg, rpc";
XmlNodeList param = ele.ChildNodes;
if (param.Count > 0)
{
XmlElement xmlParam = param[0] as XmlElement;
string sParamName = EditorUtil.GetString(xmlParam, "name");
string sType = EditorUtil.GetString(xmlParam, "type");
if (sOp.Contains("SET"))
{
fullFunc += $", {sParamName} {sType}" + ") {\n";
funcContent += $", {sParamName})\n";
}
else if (sOp.Contains("GET"))
{
fullFunc += ") {\n";
funcContent += $")\n";
}
}
else
{
fullFunc += ") {\n";
funcContent += $")\n";
}
funcs += fullFunc + funcContent + "}\n\n";
}
string codePath = SERVER_DIR + "/common/db/redis_func.go";
EditorUtil.ReplaceContentByTag(DB_DEF_PATH, "REDIS_REQUEST_ID_BEGIN", "REDIS_REQUEST_ID_END", Ids);
EditorUtil.ReplaceContentByTag(codePath, "REQUEST_FUNC_BEGEIN", "REQUEST_FUNC_END", funcs);
}
private static void ExportMongoCode()
{
string redisConfig = SERVER_DIR + "/bin/scp/DBMongo.xml";
if (!File.Exists(redisConfig))
{
Debug.LogError($"{redisConfig} 不存在");
return;
}
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
string sContent = File.ReadAllText(redisConfig);
XmlReader reader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(sContent)), settings);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
XmlNode RootNode = xmlDoc.SelectSingleNode("root");
XmlNodeList nodes = RootNode.ChildNodes;
string Ids = "";
string funcs = "";
//string structs = "";
for (int db = 0; db < nodes.Count; db++)
{
XmlElement eleDB= nodes[db] as XmlElement;
XmlNodeList cols = eleDB.ChildNodes;
for (int col = 0; col < cols.Count; col++)
{
XmlElement eleCol = cols[col] as XmlElement;
2025-01-08 14:46:37 +08:00
bool isSplit = false;
if(EditorUtil.GetInt(eleCol, "split") > 0)
{
isSplit = true;
}
2023-08-22 19:08:45 +08:00
XmlNodeList reqs = eleCol.ChildNodes;
for (int r = 0; r < reqs.Count; r++)
{
XmlElement ele = reqs[r] as XmlElement;
Debug.Log("name=" + ele.Name);
int id = EditorUtil.GetInt(ele, "id");
string sName = EditorUtil.GetString(ele, "name");
string sDesc = EditorUtil.GetString(ele, "desc");
string sOp = EditorUtil.GetString(ele, "op");
bool dataNotFormat = EditorUtil.GetBoolean(ele, "data_not_format");
string currentID = $"MONGO_{sName.ToUpper()}";
Ids += $"\t{currentID}\t\t\t= {id}\t// {sDesc}\n";
string[] names = sName.Split("_");
string funcDesc = $"// {sDesc}\n";
string funcName = "MG_";
for (int J = 0; J < names.Length; ++J)
{
funcName += EditorUtil.FirstLetterToUpper(names[J].ToLower());
}
2025-01-08 14:46:37 +08:00
string fullFunc;
if(isSplit)
{
fullFunc = funcDesc + "func " + funcName + "(keyID uint32, colID uint32, rpc *xsf_rpc.Acceptor";
}
else
{
fullFunc = funcDesc + "func " + funcName + "(keyID uint32, rpc *xsf_rpc.Acceptor";
}
2023-08-22 19:08:45 +08:00
string funcContent = $"\tcfg := xsf_scp.XSFSchema().DBMongo.Get({currentID})\n";
funcContent += "\tif cfg == nil {\n";
funcContent += $"\t\txsf_log.Error(\"{funcName} cfg == nil {currentID}\")\n";
funcContent += "\t\treturn\n";
funcContent += "\t}\n\n";
switch (sOp)
{
case "Insert":
{
XmlNodeList datas = ele.SelectNodes("data");
string dataM = "";
for (int z = 0; z < datas.Count; z++)
{
XmlElement eleData = datas[z] as XmlElement;
string name = EditorUtil.GetString(eleData, "name");
string type = EditorUtil.GetString(eleData, "type");
fullFunc += $", D_{name} {type}";
2024-12-17 12:33:09 +08:00
dataM += $"\t\t\"{name}\": D_{name},\n";
2023-08-22 19:08:45 +08:00
}
fullFunc += ") {\n";
funcContent += "\tdata := bson.M{\n";
funcContent += dataM;
funcContent += "\t}\n\n";
funcContent += "\txsf_mongo.Insert(keyID, cfg, rpc, data)\n";
}
break;
2023-10-19 15:00:19 +08:00
case "FindAll":
case "FindOneSort":
2023-08-22 19:08:45 +08:00
case "FindOne":
{
2023-10-19 15:00:19 +08:00
switch(sOp)
{
case "FindAll":
fullFunc += ", page uint32";
break;
default:
break;
}
2023-08-22 19:08:45 +08:00
XmlNodeList datas = ele.SelectNodes("filter");
string dataF = "";
for (int z = 0; z < datas.Count; z++)
{
XmlElement eleData = datas[z] as XmlElement;
string name = EditorUtil.GetString(eleData, "name");
string type = EditorUtil.GetString(eleData, "type");
fullFunc += $", F_{name} {type}";
2024-12-17 12:33:09 +08:00
dataF += $"\t\t\"{name}\": F_{name},\n";
2023-08-22 19:08:45 +08:00
}
fullFunc += ") {\n";
funcContent += "\tfilter := bson.M{\n";
funcContent += dataF;
funcContent += "\t}\n\n";
2024-12-17 12:33:09 +08:00
XmlNodeList Pdatas = ele.SelectNodes("projection");
string dataP = "";
for (int z = 0; z < Pdatas.Count; z++)
{
XmlElement eleData = Pdatas[z] as XmlElement;
string name = EditorUtil.GetString(eleData, "name");
string v = EditorUtil.GetString(eleData, "value");
dataP += $"\t\t\"{name}\": {v},\n";
}
funcContent += "\tprojection := bson.M{\n";
funcContent += dataP;
funcContent += "\t}\n\n";
2023-10-19 15:00:19 +08:00
switch(sOp)
{
case "FindAll":
2025-01-08 14:46:37 +08:00
if(isSplit)
{
funcContent += "\txsf_mongo.FindAllByColID(keyID, colID, cfg, rpc, page, filter, projection)\n";
}
else
{
funcContent += "\txsf_mongo.FindAll(keyID, cfg, rpc, page, filter, projection)\n";
}
2023-10-19 15:00:19 +08:00
break;
case "FindOneSort":
2024-12-17 12:33:09 +08:00
funcContent += "\txsf_mongo.FindOneSort(keyID, cfg, rpc, filter, projection)\n";
2023-10-19 15:00:19 +08:00
break;
case "FindOne":
2024-12-17 12:33:09 +08:00
funcContent += $"\txsf_mongo.FindOne(keyID, cfg, rpc, filter, projection)\n";
2023-10-19 15:00:19 +08:00
break;
default:
break;
}
2023-08-22 19:08:45 +08:00
}
break;
case "UpdateOne":
2023-12-06 15:00:26 +08:00
case "DeleteOne":
2023-08-22 19:08:45 +08:00
{
{
XmlNodeList datas = ele.SelectNodes("filter");
string dataF = "";
for (int z = 0; z < datas.Count; z++)
{
XmlElement eleData = datas[z] as XmlElement;
string name = EditorUtil.GetString(eleData, "name");
string type = EditorUtil.GetString(eleData, "type");
fullFunc += $", F_{name} {type}";
2024-12-17 12:33:09 +08:00
dataF += $"\t\t\"{name}\": F_{name},\n";
2023-08-22 19:08:45 +08:00
}
funcContent += "\tfilter := bson.M{\n";
funcContent += dataF;
funcContent += "\t}\n\n";
}
if (dataNotFormat)
{
2023-12-06 15:00:26 +08:00
if(sOp == "UpdateOne")
{
XmlNodeList datas = ele.SelectNodes("data");
XmlElement eleData = datas[0] as XmlElement;
string name = EditorUtil.GetString(eleData, "name");
string type = EditorUtil.GetString(eleData, "type");
2023-08-22 19:08:45 +08:00
2023-12-06 15:00:26 +08:00
fullFunc += $", D_{name} {type}";
2023-08-22 19:08:45 +08:00
2023-12-06 15:00:26 +08:00
fullFunc += ", IsUpsert bool) {\n";
2023-08-22 19:08:45 +08:00
2025-01-08 14:46:37 +08:00
if(isSplit)
{
funcContent += $"\txsf_mongo.UpdateOneByColID(keyID, colID, cfg, rpc, IsUpsert, filter, D_{name})\n";
}
else
{
funcContent += $"\txsf_mongo.UpdateOne(keyID, cfg, rpc, IsUpsert, filter, D_{name})\n";
}
2023-12-06 15:00:26 +08:00
}
else
{
fullFunc += ") {\n";
funcContent += $"\txsf_mongo.DeleteOne(keyID, cfg, rpc, filter)\n";
}
2023-08-22 19:08:45 +08:00
}
else
{
XmlNodeList datas = ele.SelectNodes("data");
string dataM = "";
for (int z = 0; z < datas.Count; z++)
{
XmlElement eleData = datas[z] as XmlElement;
string name = EditorUtil.GetString(eleData, "name");
string type = EditorUtil.GetString(eleData, "type");
fullFunc += $", D_{name} {type}";
2024-12-17 12:33:09 +08:00
dataM += $"\t\t\"{name}\": D_{name},\n";
2023-08-22 19:08:45 +08:00
}
2023-12-06 15:00:26 +08:00
if(sOp == "UpdateOne")
{
funcContent += "\tdata := bson.M{\n";
funcContent += dataM;
funcContent += "\t}\n";
2023-08-22 19:08:45 +08:00
2023-12-06 15:00:26 +08:00
fullFunc += ", IsUpsert bool) {\n";
2023-08-22 19:08:45 +08:00
2025-01-08 14:46:37 +08:00
if(isSplit)
{
funcContent += "\txsf_mongo.UpdateOneByColID(keyID, colID, cfg, rpc, IsUpsert, filter, data)\n";
}
else
{
funcContent += "\txsf_mongo.UpdateOne(keyID, cfg, rpc, IsUpsert, filter, data)\n";
}
2023-12-06 15:00:26 +08:00
}
else
{
fullFunc += ") {\n";
funcContent += $"\txsf_mongo.DeleteOne(keyID, cfg, rpc, filter)\n";
}
2023-08-22 19:08:45 +08:00
}
}
break;
}
funcs += fullFunc + funcContent + "}\n\n";
}
}
}
string codePath = SERVER_DIR + "/common/db/mongo_func.go";
EditorUtil.ReplaceContentByTag(DB_DEF_PATH, "MONGO_REQUEST_ID_BEGIN", "MONGO_REQUEST_ID_END", Ids);
EditorUtil.ReplaceContentByTag(codePath, "REQUEST_FUNC_BEGEIN", "REQUEST_FUNC_END", funcs);
}
}