293 lines
9.3 KiB
293 lines
9.3 KiB
//-----------------------------------------------------------------------
|
|
// <copyright file="CustomizeDBMgr.cs" company="Origtek">
|
|
// CustomizeDBMgr belongs to Copyright (c) Origtek. All rights reserved.
|
|
// </copyright>
|
|
//-----------------------------------------------------------------------
|
|
|
|
namespace OT.COM.ArsenalDB
|
|
{
|
|
using Microsoft.Extensions.Configuration;
|
|
using OT.COM.LogisticsUtil;
|
|
using SoldierData;
|
|
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
|
|
/// <summary>
|
|
/// Customize handle database
|
|
/// </summary>
|
|
public partial class CustomizeDBMgr
|
|
{
|
|
/// <summary>
|
|
/// Main database connection string
|
|
/// </summary>
|
|
private CustomizeDBMgr()
|
|
{
|
|
init();
|
|
}
|
|
|
|
private ConcurrentDictionary<string, string> _dicArsenalDBName = null;
|
|
private ConcurrentDictionary<string, string> _dicConnections = null;
|
|
private ConcurrentDictionary<string, string> _dicVirtualConnections = null;
|
|
private ConcurrentDictionary<string, string> _dicRawData = null;
|
|
|
|
private static readonly CustomizeDBMgr _inst = new CustomizeDBMgr();
|
|
|
|
public ConcurrentDictionary<string, string> GetConnections()
|
|
{
|
|
return _dicConnections;
|
|
}
|
|
|
|
public static ConcurrentDictionary<string, string> VirtualConnections => _inst.GetVirtualConnections();
|
|
|
|
public ConcurrentDictionary<string, string> GetVirtualConnections()
|
|
{
|
|
return _dicVirtualConnections;
|
|
}
|
|
|
|
public static ConcurrentDictionary<string, string> SettingData => _inst.GetSettingData();
|
|
|
|
public ConcurrentDictionary<string, string> GetSettingData()
|
|
{
|
|
return _dicRawData;
|
|
|
|
}
|
|
|
|
public static string GetSettingSting(string i_sKey, string i_sDefaultValue = null)
|
|
{
|
|
string sRes = i_sDefaultValue;
|
|
|
|
if (SettingData.ContainsKey(i_sKey))
|
|
{
|
|
sRes = SettingData[i_sKey];
|
|
}
|
|
|
|
return sRes;
|
|
}
|
|
|
|
public int ModifyConnections(string i_sConnectionID, string i_sConnectionData)
|
|
{
|
|
int nRes;
|
|
do
|
|
{
|
|
if (_dicConnections.ContainsKey(i_sConnectionID))
|
|
{
|
|
_dicConnections[i_sConnectionID] = i_sConnectionData;
|
|
}
|
|
else
|
|
{
|
|
_dicConnections.TryAdd(i_sConnectionID, i_sConnectionData);
|
|
}
|
|
|
|
nRes = 0;
|
|
}
|
|
while (false);
|
|
|
|
return nRes;
|
|
}
|
|
|
|
public string GetConnectString(string i_sConnectionID)
|
|
{
|
|
string sRes = null;
|
|
|
|
if (_dicConnections.ContainsKey(i_sConnectionID))
|
|
{
|
|
sRes = _dicConnections[i_sConnectionID];
|
|
}
|
|
|
|
return sRes;
|
|
}
|
|
|
|
|
|
|
|
protected void init()
|
|
{
|
|
|
|
#if DEBUG
|
|
string sSettingFile = "appsettings.Development.json";
|
|
if (!File.Exists(Path.Combine(Directory.GetCurrentDirectory(), sSettingFile)))
|
|
{
|
|
sSettingFile = "appsettings.json";
|
|
}
|
|
#else
|
|
string sSettingFile = "appsettings.json" ;
|
|
#endif
|
|
|
|
var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
|
|
.AddJsonFile(sSettingFile, optional: true, reloadOnChange: true);
|
|
|
|
IConfigurationRoot configuration = builder.Build();
|
|
|
|
IEnumerable<IConfigurationSection> ics = configuration.GetSection("appSettings").GetChildren();
|
|
|
|
ConcurrentDictionary<string, string> dicSetting = new ConcurrentDictionary<string, string>();
|
|
foreach (IConfigurationSection ic in ics)
|
|
{
|
|
dicSetting.TryAdd(ic.Key, ic.Value);
|
|
}
|
|
|
|
Util.SetSetting(dicSetting);
|
|
|
|
if (_dicConnections == null)
|
|
{
|
|
_dicConnections = new ConcurrentDictionary<string, string>();
|
|
_dicRawData = new ConcurrentDictionary<string, string>();
|
|
_dicArsenalDBName = new ConcurrentDictionary<string, string>();
|
|
_dicVirtualConnections = new ConcurrentDictionary<string, string>();
|
|
bool bUseSecret = Util.GetSettingBoolean("USESECRET");
|
|
|
|
|
|
// web.config
|
|
if (!bUseSecret)
|
|
{
|
|
foreach (string sKey in dicSetting.Keys)
|
|
{
|
|
string sContent = Util.GetSettingString(sKey);
|
|
_dicRawData.TryAdd(sKey, sContent);
|
|
}
|
|
}
|
|
|
|
// Load SecretData
|
|
string sRes = SecretData.GetData(out ConcurrentDictionary<string, string> dicData);
|
|
|
|
if (sRes == null)
|
|
{
|
|
foreach (string sKey in dicData.Keys)
|
|
{
|
|
if (!_dicRawData.ContainsKey(sKey))
|
|
{
|
|
_dicRawData.TryAdd(sKey, dicData[sKey]);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if (_dicRawData.ContainsKey("AllConnections"))
|
|
{
|
|
string sAllConnections = _dicRawData["AllConnections"];
|
|
string[] saConnections = sAllConnections.Split(":;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
for (int iIdx = 0; iIdx < saConnections.Length; iIdx += 2)
|
|
{
|
|
string sConnectionName = saConnections[iIdx + 1];
|
|
string sDBName = saConnections[iIdx];
|
|
|
|
int iFind = sConnectionName.IndexOf("_");
|
|
string sContent = Util.GetSettingString(sConnectionName);
|
|
if (EntityUtil.GetForceDBType(sContent, out string sCleanConnectString) != null)
|
|
{
|
|
_dicConnections.TryAdd(sConnectionName, sCleanConnectString);
|
|
}
|
|
if (iFind != -1 )
|
|
{
|
|
_dicArsenalDBName.TryAdd(sDBName, sConnectionName.Substring(0, iFind));
|
|
|
|
_dicVirtualConnections.TryAdd(sDBName, _dicConnections[sConnectionName]);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
static readonly ConcurrentDictionary<string, string> dicChangeConnect = new ConcurrentDictionary<string, string>();
|
|
public static void ChangeAllConnections(string i_sKey, string i_sConnection)
|
|
{
|
|
if (dicChangeConnect.ContainsKey(i_sKey))
|
|
{
|
|
dicChangeConnect[i_sKey] = i_sConnection;
|
|
}
|
|
else
|
|
{
|
|
dicChangeConnect.TryAdd(i_sKey, i_sConnection);
|
|
}
|
|
}
|
|
|
|
private static ConcurrentDictionary<string, DBConnectionInfo> _ConnectionMap = null;
|
|
|
|
public static ConcurrentDictionary<string, DBConnectionInfo> ConnectionMap
|
|
{
|
|
get
|
|
{
|
|
if (_ConnectionMap == null)
|
|
{
|
|
_ConnectionMap = _inst.GetConnectMap();
|
|
}
|
|
|
|
return _ConnectionMap;
|
|
}
|
|
}
|
|
|
|
private ConcurrentDictionary<string, DBConnectionInfo> GetConnectMap()
|
|
{
|
|
string sAllConnections = GetSettingData()["AllConnections"];
|
|
string[] saConnections = sAllConnections.Split(":;".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
|
|
|
|
ConcurrentDictionary<string, DBConnectionInfo> dicConnection = new ConcurrentDictionary<string, DBConnectionInfo>();
|
|
|
|
for (int i = 0; i < saConnections.Length; i += 2)
|
|
{
|
|
|
|
DBConnectionInfo dbci = new DBConnectionInfo() { Name = saConnections[i] };
|
|
string sKey = saConnections[i + 1];
|
|
|
|
if (dicChangeConnect.ContainsKey(dbci.Name))
|
|
{
|
|
sKey = dicChangeConnect[dbci.Name];
|
|
}
|
|
|
|
dbci.ConnectString = _dicConnections[sKey];
|
|
|
|
dbci.DBTYPE = sKey.Split('_')[0];
|
|
|
|
dicConnection.TryAdd(saConnections[i], dbci);
|
|
|
|
}
|
|
|
|
return dicConnection;
|
|
}
|
|
|
|
public static string SingleConnection => _inst._SingleConnection;
|
|
|
|
internal string _SingleConnection
|
|
{
|
|
get
|
|
{
|
|
bool bUseSecret = Util.GetSettingBoolean("USESECRET");
|
|
|
|
string sRes;
|
|
if (!bUseSecret)
|
|
{
|
|
sRes = Util.GetSettingString("UseSingleConnect");
|
|
|
|
if (string.IsNullOrEmpty(sRes))
|
|
{
|
|
sRes = string.Empty;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
SecretData.GetData(out ConcurrentDictionary<string, string> dicData);
|
|
|
|
if (dicData.ContainsKey("UseSingleConnect"))
|
|
{
|
|
sRes = dicData["UseSingleConnect"];
|
|
}
|
|
else
|
|
{
|
|
sRes = string.Empty;
|
|
}
|
|
}
|
|
|
|
return sRes;
|
|
}
|
|
}
|
|
}
|
|
}
|