using Microsoft.Extensions.Logging; using SqlSugar; using System; using System.Linq; namespace ReZero.SuperAPI { /// <summary> /// Get rezero db /// </summary> public class ZeroDb { public static ISqlSugarClient Db =>new SqlSugarClient(UtilMethods.CopyConfig( App.PreStartupDb!.CurrentConnectionConfig)); } /// <summary> /// Represents the application's main entry point and provides access to essential services and resources. /// </summary> internal class App { /// <summary> /// Gets or sets the application's service provider, allowing access to registered services. /// </summary> internal static ApplicationServiceProvider? ServiceProvider { get; set; } /// <summary> /// Represents a database connection object used before service startup. /// </summary> internal static ISqlSugarClient? PreStartupDb { get; set; } /// <summary> /// Gets the instance of the SqlSugar client for database operations. /// </summary> /// <remarks> /// This property provides convenient access to the configured SqlSugar client for database operations. /// </remarks> internal static ISqlSugarClient Db { get => ServiceProvider!.GetService<DatabaseContext>().SugarClient; } /// <summary> /// Obtain the database operation object based on the database ID /// </summary> /// <param name="dbId"></param> /// <returns></returns> internal static SqlSugarClient? GetDbById(long dbId) { var rootDb = App.Db; var zeroDatabaseInfo = rootDb.Queryable<ZeroDatabaseInfo>().Where(it => it.Id == dbId).First(); SqlSugarClient? db = null; if (zeroDatabaseInfo != null) db = GetSqlSugarClientByDatabaseInfo(zeroDatabaseInfo); return db; } /// <summary> /// Obtain the database operation object based on the table ID /// </summary> /// <param name="tableId"></param> /// <returns></returns> internal static SqlSugarClient? GetDbTableId(long tableId) { var rootDb = App.Db; var dbId = CacheManager<ZeroEntityInfo>.Instance.GetList().Where(it => it.Id == tableId).First()?.DataBaseId; var zeroDatabaseInfo =CacheManager<ZeroDatabaseInfo>.Instance.GetList().Where(it => it.Id == dbId).First(); zeroDatabaseInfo = rootDb.Utilities.TranslateCopy(zeroDatabaseInfo); SqlSugarClient? db = null; if (zeroDatabaseInfo != null) db = GetSqlSugarClientByDatabaseInfo(zeroDatabaseInfo); return db; } /// <summary> /// Obtain the database operation object based on the ZeroDatabaseInfo /// </summary> /// <param name="zeroDatabaseInfo"></param> /// <returns></returns> private static SqlSugarClient GetSqlSugarClientByDatabaseInfo(ZeroDatabaseInfo zeroDatabaseInfo) { return new SqlSugarClient(new ConnectionConfig() { ConfigId=int.MaxValue, ConnectionString = zeroDatabaseInfo.Connection, DbType = zeroDatabaseInfo.DbType, IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute, MoreSettings = new ConnMoreSettings { SqlServerCodeFirstNvarchar = true, SqliteCodeFirstEnableDropColumn = true, EnableCodeFirstUpdatePrecision = true, IsAutoToUpper=false, PgSqlIsAutoToLower=false, PgSqlIsAutoToLowerCodeFirst=false, EnableOracleIdentity=true } }, db => { db.Aop.OnLogExecuting = (s, p) => { ReZero.DependencyInjection.DependencyResolver.GetLogger().LogInformation(UtilMethods.GetNativeSql(s, p)); }; // 添加Oracle批量操作配置 if (zeroDatabaseInfo.DbType == DbType.Oracle) { db.Aop.OnError = (ex) => { if (ex.Message.Contains("bulkcopy no support identity")) { ReZero.DependencyInjection.DependencyResolver.GetLogger().LogWarning("Oracle批量操作遇到identity问题,使用单条插入模式"); } }; db.Ado.CommandTimeOut = 120; // 增加超时时间 } }); } /// <summary> /// Gets the language used by the SuperAPI module. /// </summary> /// <returns>The language.</returns> internal static Language Language { get { return SuperAPIModule._apiOptions!.UiOptions!.UiLanguage; } } } }