private void RestoreTable(IDbConnection connection, TableInfo tableInfo, ref int transactionsCommited, ref int rowsInserted) { using (var stream = _reader.GetEntry(KeyHelper.GetTableZipKey(_module, tableInfo.Name))) { var lowImportanceRelations = _module .TableRelations .Where(r => string.Equals(r.ParentTable, tableInfo.Name, StringComparison.InvariantCultureIgnoreCase)) .Where(r => r.Importance == RelationImportance.Low && !r.IsSelfRelation()) .Select(r => Tuple.Create(r, _module.Tables.Single(t => t.Name == r.ChildTable))) .ToList(); foreach (IEnumerable <DataRowInfo> rows in GetRows(tableInfo, stream).Skip(transactionsCommited * TransactionLength).MakeParts(TransactionLength)) { using (var transaction = connection.BeginTransaction()) { int rowsSuccess = 0; foreach (DataRowInfo row in rows) { if (_replaceDate) { foreach (var column in tableInfo.DateColumns) { _columnMapper.SetDateMapping(tableInfo.Name, column, row[column.Key]); } } object oldIdValue = null; object newIdValue = null; if (tableInfo.HasIdColumn()) { oldIdValue = row[tableInfo.IdColumn]; newIdValue = _columnMapper.GetMapping(tableInfo.Name, tableInfo.IdColumn, oldIdValue); if (newIdValue == null) { if (tableInfo.IdType == IdType.Guid) { newIdValue = Guid.NewGuid().ToString("D"); } else if (tableInfo.IdType == IdType.Integer) { newIdValue = connection .CreateCommand(string.Format("select max({0}) from {1};", tableInfo.IdColumn, tableInfo.Name)) .WithTimeout(120) .ExecuteScalar <int>() + 1; } } if (newIdValue != null) { _columnMapper.SetMapping(tableInfo.Name, tableInfo.IdColumn, oldIdValue, newIdValue); } } var insertCommand = _module.CreateInsertCommand(connection, _columnMapper, tableInfo, row); if (insertCommand == null) { WarnCantInsertRow(row); _columnMapper.Rollback(); continue; } insertCommand.WithTimeout(120).ExecuteNonQuery(); rowsSuccess++; if (tableInfo.HasIdColumn() && tableInfo.IdType == IdType.Autoincrement) { var lastIdCommand = _factory.CreateLastInsertIdCommand(_module.ConnectionStringName); lastIdCommand.Connection = connection; newIdValue = Convert.ToInt32(lastIdCommand.ExecuteScalar()); _columnMapper.SetMapping(tableInfo.Name, tableInfo.IdColumn, oldIdValue, newIdValue); } _columnMapper.Commit(); foreach (Tuple <RelationInfo, TableInfo> relation in lowImportanceRelations) { if (!relation.Item2.HasTenantColumn()) { InvokeWarning("Table {0} does not contain tenant id column. Can't apply low importance relations on such tables.", relation.Item2.Name); continue; } object oldValue = row[relation.Item1.ParentColumn]; object newValue = _columnMapper.GetMapping(relation.Item1.ParentTable, relation.Item1.ParentColumn, oldValue); connection.CreateCommand(string.Format("update {0} set {1} = {2} where {1} = {3} and {4} = {5}", relation.Item1.ChildTable, relation.Item1.ChildColumn, newValue is string? "'" + newValue + "'" : newValue, oldValue is string? "'" + oldValue + "'" : oldValue, relation.Item2.TenantColumn, _columnMapper.GetTenantMapping())).WithTimeout(120).ExecuteNonQuery(); } } transaction.Commit(); transactionsCommited++; rowsInserted += rowsSuccess; } } } }
public static ColumnMapper ForRestoreDemoPortal(int tenantID) { var columnMapper = new ColumnMapper(); columnMapper.SetMapping("tenants_tenants", "id", tenantID); //set up for projects: columnMapper.SetMapping("projects_comments", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_messages", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_messages", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_milestones", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_milestones", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_milestones", "deadline", DateTime.UtcNow.AddDays(7), val => !IsDefaultDateTime(val)); columnMapper.SetMapping("projects_projects", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_projects", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_project_participant", "created", DateTime.UtcNow); columnMapper.SetMapping("projects_project_participant", "updated", DateTime.UtcNow); columnMapper.SetMapping("projects_report_template", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_subtasks", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_subtasks", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_tags", "create_on", DateTime.UtcNow, val => !IsDefaultDateTime(val)); columnMapper.SetMapping("projects_tags", "last_modified_on", DateTime.UtcNow, val => !IsDefaultDateTime(val)); columnMapper.SetMapping("projects_tasks", "deadline", DateTime.UtcNow.AddDays(7), val => !IsDefaultDateTime(val)); columnMapper.SetMapping("projects_tasks", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_tasks", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_tasks", "start_date", DateTime.UtcNow); columnMapper.SetMapping("projects_templates", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_templates", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_time_tracking", "create_on", DateTime.UtcNow); //set up for crm: columnMapper.SetMapping("crm_task", "deadline", DateTime.UtcNow.AddDays(7), val => !IsDefaultDateTime(val)); return(columnMapper); }
public static ColumnMapper ForRestoreDemoPortal(int tenantID) { var columnMapper = new ColumnMapper(); columnMapper.SetMapping("tenants_tenants", "id", tenantID); //set up for projects: columnMapper.SetMapping("projects_comments", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_messages", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_messages", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_milestones", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_milestones", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_milestones", "deadline", DateTime.UtcNow.AddDays(7), val => !IsDefaultDateTime(val)); columnMapper.SetMapping("projects_projects", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_projects", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_project_participant", "created", DateTime.UtcNow); columnMapper.SetMapping("projects_project_participant", "updated", DateTime.UtcNow); columnMapper.SetMapping("projects_report_template", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_subtasks", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_subtasks", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_tags", "create_on", DateTime.UtcNow, val => !IsDefaultDateTime(val)); columnMapper.SetMapping("projects_tags", "last_modified_on", DateTime.UtcNow, val => !IsDefaultDateTime(val)); columnMapper.SetMapping("projects_tasks", "deadline", DateTime.UtcNow.AddDays(7), val => !IsDefaultDateTime(val)); columnMapper.SetMapping("projects_tasks", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_tasks", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_tasks", "start_date", DateTime.UtcNow); columnMapper.SetMapping("projects_templates", "create_on", DateTime.UtcNow); columnMapper.SetMapping("projects_templates", "last_modified_on", DateTime.UtcNow); columnMapper.SetMapping("projects_time_tracking", "create_on", DateTime.UtcNow); //set up for crm: columnMapper.SetMapping("crm_task", "deadline", DateTime.UtcNow.AddDays(7), val => !IsDefaultDateTime(val)); return columnMapper; }