public async Task Sync(SynchronizationSet synchronization) { await _loadSchema.Load(synchronization); if (await _tableComparer.Compare(synchronization) == false) { _logger.LogError("Table compare fail for {SyncSetName}", synchronization.Name); return; } if (synchronization.IsDryRun) { _logger.LogInformation("{SyncSetName} dry run is enabled", synchronization.Name); } foreach (var table in synchronization.Tables) { _logger.LogInformation("Table {TableName} sync started", table.Name); var sourceTable = synchronization.SourceDatabase.Tables.Single(x => x.Name == table.Name); var tableSync = _serviceProvider.GetRequiredService <ITableSyncWorker>(); await tableSync.Sync(synchronization, table, sourceTable); _logger.LogInformation("Table {TableName} sync completed", table.Name); } }
public async Task <bool> Sync(SynchronizationSet syncSet, Table table, TableSchema tableSchema) { _logger.LogInformation("{TableName} - sync started", table.Name); _syncSet = syncSet; _table = table; _tableSchema = tableSchema; _sourceQueryFactory = _queryFactory.GetSource(syncSet.Name); _destinationQueryFactory = _queryFactory.GetDestination(syncSet.Name); _primaryKeys = _tableSchema.Columns.Where(x => x.IsPrimaryKey).ToList(); _identityColumns = _tableSchema.Columns.Where(x => x.IsIdentity).ToList(); _sourceQuery = BuildSourceQuery(BuildMainQuery(_sourceQueryFactory)); _destinationQuery = BuildMainQuery(_destinationQueryFactory); ThreadPool.QueueUserWorkItem(InsertWorker); ThreadPool.QueueUserWorkItem(UpdateWorker); Merge(); FinalizeInsertDestination(); FinalizeUpdateDestination(); _cancellationToken.Cancel(); _logger.LogInformation("{TableName} - sync completed", table.Name); return(true); }
public async Task <bool> Compare(SynchronizationSet syncSet) { _syncSet = syncSet; _sourceQuery = _queryFactory.GetSource(syncSet.Name); _destinationQuery = _queryFactory.GetDestination(syncSet.Name); return(Compare(syncSet.SourceDatabase.Tables, syncSet.DestinationDatabase.Tables)); }
public async Task <bool> Load(SynchronizationSet syncSet) { _logger.LogInformation("Load {SyncSetName} schema", syncSet.Name); _syncSet = syncSet; _sourceQuery = _queryFactory.GetSource(syncSet.Name); _destinationQuery = _queryFactory.GetDestination(syncSet.Name); List <TableSchema> sourceTables = (await GetTables(_sourceQuery)).Where(x => syncSet.Tables.Any(table => table.Name == x.Name)).ToList(); List <TableSchema> destinationTables = (await GetTables(_destinationQuery)).Where(x => syncSet.Tables.Any(table => table.Name == x.Name)).ToList(); foreach (var table in sourceTables) { _logger.LogDebug("Load source table {TableName} schema", table.Name); table.Columns = (await GetTableColumns(_sourceQuery, table.ObjectId)).ToList(); } foreach (var table in destinationTables) { _logger.LogDebug("Load destination table {TableName} schema", table.Name); table.Columns = (await GetTableColumns(_destinationQuery, table.ObjectId)).ToList(); } syncSet.SourceDatabase = new DatabaseSchema() { Tables = sourceTables }; syncSet.DestinationDatabase = new DatabaseSchema() { Tables = destinationTables }; _logger.LogInformation("Loaded {SyncSetName} schema", syncSet.Name); return(true); }