Пример #1
0
        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");
                }
            }
        }
Пример #2
0
        // - - - - - - - - - - - - - - - - - - - - - - - - - - -

        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");
                }
            }
        }
Пример #3
0
        // - - - - - - - - - - - - - - - - - - - - - - - - - - -

        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   -----------------------------------------------");
        }
Пример #4
0
        internal static SyncLink GetById(int value, SyncDatabase db)
        {
            SyncLink result = new SyncLink();

            result.Id = value;
            if (result.Fill(db))
            {
                return(result);
            }
            return(null);
        }
Пример #5
0
        // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        /// <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);
        }
Пример #6
0
 public SyncSession(SyncLink Link)
 {
     this._Link = Link;
 }