using FreeSql.Internal; using FreeSql.Internal.CommonProvider; using FreeSql.Duckdb.Curd; using System; using System.Data.Common; using System.Threading; using System.Collections; using System.Numerics; namespace FreeSql.Duckdb { public class DuckdbProvider : BaseDbProvider, IFreeSql { static int _firstInit = 1; static void InitInternal() { if (Interlocked.Exchange(ref _firstInit, 0) == 1) //不能放在 static ctor .NetFramework 可能报初始化类型错误 { #if net60 Utils.dicExecuteArrayRowReadClassOrTuple[typeof(DateOnly)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(TimeOnly)] = true; #endif Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); } } public override ISelect CreateSelectProvider(object dywhere) => new DuckdbSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public override IInsert CreateInsertProvider() => new DuckdbInsert(this, this.InternalCommonUtils, this.InternalCommonExpression); public override IUpdate CreateUpdateProvider(object dywhere) => new DuckdbUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public override IDelete CreateDeleteProvider(object dywhere) => new DuckdbDelete(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public override IInsertOrUpdate CreateInsertOrUpdateProvider() => new DuckdbInsertOrUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression); public DuckdbProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null) { InitInternal(); this.InternalCommonUtils = new DuckdbUtils(this); this.InternalCommonExpression = new DuckdbExpression(this.InternalCommonUtils); this.Ado = new DuckdbAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString, connectionFactory); this.Aop = new AopProvider(); this.CodeFirst = new DuckdbCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); this.DbFirst = new DuckdbDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); if (connectionFactory != null) this.CodeFirst.IsNoneCommandParameter = true; } ~DuckdbProvider() => this.Dispose(); int _disposeCounter; public override void Dispose() { if (Interlocked.Increment(ref _disposeCounter) != 1) return; (this.Ado as AdoProvider)?.Dispose(); } } }