private void SyncLocalFromRemote() { if (_RemoteToLocalLinkId >= 0) { if (log.IsDebugEnabled) { log.Debug("SyncLocalFromRemote:begin"); } StateChange(SyncState.SyncLocalFromRemoteStarted); _RemoteToLocalLink = Remote.GetSyncLink(_RemoteToLocalLinkId); if (_RemoteToLocalLink == null) { throw new ArgumentException(string.Format("Не найдена связь по идентификатору ({0}) в удаленном провайдере!", _RemoteToLocalLinkId)); } ExecuteSession(Remote, Local, _RemoteToLocalLink, _RemoteFilters); jnl.RemoteReplicaCount = replicaLogItemsCount; StateChange(SyncState.SyncLocalFromRemoteCompleted); if (log.IsDebugEnabled) { log.Debug("SyncLocalFromRemote:end"); } } }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - private void SyncRemoteFromLocal() { if (_LocalToRemoteLinkId > 0) { if (log.IsDebugEnabled) { log.Debug("SyncRemoteFromLocal:begin"); } StateChange(SyncState.SyncRemoteFromLocalStarted); _LocalToRemoteLink = Local.GetSyncLink(LocalToRemoteLinkId); if (_LocalToRemoteLink == null) { throw new ArgumentException(string.Format("Не найдена связь по идентификатору ({0}) в локальном провайдере!", LocalToRemoteLinkId)); } ExecuteSession(Local, Remote, _LocalToRemoteLink, _LocalFilters); jnl.LocalReplicaCount = replicaLogItemsCount; StateChange(SyncState.SyncRemoteFromLocalCompleted); if (log.IsDebugEnabled) { log.Debug("SyncRemoteFromLocal:end"); } } }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - private void ExecuteSession(ISyncDatabase local, ISyncDatabase remote, SyncLink link, SyncLinkFilterList Filters) { log.InfoFormat("=== выполняется синхронизация", local.Name, remote.Name); // запуск сеанса local.StartSession(SessionMode.Read); // подготовка реплик SyncLogReplicaInfo replicaInfo = local.SourcePrepare(link); replicaLogItemsCount = replicaInfo.LogCount; if (replicaInfo.LogCount > 1) { SyncLogReplica replica = local.SourceGetNextReplica(replicaInfo, SourcePrepareOptions.None, Filters); remote.StartSession(SessionMode.Write); OnStageCompleted(); SyncReplicaProcessResult result = remote.TargetProcessReplica(replica, TargetProcessOptions.None); OnStageCompleted(); if (result.Success) { remote.EndSession(true); OnStageCompleted(); local.SourceCommitReplica(replicaInfo); } else { log.ErrorFormat("обработка реплики прошла неудачно (возможно были ошибки) - транзакция не подтверджается"); jnl.Success = false; remote.EndSession(false); OnStageCompleted(); local.EndSession(false); return; } } else { log.InfoFormat("нет данных журнала синхронизации", local.Name, remote.Name); remote.EndSession(true); OnStageCompleted(); } local.EndSession(true); string local_messages = local.GetLogMessages(); string remote_messages = remote.GetLogMessages(); logMessages.AppendLine("--- BEGIN LOCAL LOG MESSAGES ------------------------------------------------"); logMessages.Append(local_messages); logMessages.AppendLine("--- END LOCAL LOG MESSAGES ------------------------------------------------"); logMessages.AppendLine("--- BEGIN REMOTE LOG MESSAGES -----------------------------------------------"); logMessages.Append(remote_messages); logMessages.AppendLine("--- END REMOTE LOG MESSAGES -----------------------------------------------"); }
internal static SyncLink GetById(int value, SyncDatabase db) { SyncLink result = new SyncLink(); result.Id = value; if (result.Fill(db)) { return(result); } return(null); }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /// <summary> /// получение параметров обмена /// </summary> /// <param name="batchSize"></param> /// <param name="knowledge"></param> public override void GetSyncBatchParameters(out uint batchSize, out SyncKnowledge knowledge) { _Link = SyncLink.GetById(_LinkId, Db); if (_Link == null) { throw new ArgumentException("Не задан идентификатор соединения для синхронизации!"); } Db.FillSyncLogTable(tableSyncLog, Link.Id); batchSize = Convert.ToUInt32(tableSyncLog.Rows.Count); knowledge = new DbSyncKnowledge(this); }
public SyncSession(SyncLink Link) { this._Link = Link; }