public WcfReplicationSchemaItem(IReplicationSchemaItem sourceSchemaItem) { if (sourceSchemaItem == null) { throw new ArgumentNullException("sourceSchemaItem"); } this.Schema = sourceSchemaItem; }
private void UpdateSchemaItem(IReplicationSchema remoteSchema, IReplicationSchemaItem remoteSchemaItem) { if (remoteSchema == null) { throw new ArgumentNullException("remoteSchema"); } if (remoteSchemaItem == null) { throw new ArgumentNullException("remoteSchemaItem"); } bool forCurrentStorage = remoteSchemaItem.StorageID == this.Engine.CurrentNode.UniqueID; bool isStrongRelation = remoteSchemaItem.RelationType == ReplicationRelation.Strong; //хост хранилища может поменяться //ищем по UniqueID и если не совпадают хосты, то меняем хост //доверяем хосту, только от которого пришел ответ if (forCurrentStorage) { if (isStrongRelation) { //есть строгая ссылка на текущий узел, для узла, с которого пришел запрос. #region Обновление информации об узле bool justCreated; StorageNode remoteNode = this.EnsureNode(remoteSchema.StorageID, remoteSchema.Host, out justCreated); if (!justCreated) { //если узел уже был, то проверяем нужно ли обновить хост существующего узла if (remoteNode.Host.ToLower() != remoteSchema.Host.ToLower()) { lock (_updateStorageLocker) { if (remoteNode.Host.ToLower() != remoteSchema.Host.ToLower()) { remoteNode.Host = remoteSchema.Host.ToLower(); remoteNode.Update(); } } } } #endregion } } //если это STRONG признак, то создаем, если настройки нет foreach (string folderUrl in remoteSchemaItem.Folders) { if (isStrongRelation) { #region strong relation //настройка пришла непосредственно с узла схемы и на этом узле есть //если она предназначена для текущего узла, то создаем/снимаем признак удаленности if (forCurrentStorage) { //узел remote схемы bool justCreated; StorageNode remoteNode = this.EnsureNode(remoteSchema.StorageID, remoteSchema.Host, out justCreated); //получаем папку для репликации с remote узлом bool replicationFolderJustCreated; ReplicationFolder replicationFolder = this.EnsureReplicationFolder(remoteNode, folderUrl, false, out replicationFolderJustCreated); if (!replicationFolderJustCreated) { //если настройка существовала и была удалена, то восстанавливаем ее if (replicationFolder.Deleted) { replicationFolder.Deleted = false; replicationFolder.Update(); } } } else { //Strong ссылка на репликацию с 3-им (отличным от текущего) узлом, //смотрим если на текущем узле есть пересекающиеся папки, то добавляем weak настройку this.AddWeakRelation(remoteSchemaItem.StorageID, remoteSchemaItem.Name, folderUrl); } #endregion } else { if (forCurrentStorage) { //слабые ссылки на самого себя не надо восстанавливать continue; } //если это WEAK признак, то создаем, только если есть пересекающиеся настройки this.AddWeakRelation(remoteSchemaItem.StorageID, remoteSchemaItem.Name, folderUrl); //проверку на признак удаления делать не нужно, т.к. ссылка слабая } } }