using JNPF; using JNPF.DataEncryption; using JNPF.Extras.DatabaseAccessor.SqlSugar.Extensions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Json; namespace SqlSugar; /// /// JNPF多租户拓展. /// public class JNPFTenantExtensions { public static IConfiguration _config { get; set; } public static string skey = "Vl4WTqna9aZCgswjieIP"; /// /// 构造函数. /// static JNPFTenantExtensions() { _config = new ConfigurationBuilder().Add(new JsonConfigurationSource { Path = "Configurations/ConnectionStrings.json", ReloadOnChange = true }).Build(); } /// /// 获取普通链接. /// /// 配置ID. /// 数据库名称. /// public static ConnectionConfigOptions GetLinkToOrdinary(string configId, string tableName) { ConnectionStringsOptions conn = App.GetConfig("ConnectionStrings", true); List configList = new List(); configList.Add(new DBConnectionConfig() { IsMaster = true, ServiceName = tableName, dbType = (DbType)Enum.Parse(typeof(DbType), conn.DBType), connectionStr = DESCEncryption.Encrypt(conn.ConnectString, skey) }); return new ConnectionConfigOptions() { ConfigId = configId, IsCustom = false, IsMasterSlaveSeparation = false, ConfigList = configList }; } /// /// 获取自定义链接 /// /// 配置ID. /// 数据库连接列表. /// public static ConnectionConfigOptions GetLinkToCustom(string configId, List tenantLinkModels) { List configList = new List(); foreach (var item in tenantLinkModels) { if (item.configType == 0) { if (!string.IsNullOrEmpty(item.connectionStr)) { configList.Add(new DBConnectionConfig() { IsMaster = true, dbType = ToDbType(item.dbType), ServiceName = item.serviceName, connectionStr = item.connectionStr, }); } else { configList.Add(new DBConnectionConfig() { IsMaster = true, dbType = ToDbType(item.dbType), connectionStr = DESCEncryption.Encrypt(ToConnectionString(ToDbType(item.dbType), item.host, Convert.ToInt32(item.port), item.serviceName, item.userName, item.password, item.dbSchema), skey) }); } } else { if (!string.IsNullOrEmpty(item.connectionStr)) { configList.Add(new DBConnectionConfig() { IsMaster = false, dbType = ToDbType(item.dbType), ServiceName = item.serviceName, connectionStr = item.connectionStr, }); } else { configList.Add(new DBConnectionConfig() { IsMaster = false, dbType = ToDbType(item.dbType), connectionStr = DESCEncryption.Encrypt(ToConnectionString(ToDbType(item.dbType), item.host, Convert.ToInt32(item.port), item.serviceName, item.userName, item.password, item.dbSchema), skey) }); } } } return new ConnectionConfigOptions() { ConfigId = configId, IsCustom = true, IsMasterSlaveSeparation = tenantLinkModels.Any(it => it.configType.Equals(1)), ConfigList = configList }; } /// /// 获取配置. /// /// /// public static ConnectionConfig GetConfig(ConnectionConfigOptions options) { if (!options.IsCustom) { DBConnectionConfig config = options.ConfigList.FirstOrDefault(); return new ConnectionConfig() { DbType = config.dbType, ConfigId = options.ConfigId, IsAutoCloseConnection = true, ConnectionString = DESCEncryption.Decrypt(config.connectionStr, skey), ConfigureExternalServices = new ConfigureExternalServices() { SqlFuncServices = JsonSqlExtFunc.ExpMethods } }; } else { var slaveConnection = new List(); foreach (var item in options.ConfigList.FindAll(it => it.IsMaster.Equals(false))) { slaveConnection.Add(new SlaveConnectionConfig() { HitRate = 10, ConnectionString = DESCEncryption.Decrypt(item.connectionStr, skey) }); } return new ConnectionConfig() { DbType = options.ConfigList.Find(it => it.IsMaster.Equals(true)).dbType, ConfigId = options.ConfigId, IsAutoCloseConnection = true, ConnectionString = DESCEncryption.Decrypt(options.ConfigList.Find(it => it.IsMaster.Equals(true)).connectionStr, skey), SlaveConnectionConfigs = slaveConnection, ConfigureExternalServices = new ConfigureExternalServices() { SqlFuncServices = JsonSqlExtFunc.ExpMethods } }; } } /// /// 转换数据库类型. /// /// 数据库类型. /// public static DbType ToDbType(string dbType) { switch (dbType.ToLower()) { case "mysql": return SqlSugar.DbType.MySql; case "oracle": return SqlSugar.DbType.Oracle; case "dm8": case "dm": return SqlSugar.DbType.Dm; case "kdbndp": case "kingbasees": return SqlSugar.DbType.Kdbndp; case "postgresql": return SqlSugar.DbType.PostgreSQL; default: return SqlSugar.DbType.SqlServer; } } /// /// 转换连接字符串. /// /// 数据库类型. /// 主机地址. /// 端口. /// 数据库名. /// 用户名. /// 密码. /// 模式. /// public static string ToConnectionString(DbType dbType, string host, int port, string tableName, string userName, string password, string dbSchema) { switch (dbType) { case DbType.SqlServer: return string.Format("Data Source={0},{1};Initial Catalog={2};User ID={3};Password={4};Connection Timeout=5;MultipleActiveResultSets=true", host, port, tableName, userName, password); case DbType.Oracle: return string.Format("Data Source={0}:{1}/{2};User ID={3};Password={4};", host, port, dbSchema, userName, password); case DbType.MySql: return string.Format("server={0};port={1};database={2};user={3};password={4};AllowLoadLocalInfile=true", host, port, tableName, userName, password); case DbType.Dm: return string.Format("server={0};port={1};database={2};User Id={3};PWD={4}", host, port, tableName, userName, password); case DbType.Kdbndp: return string.Format("server={0};port={1};database={2};UID={3};PWD={4}", host, port, tableName, userName, password); case DbType.PostgreSQL: return string.Format("server={0};port={1};Database={2};User Id={3};Password={4}", host, port, tableName, userName, password); default: return string.Format("Data Source={0},{4};Initial Catalog={1};User ID={2};Password={3};Connection Timeout=5;MultipleActiveResultSets=true", host, tableName, userName, password, port); } } }