Exemple #1
0
        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;
                    }
                }
            }
        }
Exemple #2
0
        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;
        }