Exemple #1
0
        public void Execute()
        {
            List <string> tableNames = source.GetAllTableNames();

            tableNames = tableNames.OrderBy(x => x).ToList();

            foreach (string tableName in tableNames)
            {
                if (tableName.StartsWith("pg_catalog."))
                {
                    continue;
                }
                if (tableName.StartsWith("information_schema."))
                {
                    continue;
                }

                List <DatabaseColumn> columns = source.Sync_DefineTable(tableName);
                if (!columns.Any(x => x.ColumnName.ToLowerInvariant().Equals("dateadded")))
                {
                    Console.WriteLine("DateAdded column is missing in {0}!", tableName);
                    continue;
                }

                foreach (DatabaseColumn column in columns)
                {
                    if (IsNumericString(column.ColumnName))
                    {
                        column.ColumnName = "\"" + column.ColumnName + "\"";
                    }
                }
                AutoGenerateParameterNames(columns);
                if (!target.Sync_DoesTableExist(tableName))
                {
                    target.Sync_CreateTable(tableName, columns);
                }

                //Alter Table wenn nötig
                List <DatabaseColumn> missingColumns  = source.Sync_DefineTable(tableName);
                List <DatabaseColumn> existingColumns = target.Sync_DefineTable(tableName);
                foreach (DatabaseColumn existingColumn in existingColumns)
                {
                    DatabaseColumn pgColumn = missingColumns.Find(x => x.ColumnName.ToLowerInvariant().Equals(existingColumn.ColumnName.ToLowerInvariant()));
                    if (pgColumn != null)
                    {
                        missingColumns.Remove(pgColumn);
                    }
                }

                foreach (DatabaseColumn missingColumn in missingColumns)
                {
                    Message(String.Format("Spalte hinzufügen: {0}", missingColumn));
                    target.Sync_AlterTable(tableName, missingColumn);
                }

                //Delta
                Message(String.Format("Berechne \u0394 für {0}", tableName));
                DateTime?latestInsert           = target.Sync_GetLastSyncDateForTable(tableName);
                bool     partialUpdatesPossible = columns.Any(x => x.ColumnName.ToLowerInvariant().Equals("dateupdated"));
                DateTime?latestUpdate           = null;

                if (partialUpdatesPossible)
                {
                    //Delta 2
                    Message(String.Format("Berechne \u03942 für {0}", tableName));
                    latestUpdate = target.Sync_GetLatestUpdateForTable(tableName);
                }

                //Delta
                Message(String.Format("Lese \u0394 für {0}", tableName));
                DbDataReader syncReader = source.Sync_GetSyncReader(tableName, latestInsert);
                target.Sync_CopyFrom(tableName, columns, syncReader, Message);
                if (partialUpdatesPossible)
                {
                    //Delta 2
                    Message(String.Format("Lese \u03942 für {0}", tableName));
                    syncReader = source.Sync_GetUpdateSyncReader(tableName, latestUpdate);
                    if (latestUpdate != null)
                    {
                        Queue <object> leftovers = new Queue <object>();
                        target.Sync_CopyUpdatesFrom(tableName, columns, syncReader, Message, leftovers);

                        if (leftovers.Count > 0)
                        {
                            DatabaseColumn idColumn = GetIdColumn(columns);
                            while (leftovers.Count > 0)
                            {
                                Message(String.Format("\u03943 für {0} wird verarbeitet...", tableName));
                                DbDataReader reader =
                                    source.Sync_ArbitrarySelect(tableName, idColumn, leftovers.Dequeue());
                                target.Sync_CopyFrom(tableName, columns, reader, Message);
                            }
                        }
                    }
                }
                syncReader.Close();
            }

            List <SqlIndex> sourceIndexes = source.GetSqlIndexes().ToList();
            List <SqlIndex> targetIndexes = target.GetSqlIndexes().ToList();

            foreach (SqlIndex index in sourceIndexes)
            {
                if (targetIndexes.Contains(index))
                {
                    continue;
                }
                Message(String.Format("Create Index: {0}", index.IndexName));
                target.CreateIndex(index);
            }
        }