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));
            }
Exemple #3
0
        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;
        }