Esempio n. 1
0
 protected override IEnumerable <string> GetBatches(ISQLBuilder sqlBuilder)
 {
     return
         (sqlBuilder
          .Statements
          .Select(statement => statement.SQL));
 }
Esempio n. 2
0
        public static ISQLBuilder EmitOrderByExpression(this ISQLBuilder sqlBuilder, IEnumerable <SortOption> sortOptions)
        {
            foreach (var so in sortOptions.WithDescriptions())
            {
                if (!so.Description.HasFlag(EnumeratedItemDescription.First))
                {
                    sqlBuilder.Emit(", ");
                }
                sqlBuilder.TableName(so.Item.Name);
                switch (so.Item.Direction)
                {
                case SortDirection.Ascending:
                    sqlBuilder.Emit(" ASC");
                    break;

                case SortDirection.Descending:
                    sqlBuilder.Emit(" DESC");
                    break;

                case SortDirection.None:
                default:
                    break;
                }
            }
            return(sqlBuilder);
        }
Esempio n. 3
0
        public override DataTable[] ExecuteBatch(ISQLBuilder sqlBuilder)
        {
            // Firebird doesn't like mixing DDL with DML, so we break up
            // DDL's that contains CREATE into an initial transaction
            // Then rest of statements in another transaction

            var statements = sqlBuilder.Statements.Where(s => s.Type.IsIn(SQLStatementType.DDL, SQLStatementType.DML)).ToList();

            statements.RemoveAll(s => string.IsNullOrEmpty(s.SQL));

            var ddls = statements.Where(statement => statement.Type == SQLStatementType.DDL && statement.SQL.TrimStart().StartsWith("CREATE")).ToList();

            statements.RemoveAll(ddls.Contains);

            var results = new List <DataTable>();

            if (ddls.Count > 0)
            {
                results.AddRange(ExecuteStatementBatch(ddls.Select(s => s.SQL)));
            }
            if (statements.Count > 0)
            {
                results.AddRange(ExecuteStatementBatch(statements.Select(s => s.SQL)));
            }
            return(results.ToArray());
        }
Esempio n. 4
0
        // This needs to be done properly!
        protected override IEnumerable <string> GetBatches(ISQLBuilder sqlBuilder)
        {
            yield return("SET XACT_ABORT ON;");

            yield return("BEGIN TRANSACTION;");

            // TODO: issue batches in smaller chunks
            var currentBatch = new FastStringBuilder();

            foreach (var statement in sqlBuilder.Statements.Where(x => x.Type != SQLStatementType.TCL))
            {
                if (statement.Type == SQLStatementType.DDL)
                {
                    if (currentBatch.Length > 0)
                    {
                        yield return(currentBatch.ToString());

                        currentBatch.Clear();
                    }
                    yield return(statement.SQL);
                }
                else
                {
                    currentBatch.Append(statement.SQL);
                }
            }
            if (currentBatch.Length > 0)
            {
                yield return(currentBatch.ToString());
            }
            yield return("COMMIT TRANSACTION;");
        }
Esempio n. 5
0
        public virtual DataTable[] ExecuteBatch(ISQLBuilder sqlBuilder)
        {
            try {
                var results = new List <DataTable>();

                using (var scope = this.BeginScope(true)) {
                    using (var command = scope.Connection.CreateCommand()) {
                        command.CommandTimeout = 0;
                        command.CommandType    = CommandType.Text;
                        //command.Transaction =;
                        if (scope.Transaction != null)
                        {
                            command.Transaction = scope.Transaction.DangerousInternalTransaction;
                        }
                        // var fileID = Path.Combine("c:\\temp\\", this.ConnectionString.ToPathSafe() + ".txt");
                        foreach (var batch in GetBatches(sqlBuilder))
                        {
                            // File.AppendAllText(fileID, batch);
                            command.CommandText = batch;
                            Log.Debug(Environment.NewLine + batch);
                            //command.ExecuteNonQuery();
#warning this code needs to be studied for optimization

                            using (var reader = command.ExecuteReader(CommandBehavior.Default)) {
                                results.AddRange(reader.ToDataTables());
                            }
                        }
                    }
                }
                return(results.ToArray());
            } catch (Exception error) {
                Log.Error(error.ToDiagnosticString());
                throw;
            }
        }
Esempio n. 6
0
 protected override IEnumerable <string> GetBatches(ISQLBuilder sqlBuilder)
 {
     return
         (sqlBuilder
          .Statements
          .Where(s => s.Type != SQLStatementType.TCL && !string.IsNullOrEmpty(s.SQL))
          .Select(statement => statement.SQL));
 }
Esempio n. 7
0
 public VeryLargeSQLBuilder(ISQLBuilder internaBuilder, int scriptPageSize)
     : base(internaBuilder)
 {
     SystemLog.Info("VeryLargeScriptBuilder created - scriptPageSize = {0}", scriptPageSize);
     _pageSize            = scriptPageSize;
     _generatedContainers = new List <LargeCollection <SQLStatement> >();
     // We clear again, which forces the base implementation to recreate the container
     base.Clear();
 }
Esempio n. 8
0
 public ExecuteScriptForm(IDAC dac, ISQLBuilder script)
 {
     InitializeComponent();
     _scriptTextBox.Text = script.ToString();
     _scriptTextBox.FocusAtEnd();
     _databaseConnectionStringLabel.Text = dac.ConnectionString;
     DAC          = dac;
     Script       = script;
     DialogResult = DialogResult.Cancel;
 }
Esempio n. 9
0
        public static ISQLBuilder Update(this ISQLBuilder @this, DataRow dataRow)
        {
            var primaryKeyCols = dataRow.Table.PrimaryKey;
            var allCols        = dataRow.Table.Columns.Cast <DataColumn>();

            return
                (@this.Update(
                     dataRow.Table.TableName,
                     allCols.Except(primaryKeyCols).Select(c => new ColumnValue(c.ColumnName, dataRow[c])),
                     matchColumns: primaryKeyCols.Select(c => new ColumnValue(c.ColumnName, dataRow[c]))));
        }
Esempio n. 10
0
        public static ISQLBuilder Insert(this ISQLBuilder @this, DataRow dataRow)
        {
            var primaryKeyCols = dataRow.Table.PrimaryKey;
            var allCols        = dataRow.Table.Columns.Cast <DataColumn>();

            return
                (@this.Insert(
                     dataRow.Table.TableName,
                     (dataRow.Table.HasAutoIncrementPrimaryKey() ? allCols.Except(primaryKeyCols) : allCols)
                     .Select(c => new ColumnValue(c.ColumnName, dataRow[c]))));
        }
Esempio n. 11
0
        /// <summary>
        /// Routine to create an instance of the PFQueryBuilder class.
        /// </summary>
        /// <param name="dbPlat">Database platform to use.</param>
        /// <param name="connStr">Connection string for the query.</param>
        /// <param name="ansiLevel">AnsiSQLLevel for the query builder to use.</param>
        /// <returns>PFQueryBuilder object.</returns>
        public static ISQLBuilder CreateQueryBuilderObject(DatabasePlatform dbPlat, string connStr, AnsiSQLLevel ansiLevel)
        {
            ISQLBuilder qbf = null;

            qbf = LoadObjectFromAssembly(dbPlat);

            qbf.DatabasePlatform = qbf.ConvertDbPlatformToQueryBuilderPlatform(dbPlat);
            qbf.ConnectionString = connStr;
            qbf.AnsiSQLVersion   = ansiLevel;

            return(qbf);
        }
Esempio n. 12
0
        public static StringBuilder GenerateInsertStatement(ISQLBuilder builder, IEnumerable <GenerateConfig> configs)
        {
            var result = new StringBuilder();

            using (var writer = new StringWriter(result))
            {
                GenerateInsertStatement(builder, configs, writer);
            }
            GC.Collect();

            return(result);
        }
Esempio n. 13
0
        public RepositoryBase(JunDbContext dbContext, ISQLBuilder sqlBuilder, WebHelper webHelper, ILogger <RepositoryBase> logger)
        {
            this._dbContext  = dbContext;
            this._sqlBuilder = sqlBuilder;
            this._webHelper  = webHelper;
            this._logger     = logger;

            this.Conn = _dbContext.Database.GetDbConnection();
            if (Conn.State == System.Data.ConnectionState.Closed)
            {
                Conn.Open();
            }
        }
        //private ILogger<DefaultDatabase> _logger;

        //public IDatabaseEngine DatabaseEngine { get { return _databaseEngine; } }

        public DefaultDatabase(IDatabaseSettings databaseSettings, IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory modelDefFactory, IDatabaseEntityMapper modelMapper, ISQLBuilder sqlBuilder /*, ILogger<DefaultDatabase> logger*/)
        {
            if (databaseSettings.Version < 0)
            {
                throw new ArgumentException("Database Version should greater than 0");
            }

            _databaseSettings = databaseSettings;
            _databaseEngine   = databaseEngine;
            _entityDefFactory = modelDefFactory;
            _modelMapper      = modelMapper;
            _sqlBuilder       = sqlBuilder;
            //_logger = logger;
        }
Esempio n. 15
0
        /// <summary>
        /// 获取SQL构造实现
        /// </summary>
        /// <returns>SQL构造实现</returns>
        public static ISQLBuilder GetInstance()
        {
            if (builder == null)
            {
                lock (syncObj)
                {
                    if (builder == null)
                    {
                        builder = new SQLBuilderImpl();
                    }
                }
            }

            return builder;
        }
 public SQLBuilderWithTableBasedVariables(ISQLBuilder internalBuilder, string variableTableName = null, bool alreadyCreated = false) : base(internalBuilder)
 {
     VariableTableName           = variableTableName ?? "VAR" + Tools.Text.ToBase32(Guid.NewGuid().ToByteArray().ToASCIIString());   // "VAR7BHBHPURK64WYPK3PA2TT6K3U2";
     VariableTableHasBeenCreated = alreadyCreated;
     DontDropOnEnd         = alreadyCreated;
     _variableDeclarations = new Dictionary <string, Tuple <int, VariableStorageClass> >();
     _columnLookup         =
         Enum
         .GetValues(typeof(VariableStorageClass))
         .Cast <VariableStorageClass>()
         .OrderBy(x => x)
         .WithDescriptions()
         .Select(val =>
                 new {
         StorageClass = val.Item,
         Order        = val.Index,
         ColumnName   = val.Item.GetAttributes <DescriptionAttribute>().First().Description
     }
                 )
         .ToDictionary(x => x.StorageClass, x => Tuple.Create(x.Order, x.ColumnName));
 }
Esempio n. 17
0
        public static ISQLBuilder InsertSelect(
            this ISQLBuilder sqlBuilder,
            string insertTable,
            IEnumerable <string> insertColumns,
            string table,
            IEnumerable <object> columns = null,
            bool distinct = false,
            int?limit     = null,
            IEnumerable <ColumnValue> columnMatches = null,
            string whereClause   = null,
            string orderByClause = null
            )
        {
            if (columns != null && columns.Count() != insertColumns.Count())
            {
                throw new ArgumentException("Insert column count doesnt match select", "insertColumns");
            }
            sqlBuilder.Emit("INSERT INTO ").TableName(insertTable);

            if (insertColumns.Any())
            {
                sqlBuilder.Emit(" (");
                insertColumns.WithDescriptions().ForEach(
                    c => {
                    if (!c.Description.HasFlag(EnumeratedItemDescription.First))
                    {
                        sqlBuilder.Emit(", ");
                    }

                    sqlBuilder.ColumnName(c.Item);
                }
                    );
            }
            sqlBuilder.Emit(")").NewLine();
            return(sqlBuilder.Select(table, columns: columns, distinct: distinct, limit: limit, columnMatches: columnMatches, whereClause: whereClause, orderByClause: orderByClause));
        }
Esempio n. 18
0
 protected virtual IEnumerable <string> GetBatches(ISQLBuilder sqlBuilder)
 {
     return(new[] { sqlBuilder.ToString() });
 }
Esempio n. 19
0
        public static ISQLBuilder DuplicateRow(this ISQLBuilder sqlBuilder, DBTableSchema table, IEnumerable <object> sourcePrimaryKey, IEnumerable <object> destPrimaryKey, out string identityVariable, IEnumerable <ColumnValue> overrideColumns = null)
        {
            // Query structure:
            // INSERT INTO Table([PkCol1], ..., [PkColN], [NonPkCol1], ..., [NonPkColN]) VALUES SELECT {destPrimaryKey1}, ..., {destPrimaryKeyN}, [NonPkCol1], ..., [NonPkColN] FROM Table WHERE [PkCol1] = {sourcePrimaryKey1}, ..., [PkColN] = {sourcePrimaryKeyN}

            bool isAutoIncrement;
            bool usesGenerator;
            bool specifiesPrimaryKey;

            #region Validation
            if (sourcePrimaryKey == null)
            {
                throw new SoftwareException("Source primary key not specified");
            }

            if (destPrimaryKey == null)
            {
                destPrimaryKey = Enumerable.Empty <object>();
            }

            if (overrideColumns == null)
            {
                overrideColumns = Enumerable.Empty <ColumnValue>();
            }

            if (table.PrimaryKeyColumns.Length == 0)
            {
                throw new SoftwareException("Table '{0}' does not have a primary key", table.Name);
            }

            if (!sourcePrimaryKey.Any())
            {
                throw new SoftwareException("Inconsistent primary key parameter. Table {0} primary key has {1} columns, argument specified {2} values", table.Name, table.PrimaryKeyColumns.Length, sourcePrimaryKey.Count());
            }

            isAutoIncrement     = table.PrimaryKeyColumns.Length == 1 && table.PrimaryKeyColumns[0].IsAutoIncrement;
            usesGenerator       = false;
            specifiesPrimaryKey = destPrimaryKey.Any();

            if (!(isAutoIncrement || usesGenerator) && !specifiesPrimaryKey)
            {
                throw new SoftwareException("Destination primary key not specified");
            }
            #endregion

            identityVariable = null;

            var sourcePrimaryKeyArray = sourcePrimaryKey.ToArray();

            // Declare variable to store generated identity (if applicable)
            if ((isAutoIncrement || usesGenerator) && !specifiesPrimaryKey)
            {
                identityVariable = string.Format("uniquedup{0}", sqlBuilder.VariableDeclarationCount + 1);
                sqlBuilder.DeclareVariable(identityVariable, typeof(long));
            }

            // get the non-primary key columns
            var nonPkColumns = table.Columns.Where(c => !c.IsPrimaryKey);

            // disable autoincrement if user specified key
            if (isAutoIncrement && specifiesPrimaryKey)
            {
                sqlBuilder.DisableAutoIncrementID(table.Name);
            }

            sqlBuilder
            .Emit("INSERT INTO ").TableName(table.Name).Emit("(");

            // TODO: Changed Union to Concat -- will this introduce errors?
            ((specifiesPrimaryKey || usesGenerator) ?
             table.PrimaryKeyColumns :
             Enumerable.Empty <DBColumnSchema>()
            ).Concat(nonPkColumns)
            .WithDescriptions()
            .ForEach(
                colDescription => {
                if (colDescription.Index > 0)
                {
                    sqlBuilder.Emit(", ");
                }
                sqlBuilder.ColumnName(colDescription.Item.Name);
            }
                );


            sqlBuilder.Emit(") SELECT ");

            var overrideColumnsLookup = overrideColumns.ToDictionary(c => c.ColumnName, c => c.Value);
            if (specifiesPrimaryKey)
            {
                // insert explicit primary key values
                destPrimaryKey
                .WithDescriptions()
                .ForEach(
                    destPrimaryKeyValue => {
                    if (destPrimaryKeyValue.Index > 0)
                    {
                        sqlBuilder.Emit(", ");
                    }
                    sqlBuilder.Literal(destPrimaryKeyValue.Item);
                }
                    );
            }
            else if (usesGenerator)
            {
                // insert call to generator
                throw new NotImplementedException();
            }

            nonPkColumns
            .WithDescriptions()
            .ForEach(
                colDescription => {
                if (specifiesPrimaryKey || usesGenerator || colDescription.Index > 0)
                {
                    sqlBuilder.Emit(", ");
                }

                if (overrideColumnsLookup.ContainsKey(colDescription.Item.Name))
                {
                    sqlBuilder.Literal(overrideColumnsLookup[colDescription.Item.Name]);
                }
                else
                {
                    sqlBuilder.ColumnName(colDescription.Item.Name);
                }
            }
                );
            sqlBuilder.Emit(" FROM ").TableName(table.Name).Emit(" WHERE ");
            table
            .PrimaryKeyColumns
            .WithDescriptions()
            .ForEach(
                pkCol => {
                if (pkCol.Index > 0)
                {
                    sqlBuilder.Emit(" AND ");
                }

                sqlBuilder
                .ColumnName(pkCol.Item.Name)
                .Emit(" = ")
                .Literal(sourcePrimaryKeyArray[pkCol.Index]);
            }
                );

            sqlBuilder.EndOfStatement();

            if (isAutoIncrement)
            {
                sqlBuilder.EnableAutoIncrementID(table.Name);
            }

            if ((isAutoIncrement || usesGenerator) && !specifiesPrimaryKey)
            {
                sqlBuilder.AssignVariable(identityVariable, SQLBuilderCommand.LastIdentity(table.Name));
            }

            return(sqlBuilder);
        }
Esempio n. 20
0
        public static string QuickString(this ISQLBuilder sqlBuilder, string sql, params object[] args)
        {
            var newBuilder = sqlBuilder.CreateBuilder();

            return(newBuilder.Emit(sql, args).ToString());
        }
Esempio n. 21
0
 public static ISQLBuilder Select(this ISQLBuilder sqlBuilder, string tableName, IEnumerable <string> columns = null, bool distinct = false, int?limit = null, IEnumerable <ColumnValue> columnMatches = null, string whereClause = null, string orderByClause = null)
 {
     return(sqlBuilder.Select(tableName, columns: columns != null ? columns.Cast <object>() : null, distinct: distinct, limit: limit, columnMatches: columnMatches, whereClause: whereClause, orderByClause: orderByClause));
 }
Esempio n. 22
0
 public static ISQLBuilder TriggerName(this ISQLBuilder sqlBuilder, string name)
 {
     return(sqlBuilder.ObjectName(name));
 }
Esempio n. 23
0
 public static ISQLBuilder InsertMany <T>(this ISQLBuilder sqlBuilder, string table, IEnumerable <string> columns, IEnumerable <T> values) where T : IEnumerable <object>
 {
     return(sqlBuilder.InsertMany(table, columns, values.Select(v => v.Cast <object>())));
 }
Esempio n. 24
0
 public override void Execute(ISQLBuilder builder)
 {
     builder.Literal(LiteralValue);
 }
Esempio n. 25
0
 public VeryLargeSQLBuilder(ISQLBuilder internaBuilder) : this(internaBuilder, DefaultScriptPageSize)
 {
 }
Esempio n. 26
0
 public override void Execute(ISQLBuilder builder)
 {
     builder.Cast(ValueKind, Value, Type);
 }
Esempio n. 27
0
 public BatchSQLBuilder(ISQLBuilder decoratedBuilder, uint batchSize)
     : base(decoratedBuilder)
 {
     _batchSize = Tools.Maths.ClipValue(batchSize, 1, uint.MaxValue - 1);
 }
Esempio n. 28
0
 public override void Execute(ISQLBuilder builder)
 {
     builder.EndOfStatement(StatementType);
 }
Esempio n. 29
0
 public static ISQLBuilder TableName(this ISQLBuilder sqlBuilder, string name, TableType tableType = TableType.Persistent)
 {
     return(sqlBuilder.TableName(name, tableType));
 }
Esempio n. 30
0
 public override void Execute(ISQLBuilder builder)
 {
     builder.VariableName(VariableName);
 }