Configuration
1. Purpose
Separate how each app loads DB settings (XML, JSON, …) from mooSQL core. The app reads connection info and builds DBInstance objects.
2. Core types
- DBInsCash — cached DB instances
- DBInstance — single database slot
- SQLBuilder — SQL composer
- BulkBase — bulk insert helper
3. DBCash
Subclass that owns the factory: load config, expose SQLBuilder, BatchSQL, etc.
Sample connections (UCML-style)
SQL Server
xml
Enlist=false;Data Source=137.12.*.*;Database=**;User Id=***;Password=***;Encrypt=True;TrustServerCertificate=True;OceanBase
xml
server=137.12.7.*;database=****;user Id=xxxx@xxx#xx;password=xxxxxxxx;pooling=true;Port=8088;Charset=utf8mb4;Convert Zero Datetime=True;MySQL
xml
server=10.16.10.*;database=xxx;user Id=xxxx;password=xxxxx;pooling=true;Port=3306;Charset=utf8mb4;Convert Zero Datetime=True;PostgreSQL
xml
PORT=5432;DATABASE=xxx;HOST=137.12.7.**;PASSWORD=xxxxxxxxxx;USER ID=xxxxx;Standalone JSON config
Since 2024.11, mooSQL supports a dedicated Connections array:
json
"Connections": [
{
"Position": 1,
"Name": "UcmlTar",
"DbType": "MSSQL",
"ConnectString": "server=*.*.*.*;database=*;user Id=**;password=**;pooling=true;Port=3306;Charset=utf8mb4;Convert Zero Datetime=True;",
"Version": "13.0.0",
"VersionNumber":13.0
},
{
"Position": 2,
"Name": "Device",
"DbType": "MySQL",
"ConnectString": "server=*.*.*.*;database=*;user Id=**;password=**;pooling=true;Port=3306;Charset=utf8mb4;Convert Zero Datetime=True;",
"Version": "5.7.21"
}DBCash sample
c#
public partial class DBCash
{
private static DBInsCash cash = null;
public static DBInstance GetDBInstance(int position) {
if (cash == null) {
createCash();
}
return cash.getInstance(position);
}
private static void createCash() {
cash = new DBInsCash();
MooEventHandler handler = new MooEventHandler();
string str = getCurPath();
var tar = (str + "/bin/ucmlconf.xml");
cash.configPath = tar;
cash.client.events.onBuildSetFrag((SetFrag frag, SQLBuilder builder)=>
{
var pair = frag.values[builder.InsertRowIndex];
if (pair.paramed)
{
var val = pair.value;
if (val is JValue)
{
pair.value = val.ToString();
}
}
return true;
});
cash.client.events.onBuildWhereFrag((WhereFrag frag, SQLBuilder builder)=>
{
if (frag.paramed)
{
var val = frag.value;
if (val is JValue)
{
frag.value = val.ToString();
}
}
return true;
});
}
private static string getCurPath()
{
if (UCMLCommon.UCMLInitEnv.Server != null) {
return UCMLCommon.UCMLInitEnv.Server.MapPath("~");
}
var cur= Assembly.GetExecutingAssembly().Location;
var i=cur.LastIndexOf('\\');
var path=cur.Substring(0,i);
return path;
}
public static SQLKit newKit(int position)
{
var db= GetDBInstance(position);
var kit = new SQLKit();
kit.setDBInstance(db);
return kit;
}
public static BulkTable newBulk(string tableName, int position) {
BulkTable bk= new BulkTable(tableName,GetDBInstance(position));
bk.getBulkTable();
return bk;
}
public static BatchSQL newBatchSQL(int position)
{
var db = GetDBInstance(position);
var kit = new SQLKit();
kit.setDBInstance(db);
var res = new BatchSQL(kit);
return res;
}
}Logging
Custom watcher
c#
public class QueryWatchor : Watchor {
public override string onAfterExecuteSetError(string oprationId, ExeContext context, Exception ex, string operation)
{
var sql = context.cmd.cmdText;
var paras = context.cmd.para;
var msg = "";
foreach (var para in paras.value)
{
sql = sql.Replace(para.Key, para.Value.val.ToString());
msg += string.Format("{0}:{1},", para.Key, para.Value.val);
}
var info = string.Format("SQL error ({1}): {2}\nSQL:{0},\n", sql, DateTime.Now.ToString(),ex.Message);
saveFileLog(info);
return info;
}
private void saveFileLog(string message)
{
string str = UCMLCommon.UCMLInitEnv.Server.MapPath("~");
var tar = (str + "/log/moosql/");
var filepath = tar;
System.IO.DirectoryInfo dir = new DirectoryInfo(filepath);
if (!dir.Exists)
{
dir.Create();
}
var dand = new Random();
var fileName = string.Format("errSql{0}_{1}_{2}.txt", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
File.AppendAllText(filepath+fileName, message);
}
}Register via factory:
c#
public class DBInsFactory:DBInsCash {
public DBInsFactory()
{
}
public override IExeLog getExeQueryLog()
{
return new QueryLog();
}
public override IWatchor getExeWatchor()
{
return new QueryWatchor();
}
}Value coercion (JValue)
c#
public class MooEventHandler {
public bool onCheckSetVal(SetFrag frag, SQLBuilder builder)
{
var pair = frag.values[builder.InsertRowIndex];
if (pair.paramed)
{
var val = pair.value;
if (val is JValue)
{
pair.value = val.ToString();
}
}
return true;
}
public bool onCheckWhereVal(WhereFrag frag, SQLBuilder builder)
{
if (frag.paramed)
{
var val = frag.value;
if (val is JValue)
{
frag.value = val.ToString();
}
}
return true;
}
}Debugging
- Breakpoints —
do*methods callto*internally; break into*to inspect SQL. - Events — register lifecycle hooks on
DBCash. - Errors — use
onExecuteErrorto log failed SQL.