Esempio n. 1
0
        /// <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);
                }
            }
        }
Esempio n. 2
0
        /// <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);
                }
            }
        }