示例#1
0
        /// <summary>
        /// Закрытие контейнера и его блобов.
        /// </summary>
        /// <param name="container">Контейнер.</param>
        private void CloseContainer(IBlobContainerMetadata container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            if (container.ID < 1)
            {
                throw new Exception(string.Format("Невозможно закрыть не существующий контейнер"));
            }

            ICollection <IBlobMetadata> containerBlobs = this.BlobMetadataAdapter.GetBlobs(container.ID);

            if (containerBlobs != null)
            {
                foreach (IBlobMetadata blob in containerBlobs)
                {
                    if (!blob.Closed)
                    {
                        blob.Closed = true;
                        this.BlobMetadataAdapter.SaveBlob(blob);
                    }
                }
            }

            if (!container.Closed)
            {
                container.Closed = true;
                this.BlobMetadataAdapter.SaveBlobContainer(container);
            }
        }
示例#2
0
        /// <summary>
        /// Возвращает блоб.
        /// </summary>
        /// <param name="id">Идентификатор блоба.</param>
        /// <param name="throwIfNotExists">Выбросить исключение, если блоб не существует?</param>
        /// <returns></returns>
        private Blob GetBlob(int id, bool throwIfNotExists = true)
        {
            if (id < 1)
            {
                throw new ArgumentNullException("id");
            }

            this.Logger.WriteFormatMessage("GetBlob:Начало получения блоба для файла, id: {0}", id);

            //метаданные блоба
            IBlobMetadata metadata = this.BlobMetadataAdapter.GetBlob(id);

            if (throwIfNotExists && metadata == null)
            {
                throw new Exception(string.Format("Не удалось найти блоб с идентификатором {0}", id));
            }

            //метаданные контейнера
            IBlobContainerMetadata containerMetadata = this.BlobMetadataAdapter.GetBlobContainer(metadata.ContainerID);

            if (throwIfNotExists && containerMetadata == null)
            {
                throw new Exception(string.Format("Не удалось найти контейнер блобов с идентификатором {0}", metadata.ContainerID));
            }

            BlobContainer container = new BlobContainer(this, containerMetadata);
            Blob          blob      = new Blob(container, metadata);

            this.Logger.WriteFormatMessage("GetBlob:Окончание получения блоба для файла, id: {0}", id);

            return(blob);
        }
示例#3
0
        public void SaveBlobContainer(IBlobContainerMetadata containerMetadata)
        {
            if (containerMetadata == null)
            {
                throw new ArgumentNullException("containerMetadata");
            }

            this.Logger.WriteMessage("SaveBlobContainer: Начало.");

            this.ContainerAdapter.UpdateBlobContainer((BlobContainerMetadata)containerMetadata);

            this.Logger.WriteMessage("SaveBlobContainer: Конец.");
        }
示例#4
0
        public BlobContainer(BlobDataAdapter dataAdapter, IBlobContainerMetadata metadata)
        {
            if (dataAdapter == null)
            {
                throw new ArgumentNullException("dataAdapter");
            }

            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }

            this.DataAdapter = dataAdapter;
            this.Metadata    = metadata;
        }
示例#5
0
        /// <summary>
        /// Возвращает контейнер блобов для папки.
        /// </summary>
        /// <param name="folderMetadata">Метаданные папки.</param>
        /// <returns></returns>
        private BlobContainer GetBlobContainer(IFolderMetadata folderMetadata)
        {
            if (folderMetadata == null)
            {
                throw new ArgumentNullException("folderMetadata");
            }

            this.Logger.WriteFormatMessage("GetBlobContainer:Начало получения контейнера, folder.Url: {0}", folderMetadata.Url);

            ICollection <IBlobContainerMetadata> blobContainers = this.BlobMetadataAdapter.GetBlobContainers(folderMetadata.ID);

            if (blobContainers == null || blobContainers.Count == 0)
            {
                blobContainers = this.BlobMetadataAdapter.DefaultContainers;
            }

            if (blobContainers == null || blobContainers.Count == 0)
            {
                throw new Exception(string.Format("Не удалось найти ни одного контейнера блобов для папки с именем {0}",
                                                  folderMetadata.Name));
            }

            IBlobContainerMetadata metadata = null;

            if (blobContainers.Count > 1)
            {
                //выбираем рандомный контейнер для записи.
                int index = Math.Abs(Guid.NewGuid().GetHashCode() % blobContainers.Count);
                metadata = blobContainers.ToList()[index];
            }
            else
            {
                metadata = blobContainers.First();
            }

            BlobContainer container = new BlobContainer(this, metadata);

            this.Logger.WriteFormatMessage("GetBlobContainer:Окончание получения контейнера, folder.Url: {0}", folderMetadata.Url);

            return(container);
        }
示例#6
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);
                }
            }
        }
示例#7
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);
                }
            }
        }