public IEnumerable <TableQuerySummary> RolledBackExecute(ConversionScriptResult scriptResult)
        {
            var identifiers = scriptResult.Data.SelectMany(x => x.Value).Select(x => x.DocumentId).Distinct().ToList();

            // first, delete all the rows that might already exist there
            foreach (var sqlReplicationTable in cfg.SqlReplicationTables)
            {
                var commands = new List <DbCommand>();
                DeleteItems(sqlReplicationTable.TableName, sqlReplicationTable.DocumentKeyColumn, cfg.ParameterizeDeletesDisabled,
                            identifiers, commands.Add);
                yield return(TableQuerySummary.GenerateSummaryFromCommands(sqlReplicationTable.TableName, commands));
            }

            foreach (var sqlReplicationTable in cfg.SqlReplicationTables)
            {
                List <ItemToReplicate> dataForTable;
                if (scriptResult.Data.TryGetValue(sqlReplicationTable.TableName, out dataForTable) == false)
                {
                    continue;
                }
                var commands = new List <DbCommand>();
                InsertItems(sqlReplicationTable.TableName, sqlReplicationTable.DocumentKeyColumn, dataForTable, commands.Add);

                yield return(TableQuerySummary.GenerateSummaryFromCommands(sqlReplicationTable.TableName, commands));
            }

            Rollback();
        }
Example #2
0
        public SqlEtlTestScriptResult RunTest(DocumentsOperationContext context, IEnumerable <SqlTableWithRecords> toWrite, bool performRolledBackTransaction)
        {
            var summaries = new List <TableQuerySummary>();

            if (performRolledBackTransaction)
            {
                try
                {
                    using (var writer = new RelationalDatabaseWriter(this, Database))
                    {
                        foreach (var records in toWrite)
                        {
                            var commands = new List <DbCommand>();

                            writer.Write(records, commands, CancellationToken);

                            summaries.Add(TableQuerySummary.GenerateSummaryFromCommands(records.TableName, commands));
                        }

                        writer.Rollback();
                    }
                }
                catch (Exception e)
                {
                    Statistics.RecordLoadError(e.ToString(), documentId: null, count: 1);
                }
            }
            else
            {
                var simulatedWriter = new RelationalDatabaseWriterSimulator(Configuration);

                foreach (var records in toWrite)
                {
                    var commands = simulatedWriter.SimulateExecuteCommandText(records, CancellationToken).Select(x => new TableQuerySummary.CommandData
                    {
                        CommandText = x
                    }).ToArray();

                    summaries.Add(new TableQuerySummary
                    {
                        TableName = records.TableName,
                        Commands  = commands
                    });
                }
            }

            return(new SqlEtlTestScriptResult
            {
                TransformationErrors = Statistics.TransformationErrorsInCurrentBatch.Errors.ToList(),
                LoadErrors = Statistics.LastLoadErrorsInCurrentBatch.Errors.ToList(),
                SlowSqlWarnings = Statistics.LastSlowSqlWarningsInCurrentBatch.Statements.ToList(),
                Summary = summaries
            });
        }
Example #3
0
        private IEnumerable <string> GenerteInsertItemCommandText(string tableName, string pkName, List <ToSqlItem> dataForTable, CancellationToken token)
        {
            foreach (var itemToReplicate in dataForTable)
            {
                token.ThrowIfCancellationRequested();

                var sb = new StringBuilder("INSERT INTO ")
                         .Append(GetTableNameString(tableName))
                         .Append(" (")
                         .Append(_commandBuilder.QuoteIdentifier(pkName))
                         .Append(", ");
                foreach (var column in itemToReplicate.Columns)
                {
                    if (column.Id == pkName)
                    {
                        continue;
                    }
                    sb.Append(_commandBuilder.QuoteIdentifier(column.Id)).Append(", ");
                }
                sb.Length = sb.Length - 2;


                sb.Append(") \r\nVALUES (")
                .Append("'")
                .Append(itemToReplicate.DocumentId)
                .Append("'")
                .Append(", ");

                foreach (var column in itemToReplicate.Columns)
                {
                    if (column.Id == pkName)
                    {
                        continue;
                    }
                    DbParameter param = new SqlParameter();
                    RelationalDatabaseWriter.SetParamValue(param, column, null);

                    sb.Append(TableQuerySummary.GetParameterValue(param)).Append(", ");
                }

                sb.Length = sb.Length - 2;
                sb.Append(")");
                if (IsSqlServerFactoryType && _configuration.ForceQueryRecompile)
                {
                    sb.Append(" OPTION(RECOMPILE)");
                }

                sb.Append(";");

                yield return(sb.ToString());
            }
        }
            public static TableQuerySummary GenerateSummaryFromCommands(string tableName, IEnumerable <DbCommand> commands)
            {
                var tableQuerySummary = new TableQuerySummary();

                tableQuerySummary.TableName = tableName;
                tableQuerySummary.Commands  =
                    commands
                    .Select(x => new CommandData()
                {
                    CommandText = x.CommandText,
                    Params      = x.Parameters.Cast <DbParameter>().Select(y => new KeyValuePair <string, object>(y.ParameterName, y.Value)).ToArray()
                }).ToArray();

                return(tableQuerySummary);
            }
Example #5
0
        public SqlEtlSimulationResult Simulate(SimulateSqlEtl simulateSqlEtl, DocumentsOperationContext context, IEnumerable <SqlTableWithRecords> toWrite)
        {
            var summaries = new List <TableQuerySummary>();

            if (simulateSqlEtl.PerformRolledBackTransaction)
            {
                using (var writer = new RelationalDatabaseWriter(this, Database))
                {
                    foreach (var records in toWrite)
                    {
                        var commands = new List <DbCommand>();

                        writer.Write(records, commands, CancellationToken);

                        summaries.Add(TableQuerySummary.GenerateSummaryFromCommands(records.TableName, commands));
                    }

                    writer.Rollback();
                }
            }
            else
            {
                var simulatedwriter = new RelationalDatabaseWriterSimulator(Configuration);

                foreach (var records in toWrite)
                {
                    var commands = simulatedwriter.SimulateExecuteCommandText(records, CancellationToken).Select(x => new TableQuerySummary.CommandData
                    {
                        CommandText = x
                    }).ToArray();

                    summaries.Add(new TableQuerySummary
                    {
                        TableName = records.TableName,
                        Commands  = commands
                    });
                }
            }

            return(new SqlEtlSimulationResult
            {
                LastAlert = Statistics.LastAlert,
                Summary = summaries
            });
        }
 public static TableQuerySummary GenerateSummaryFromCommands(string tableName, IEnumerable<DbCommand> commands)
 {
     var tableQuerySummary = new TableQuerySummary();
     tableQuerySummary.TableName = tableName;
     tableQuerySummary.Commands  =
         commands
             .Select(x => new CommandData()
             {
                 CommandText = x.CommandText,
                 Params = x.Parameters.Cast<DbParameter>().Select(y=> new KeyValuePair<string,object>(y.ParameterName,y.Value)).ToArray()
             }).ToArray();
     
     return tableQuerySummary;
 }