/// <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); } }
/// <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); }
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: Конец."); }
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; }
/// <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); }
/// <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); } } }