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(); }
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 }); }
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); }
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; }