Example #1
0
        public Action <MappingSchema, NpgsqlBinaryImporter, ColumnDescriptor[], TEntity> CreateBinaryImportRowWriter <TEntity>(
            PostgreSQLDataProvider provider,
            BasicSqlBuilder sqlBuilder,
            ColumnDescriptor[] columns,
            MappingSchema mappingSchema)
        {
            var generator = new ExpressionGenerator(_typeMapper);

            var pMapping  = Expression.Parameter(typeof(MappingSchema));
            var pWriterIn = Expression.Parameter(typeof(NpgsqlBinaryImporter));
            var pColumns  = Expression.Parameter(typeof(ColumnDescriptor[]));
            var pEntity   = Expression.Parameter(typeof(TEntity));

            var pWriter = generator.AddVariable(Expression.Parameter(_npgsqlBinaryImporterType));

            generator.Assign(pWriter, Expression.Convert(ExpressionHelper.Property(pWriterIn, nameof(TypeWrapper.instance_)), _npgsqlBinaryImporterType));

            generator.AddExpression(generator.MapAction((NpgsqlBinaryImporter importer) => importer.StartRow(), pWriter));

            for (var i = 0; i < columns.Length; i++)
            {
                var npgsqlType = provider.GetNativeType(columns[i].DbType, true);
                if (npgsqlType == null)
                {
                    var columnType = columns[i].DataType != DataType.Undefined ? new SqlDataType(columns[i]) : null;

                    if (columnType == null || columnType.Type.DataType == DataType.Undefined)
                    {
                        columnType = mappingSchema.GetDataType(columns[i].StorageType);
                    }

                    var sb = new StringBuilder();
                    sqlBuilder.BuildTypeName(sb, columnType);
                    npgsqlType = provider.GetNativeType(sb.ToString(), true);
                }

                if (npgsqlType == null)
                {
                    throw new LinqToDBException($"Cannot guess PostgreSQL type for column {columns[i].ColumnName}. Specify type explicitly in column mapping.");
                }

                // don't use WriteNull because Write already handle both null and DBNull values properly
                // also use object as type parameter, as it is not important for npgsql now
                generator.AddExpression(
                    Expression.Call(
                        pWriter,
                        "Write",
                        new[] { typeof(object) },
                        //columns[idx].GetValue(mappingSchema, entity)
                        Expression.Call(Expression.ArrayIndex(pColumns, Expression.Constant(i)), "GetValue", Array <Type> .Empty, pMapping, pEntity),
                        Expression.Convert(Expression.Constant(npgsqlType.Value), _dbTypeType)));
            }

            var ex = Expression.Lambda <Action <MappingSchema, NpgsqlBinaryImporter, ColumnDescriptor[], TEntity> >(
                generator.Build(),
                pMapping, pWriterIn, pColumns, pEntity);

            return(ex.Compile());
        }
Example #2
0
 SybaseSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #3
0
 Oracle12SqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
 AccessOleDbSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #5
0
        int MultipleRowsBulkCopy <T>(
            DataConnection dataConnection,
            BulkCopyOptions options,
            IEnumerable <T> source,
            BasicSqlBuilder sqlBuilder,
            EntityDescriptor descriptor,
            string tableName)
        {
            var iszOS = Version == DB2Version.zOS;

            {
                var sb         = new StringBuilder();
                var buildValue = BasicSqlBuilder.GetBuildValue(sqlBuilder, sb);
                var columns    = descriptor.Columns.Where(c => !c.SkipOnInsert).ToArray();
                var pname      = sqlBuilder.Convert("p", ConvertType.NameToQueryParameter).ToString();

                sb
                .AppendFormat("INSERT INTO {0}", tableName).AppendLine()
                .Append("(");

                foreach (var column in columns)
                {
                    sb
                    .AppendLine()
                    .Append("\t")
                    .Append(sqlBuilder.Convert(column.ColumnName, ConvertType.NameToQueryField))
                    .Append(",");
                }

                sb.Length--;
                sb
                .AppendLine()
                .Append(")");

                if (!iszOS)
                {
                    sb
                    .AppendLine()
                    .Append("VALUES");
                }

                var headerLen    = sb.Length;
                var totalCount   = 0;
                var currentCount = 0;
                var batchSize    = options.MaxBatchSize ?? 1000;

                if (batchSize <= 0)
                {
                    batchSize = 1000;
                }

                var parms = new List <DataParameter>();
                var pidx  = 0;

                foreach (var item in source)
                {
                    sb
                    .AppendLine()
                    .Append(iszOS ? "SELECT " : "(");

                    foreach (var column in columns)
                    {
                        var value = column.GetValue(item);

                        if (value == null)
                        {
                            sb.Append("NULL");
                        }
                        else
                        {
                            switch (Type.GetTypeCode(value.GetType()))
                            {
                            case TypeCode.DBNull:
                                sb.Append("NULL");
                                break;

                            case TypeCode.String:
                                var isString = false;

                                switch (column.DataType)
                                {
                                case DataType.NVarChar:
                                case DataType.Char:
                                case DataType.VarChar:
                                case DataType.NChar:
                                case DataType.Undefined:
                                    isString = true;
                                    break;
                                }

                                if (isString)
                                {
                                    goto case TypeCode.Int32;
                                }
                                goto default;

                            case TypeCode.Boolean:
                            case TypeCode.Char:
                            case TypeCode.SByte:
                            case TypeCode.Byte:
                            case TypeCode.Int16:
                            case TypeCode.UInt16:
                            case TypeCode.Int32:
                            case TypeCode.UInt32:
                            case TypeCode.Int64:
                            case TypeCode.UInt64:
                            case TypeCode.Single:
                            case TypeCode.Double:
                            case TypeCode.Decimal:
                            case TypeCode.DateTime:
                                //SetParameter(dataParam, "", column.DataType, value);

                                buildValue(value);
                                break;

                            default:
                                var name = pname + ++pidx;

                                sb.Append(name);
                                parms.Add(new DataParameter("p" + pidx, value, column.DataType));

                                break;
                            }
                        }

                        sb.Append(",");
                    }

                    sb.Length--;
                    sb.Append(iszOS ? " FROM SYSIBM.SYSDUMMY1 UNION ALL" : "),");

                    totalCount++;
                    currentCount++;

                    if (currentCount >= batchSize || parms.Count > 100000 || sb.Length > 100000)
                    {
                        if (iszOS)
                        {
                            sb.Length -= " UNION ALL".Length;
                        }
                        else
                        {
                            sb.Length--;
                        }

                        dataConnection.Execute(sb.AppendLine().ToString(), parms.ToArray());

                        parms.Clear();
                        pidx         = 0;
                        currentCount = 0;
                        sb.Length    = headerLen;
                    }
                }

                if (currentCount > 0)
                {
                    if (iszOS)
                    {
                        sb.Length -= " UNION ALL".Length;
                    }
                    else
                    {
                        sb.Length--;
                    }

                    dataConnection.Execute(sb.ToString(), parms.ToArray());
                    sb.Length = headerLen;
                }

                return(totalCount);
            }
        }
Example #6
0
 DB2zOSSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #7
0
 protected OracleSqlBuilderBase(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #8
0
 protected DB2SqlBuilderBase(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
 SqlServer2019SqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #10
0
        protected override BulkCopyRowsCopied MultipleRowsCopy <T>(
            DataConnection dataConnection, BulkCopyOptions options, IEnumerable <T> source)
        {
            var sqlBuilder = _dataProvider.CreateSqlBuilder();
            var descriptor = dataConnection.MappingSchema.GetEntityDescriptor(typeof(T));
            var tableName  = GetTableName(sqlBuilder, descriptor);
            var rowsCopied = new BulkCopyRowsCopied();
            var sb         = new StringBuilder();
            var buildValue = BasicSqlBuilder.GetBuildValue(sqlBuilder, sb);
            var columns    = descriptor.Columns.Where(c => !c.SkipOnInsert).ToArray();
            var pname      = sqlBuilder.Convert("p", ConvertType.NameToQueryParameter).ToString();

            sb.AppendLine("INSERT ALL");

            var headerLen    = sb.Length;
            var currentCount = 0;
            var batchSize    = options.MaxBatchSize ?? 1000;

            if (batchSize <= 0)
            {
                batchSize = 1000;
            }

            var parms = new List <DataParameter>();
            var pidx  = 0;

            foreach (var item in source)
            {
                sb.AppendFormat("\tINTO {0} (", tableName);

                foreach (var column in columns)
                {
                    sb
                    .Append(sqlBuilder.Convert(column.ColumnName, ConvertType.NameToQueryField))
                    .Append(", ");
                }

                sb.Length -= 2;

                sb.Append(") VALUES (");

                foreach (var column in columns)
                {
                    var value = column.GetValue(item);

                    if (value == null)
                    {
                        sb.Append("NULL");
                    }
                    else
                    {
                        switch (Type.GetTypeCode(value.GetType()))
                        {
                        case TypeCode.DBNull:
                            sb.Append("NULL");
                            break;

                        case TypeCode.String:
                            var isString = false;

                            switch (column.DataType)
                            {
                            case DataType.NVarChar:
                            case DataType.Char:
                            case DataType.VarChar:
                            case DataType.NChar:
                            case DataType.Undefined:
                                isString = true;
                                break;
                            }

                            if (isString)
                            {
                                goto case TypeCode.Int32;
                            }
                            goto default;

                        case TypeCode.Boolean:
                        case TypeCode.Char:
                        case TypeCode.SByte:
                        case TypeCode.Byte:
                        case TypeCode.Int16:
                        case TypeCode.UInt16:
                        case TypeCode.Int32:
                        case TypeCode.UInt32:
                        case TypeCode.Int64:
                        case TypeCode.UInt64:
                        case TypeCode.Single:
                        case TypeCode.Double:
                        case TypeCode.Decimal:
                        case TypeCode.DateTime:
                            //SetParameter(dataParam, "", column.DataType, value);

                            buildValue(value);
                            break;

                        default:
                            var name = pname + ++pidx;

                            sb.Append(name);
                            parms.Add(new DataParameter("p" + pidx, value, column.DataType));

                            break;
                        }
                    }

                    sb.Append(",");
                }

                sb.Length--;
                sb.AppendLine(")");

                rowsCopied.RowsCopied++;
                currentCount++;

                if (currentCount >= batchSize || parms.Count > 100000 || sb.Length > 100000)
                {
                    sb.AppendLine("SELECT * FROM dual");

                    dataConnection.Execute(sb.AppendLine().ToString(), parms.ToArray());

                    if (options.RowsCopiedCallback != null)
                    {
                        options.RowsCopiedCallback(rowsCopied);

                        if (rowsCopied.Abort)
                        {
                            return(rowsCopied);
                        }
                    }

                    parms.Clear();
                    pidx         = 0;
                    currentCount = 0;
                    sb.Length    = headerLen;
                }
            }

            if (currentCount > 0)
            {
                sb.AppendLine("SELECT * FROM dual");

                dataConnection.Execute(sb.ToString(), parms.ToArray());
                sb.Length = headerLen;

                if (options.RowsCopiedCallback != null)
                {
                    options.RowsCopiedCallback(rowsCopied);
                }
            }

            return(rowsCopied);
        }
Example #11
0
 InformixSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #12
0
 FirebirdSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #13
0
 AccessODBCSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #14
0
 protected SapHanaSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
 protected SqlServer2017SqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #16
0
 protected AccessSqlBuilderBase(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #17
0
 DB2LUWSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }
Example #18
0
 PostgreSQLSqlBuilder(BasicSqlBuilder parentBuilder) : base(parentBuilder)
 {
 }