Skip to content

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

  1. Breakpointsdo* methods call to* internally; break in to* to inspect SQL.
  2. Events — register lifecycle hooks on DBCash.
  3. Errors — use onExecuteError to log failed SQL.