public static FirebirdProviderAdapter GetInstance() { if (_instance == null) { lock (_syncRoot) if (_instance == null) { var assembly = Common.Tools.TryLoadAssembly(AssemblyName, null); if (assembly == null) { throw new InvalidOperationException($"Cannot load assembly {AssemblyName}"); } var connectionType = assembly.GetType($"{ClientNamespace}.FbConnection", true); var dataReaderType = assembly.GetType($"{ClientNamespace}.FbDataReader", true); var parameterType = assembly.GetType($"{ClientNamespace}.FbParameter", true); var commandType = assembly.GetType($"{ClientNamespace}.FbCommand", true); var transactionType = assembly.GetType($"{ClientNamespace}.FbTransaction", true); var dbType = assembly.GetType($"{ClientNamespace}.FbDbType", true); var typeMapper = new TypeMapper(); typeMapper.RegisterTypeWrapper <FbConnection>(connectionType); typeMapper.RegisterTypeWrapper <FbParameter>(parameterType); typeMapper.RegisterTypeWrapper <FbDbType>(dbType); typeMapper.FinalizeMappings(); var typeGetter = typeMapper.Type <FbParameter>().Member(p => p.FbDbType).BuildGetter <IDbDataParameter>(); var clearAllPools = typeMapper.BuildAction(typeMapper.MapActionLambda(() => FbConnection.ClearAllPools())); _instance = new FirebirdProviderAdapter( connectionType, dataReaderType, parameterType, commandType, transactionType, typeGetter, clearAllPools); } } return(_instance); }
internal static MySqlProviderAdapter CreateAdapter() { var assembly = Common.Tools.TryLoadAssembly(MySqlDataAssemblyName, null); if (assembly == null) { throw new InvalidOperationException($"Cannot load assembly {MySqlDataAssemblyName}"); } var connectionType = assembly.GetType($"{MySqlDataClientNamespace}.MySqlConnection", true) !; var dataReaderType = assembly.GetType($"{MySqlDataClientNamespace}.MySqlDataReader", true) !; var parameterType = assembly.GetType($"{MySqlDataClientNamespace}.MySqlParameter", true) !; var commandType = assembly.GetType($"{MySqlDataClientNamespace}.MySqlCommand", true) !; var transactionType = assembly.GetType($"{MySqlDataClientNamespace}.MySqlTransaction", true) !; var dbType = assembly.GetType($"{MySqlDataClientNamespace}.MySqlDbType", true) !; var mySqlDecimalType = assembly.GetType($"{MySqlDataTypesNamespace}.MySqlDecimal", true) !; var mySqlDateTimeType = assembly.GetType($"{MySqlDataTypesNamespace}.MySqlDateTime", true) !; var mySqlGeometryType = assembly.GetType($"{MySqlDataTypesNamespace}.MySqlGeometry", true) !; var typeMapper = new TypeMapper(); typeMapper.RegisterTypeWrapper <MySqlParameter>(parameterType); typeMapper.RegisterTypeWrapper <MySqlDbType>(dbType); typeMapper.RegisterTypeWrapper <MySqlDateTime>(mySqlDateTimeType); typeMapper.RegisterTypeWrapper <MySqlDecimal>(mySqlDecimalType); var dbTypeGetter = typeMapper.Type <MySqlParameter>().Member(p => p.MySqlDbType).BuildGetter <IDbDataParameter>(); var decimalGetter = typeMapper.BuildFunc <object, string>(typeMapper.MapLambda((object value) => ((MySqlDecimal)value).ToString())); var toDecimalConverter = typeMapper.MapLambda((MySqlDecimal d) => d.Value); var toDoubleConverter = typeMapper.MapLambda((MySqlDecimal d) => d.ToDouble()); var dateTimeConverter = typeMapper.MapLambda((MySqlDateTime dt) => dt.GetDateTime()); var mappingSchema = new MappingSchema(); mappingSchema.SetDataType(mySqlDecimalType, DataType.Decimal); mappingSchema.SetConvertExpression(mySqlDecimalType, typeof(decimal), toDecimalConverter); mappingSchema.SetConvertExpression(mySqlDecimalType, typeof(double), toDoubleConverter); mappingSchema.SetValueToSqlConverter(mySqlDecimalType, typeMapper.BuildAction <StringBuilder, SqlDataType, object>(typeMapper.MapActionLambda((StringBuilder sb, SqlDataType type, object value) => AppendAction(sb, ((MySqlDecimal)value).ToString())))); mappingSchema.SetDataType(mySqlDateTimeType, DataType.DateTime2); mappingSchema.SetConvertExpression(mySqlDateTimeType, typeof(DateTime), dateTimeConverter); return(new MySqlProviderAdapter( MySqlProvider.MySqlData, connectionType, dataReaderType, parameterType, commandType, transactionType, mySqlDecimalType, mySqlDateTimeType, mySqlGeometryType, decimalGetter, p => dbTypeGetter(p), "GetMySqlDecimal", null, "GetMySqlDateTime", MySqlDataTypesNamespace, mappingSchema, null)); }
FirebirdProviderAdapter() { var assembly = Tools.TryLoadAssembly(AssemblyName, null); if (assembly == null) { throw new InvalidOperationException($"Cannot load assembly {AssemblyName}"); } ConnectionType = assembly.GetType($"{ClientNamespace}.FbConnection", true) !; DataReaderType = assembly.GetType($"{ClientNamespace}.FbDataReader", true) !; ParameterType = assembly.GetType($"{ClientNamespace}.FbParameter", true) !; CommandType = assembly.GetType($"{ClientNamespace}.FbCommand", true) !; TransactionType = assembly.GetType($"{ClientNamespace}.FbTransaction", true) !; var dbType = assembly.GetType($"{ClientNamespace}.FbDbType", true) !; FbDecFloatType = assembly.GetType($"{TypesNamespace}.FbDecFloat", false); FbZonedDateTimeType = assembly.GetType($"{TypesNamespace}.FbZonedDateTime", false); FbZonedTimeType = assembly.GetType($"{TypesNamespace}.FbZonedTime", false); var decimalTypeType = assembly.GetType("FirebirdSql.Data.Common.DecimalType", false) !; var typeMapper = new TypeMapper(); typeMapper.RegisterTypeWrapper <FbConnection>(ConnectionType); typeMapper.RegisterTypeWrapper <FbParameter>(ParameterType); typeMapper.RegisterTypeWrapper <FbDbType>(dbType); MappingSchema = new FirebirdAdapterMappingSchema(); // we don't provide default mappings to non-provider types // as it looks like there is no suitable .net types // such mappings could be added by user manually if (FbDecFloatType != null) { typeMapper.RegisterTypeWrapper <FbDecFloat>(FbDecFloatType); MappingSchema.SetDataType(FbDecFloatType, new SqlDataType(DataType.DecFloat, FbDecFloatType, "DECFLOAT")); // we don't register literal generation for decfloat as it looks like special values (inf, (s)nan are not supported in literals) } if (FbZonedDateTimeType != null) { typeMapper.RegisterTypeWrapper <FbZonedDateTime>(FbZonedDateTimeType); MappingSchema.SetDataType(FbZonedDateTimeType, new SqlDataType(DataType.DateTimeOffset, FbZonedDateTimeType, "TIMESPAN WITH TIME ZONE")); } if (FbZonedTimeType != null) { typeMapper.RegisterTypeWrapper <FbZonedTime>(FbZonedTimeType); MappingSchema.SetDataType(FbZonedTimeType, new SqlDataType(DataType.TimeTZ, FbZonedTimeType, "TIME WITH TIME ZONE")); } typeMapper.FinalizeMappings(); var dbTypeBuilder = typeMapper.Type <FbParameter>().Member(p => p.FbDbType); SetDbType = dbTypeBuilder.BuildSetter <IDbDataParameter>(); GetDbType = dbTypeBuilder.BuildGetter <IDbDataParameter>(); ClearAllPools = typeMapper.BuildAction(typeMapper.MapActionLambda(() => FbConnection.ClearAllPools())); IsDateOnlySupported = assembly.GetName().Version >= MinDateOnlyVersion; }