/// <summary> /// Обновление схемы метаданных без ключей. /// </summary> private void UpdateEmptyMetadataSchema() { //валидация контейнеров на соответствие FolderID foreach (string configurationPath in this.ConfigurationContainersByPath.Keys) { if (this.ContainersByPath.ContainsKey(configurationPath)) { BlobContainerConfiguration containerConfig = this.ConfigurationContainersByPath[configurationPath]; IBlobContainerMetadata containerMetadata = this.ContainersByPath[configurationPath]; if (containerMetadata.FolderID != containerConfig.FolderID) { throw new Exception(string.Format("В конфигурации файлового хранилища указан контейнер {0} для которого идентификатор папки = {1}, в то время как в хранилище метаданных для него задан идентификатор папки = {2}. Некорректная настройка!", configurationPath, containerConfig.FolderID, containerMetadata.FolderID)); } } } //создание несуществующих в метаданных контейнеров foreach (string configurationPath in this.ConfigurationContainersByPath.Keys) { BlobContainerConfiguration containerConfig = this.ConfigurationContainersByPath[configurationPath]; if (!this.ContainersByPath.ContainsKey(configurationPath)) { //создание контейнера IBlobContainerMetadata container = this.BlobMetadataAdapter.CreateBlobContainer(containerConfig.Name, configurationPath, containerConfig.FolderID); this.BlobMetadataAdapter.SaveBlobContainer(container); } else { //обновление контейнера IBlobContainerMetadata existsContainer = this.ContainersByPath[configurationPath]; existsContainer.Name = containerConfig.Name; this.BlobMetadataAdapter.SaveBlobContainer(existsContainer); } } }
/// <summary> /// Обновление заполненной по ключам схемы метаданных. /// </summary> private void UpdateMetadataSchemaByKey() { //валидация контейнеров на соответствие FolderID foreach (string configurationName in this.ConfigurationContainersByName.Keys) { if (this.ContainersByName.ContainsKey(configurationName)) { BlobContainerConfiguration containerConfig = this.ConfigurationContainersByName[configurationName]; IBlobContainerMetadata containerMetadata = this.ContainersByName[configurationName]; if (!string.IsNullOrEmpty(containerConfig.FolderUrl)) { //если задан и адрес папки и идентификатор if (containerConfig.FolderID > 0) { //то получаем папку и сравниваем идентификаторы у объекта папки IFolder folder = this.Storage.EnsureFolder(containerConfig.FolderUrl); IEngineObjectMetadata engineFolderMetadata = (IEngineObjectMetadata)folder; if (engineFolderMetadata.ID != containerMetadata.FolderID) { throw new Exception(string.Format("В конфигурации файлового хранилища указан контейнер {0} для которого идентификатор папки = {1}, в то время как для него же задан адрес папки {2}, а идентификатор папки с таким адресом = {3}. Некорректная настройка!", configurationName, containerConfig.FolderID, containerConfig.FolderUrl, engineFolderMetadata.ID)); } } } else if (containerMetadata.FolderID != containerConfig.FolderID) { //адрес папки не задан и идентификаторы не совпадают throw new Exception(string.Format("В конфигурации файлового хранилища указан контейнер {0} для которого идентификатор папки = {1}, в то время как в хранилище метаданных для него задан идентификатор папки = {2}. Некорректная настройка!", configurationName, containerConfig.FolderID, containerMetadata.FolderID)); } } } //создание несуществующих в метаданных контейнеров foreach (string configurationName in this.ConfigurationContainersByName.Keys) { BlobContainerConfiguration containerConfig = this.ConfigurationContainersByName[configurationName]; if (!this.ContainersByName.ContainsKey(configurationName)) { //создание контейнера с новым именем //адрес в настройке первичен, поэтому идентификатор папки получаем //из объекта полученного по адресу int folderID = containerConfig.FolderID; if (!string.IsNullOrEmpty(containerConfig.FolderUrl)) { IFolder folder = this.Storage.EnsureFolder(containerConfig.FolderUrl); IEngineObjectMetadata engineFolderMetadata = (IEngineObjectMetadata)folder; folderID = engineFolderMetadata.ID; } IBlobContainerMetadata container = this.BlobMetadataAdapter.CreateBlobContainer(containerConfig.Name, containerConfig.Path, folderID); this.BlobMetadataAdapter.SaveBlobContainer(container); } else { IBlobContainerMetadata existsContainer = this.ContainersByName[configurationName]; if (string.IsNullOrEmpty(existsContainer.Path)) { throw new Exception(string.Format("В метаданных существует контейнер без адреса директории.")); } if (existsContainer.Path.ToLower() != containerConfig.Path.ToLower()) { //контейнер есть, но директория отличается //старый нужно закрыть this.CloseContainer(existsContainer); //адрес в настройке первичен, поэтому идентификатор папки получаем //из объекта полученного по адресу int folderID = containerConfig.FolderID; if (!string.IsNullOrEmpty(containerConfig.FolderUrl)) { IFolder folder = this.Storage.EnsureFolder(containerConfig.FolderUrl); IEngineObjectMetadata engineFolderMetadata = (IEngineObjectMetadata)folder; folderID = engineFolderMetadata.ID; } //и так же нужно создать новый с существующим именем и новой директорией IBlobContainerMetadata container = this.BlobMetadataAdapter.CreateBlobContainer(containerConfig.Name, containerConfig.Path, folderID); this.BlobMetadataAdapter.SaveBlobContainer(container); } } } //закрытие в метаданных контейнеров, которых больше нет в конфиге foreach (string metadataContainerName in this.ContainersByName.Keys) { bool closeRequired = false; IBlobContainerMetadata existsContainer = this.ContainersByName[metadataContainerName]; if (!this.ConfigurationContainersByName.ContainsKey(metadataContainerName)) { //в метаданных есть контейнер, которого нет в конфиге => закрываем его closeRequired = true; } else { //в метаданных есть контейнер, которого нет в конфиге => закрываем его if (string.IsNullOrEmpty(existsContainer.Path)) { throw new Exception(string.Format("В метаданных существует контейнер без адреса директории.")); } BlobContainerConfiguration containerConfig = this.ConfigurationContainersByName[metadataContainerName]; closeRequired = existsContainer.Path.ToLower() != containerConfig.Path.ToLower(); } if (closeRequired) { //закрываем контейнер this.CloseContainer(existsContainer); } } }