/// <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); }
private Blob CreateBlob() { //создание нового блоба string name = string.Format("{0}_{1}", BlobConsts.Blobs.Name, Guid.NewGuid().ToString(), BlobConsts.Blobs.Extension); IBlobMetadata blobMetadata = this.DataAdapter.BlobMetadataAdapter.CreateBlob(name, this.ID); this.DataAdapter.BlobMetadataAdapter.SaveBlob(blobMetadata); Blob newBlob = new Blob(this, blobMetadata); DateTime timeCreated = DateTime.Now; //создаем физический файл блоба //т.к. это первичное созадние файла, то "шарить" файл не нужно //пишем в него заголовок и закрываем поток using (FileStream fs = newBlob.File.Open(FileMode.Append, FileAccess.Write, FileShare.None)) { if (fs.Position != 0) { throw new Exception(string.Format("Невозможно записать заголовок блоба в непустой блоб. Заголовок блоба должен быть записан в начало блоба!")); } //записываем заголовок в начало блоба byte[] allBlobHeaderBytes = new byte[BlobConsts.Blobs.BlobHeaderSize]; //фиксированные байты заголовка блоба byte[] fixedHeaderBytes = Encoding.UTF8.GetBytes(BlobConsts.Blobs.BlobSystemHeader); Array.Copy(fixedHeaderBytes, 0, allBlobHeaderBytes, 0, fixedHeaderBytes.Length); int destinationOffset = fixedHeaderBytes.Length; //версия блоба int blobHeaderVersion = BlobConsts.Blobs.BlobHeaderCurrentVersion; byte[] blobHeaderVersionBytes = BitConverter.GetBytes(blobHeaderVersion); Array.Copy(blobHeaderVersionBytes, 0, allBlobHeaderBytes, destinationOffset, blobHeaderVersionBytes.Length); destinationOffset += blobHeaderVersionBytes.Length; BlobeHeaderV1 blobHeader = new BlobeHeaderV1() { ID = newBlob.ID, Name = newBlob.File.Name, FullName = newBlob.File.FullName, ContainerID = newBlob.Metadata.ContainerID, MachineName = Environment.MachineName, TimeCreated = timeCreated }; string blobHeaderJson = JsonDataSerializer.SerializeJson(blobHeader); byte[] blobHeaderBytes = Encoding.UTF8.GetBytes(blobHeaderJson); Array.Copy(blobHeaderBytes, 0, allBlobHeaderBytes, destinationOffset, blobHeaderBytes.Length); //запись всего заголовка блоба в файл блоба fs.Write(allBlobHeaderBytes, 0, allBlobHeaderBytes.Length); } return(newBlob); }
private void EnsureMetadata(IBlobMetadata blobMetadata, IFileHeader fileHeader, long fileAbsoluteStartPosition, long fileAbsoluteEndPosition) { if (blobMetadata == null) { throw new ArgumentNullException("blobMetadata"); } if (fileHeader == null) { throw new ArgumentNullException("fileHeader"); } if (fileAbsoluteStartPosition < 0) { throw new ArgumentNullException("fileAbsolutePosition"); } if (fileAbsoluteEndPosition < 0) { throw new ArgumentNullException("fileAbsoluteEndPosition"); } if (fileAbsoluteStartPosition >= fileAbsoluteEndPosition) { throw new Exception("fileAbsoluteStartPosition не может быть больше fileAbsoluteEndPosition"); } IFolderMetadata folderMetadata = this.DataAdapter.MetadataAdapter.EnsureFolder(fileHeader.FolderUrl); IBlobFileMetadata blobFileMetadata = this.DataAdapter.BlobMetadataAdapter.GetFile(folderMetadata, fileHeader.UniqueID); if (blobFileMetadata != null) { //файл есть, проверяем текущую версию, есть ли она ICollection <IBlobFileVersionMetadata> versions = this.DataAdapter.BlobMetadataAdapter.GetVersions(blobFileMetadata); bool versionExists = false; if (versions != null) { foreach (IBlobFileVersionMetadata version in versions) { if (version.UniqueID == fileHeader.VersionUniqueID) { versionExists = true; break; } } } if (!versionExists) { this.DataAdapter.BlobMetadataAdapter.AddExistsFileVersion(this.DataAdapter.MetadataAdapter.CurrentStorage, blobMetadata, folderMetadata, fileHeader, fileAbsoluteStartPosition, fileAbsoluteEndPosition); } } else { //файла нет, создаем метаданные файла this.DataAdapter.BlobMetadataAdapter.AddExistsFileVersion(this.DataAdapter.MetadataAdapter.CurrentStorage, blobMetadata, folderMetadata, fileHeader, fileAbsoluteStartPosition, fileAbsoluteEndPosition); } }
public void SaveBlob(IBlobMetadata blobMetadata) { if (blobMetadata == null) { throw new ArgumentNullException("blobMetadata"); } this.Logger.WriteMessage("SaveBlob: Начало."); this.BlobAdapter.UpdateBlob((BlobMetadata)blobMetadata); this.Logger.WriteMessage("SaveBlob: Конец."); }
public Blob(BlobContainer container, IBlobMetadata metadata) { if (container == null) { throw new ArgumentNullException("container"); } if (metadata == null) { throw new ArgumentNullException("metadata"); } this.Container = container; this.Metadata = metadata; }
/// <summary> /// Создает метаданные существующего файла. /// </summary> /// <param name="storageMetadata">Метаданные хранилища.</param> /// <param name="blobMetadata">Метаданные блоба.</param> /// <param name="folderMetadata">Метаданные папки.</param> /// <param name="fileHeader">Заголовок файла.</param> /// <param name="blobStartPosition">Начальная позиция файла в блобе.</param> /// <param name="blobEndPosition">Конечная позиция файла в блобе.</param> /// <returns></returns> public IBlobFileMetadata AddExistsFileVersion(IStorageMetadata storageMetadata, IBlobMetadata blobMetadata, IFolderMetadata folderMetadata, IFileHeader fileHeader, long blobStartPosition, long blobEndPosition) { if (storageMetadata == null) { throw new ArgumentNullException("storageMetadata"); } if (blobMetadata == null) { throw new ArgumentNullException("blobMetadata"); } if (folderMetadata == null) { throw new ArgumentNullException("folderMetadata"); } if (fileHeader == null) { throw new ArgumentNullException("fileHeader"); } if (blobStartPosition < 0) { throw new ArgumentNullException("blobStartPosition"); } IBlobFileHeader blobHeader = (IBlobFileHeader)((object)fileHeader); FileMetadata file = this.FileAdapter.GetFile(fileHeader.UniqueID, folderMetadata); bool justCreated = false; if (file == null) { justCreated = true; file = new FileMetadata(this.FileAdapter); file.UniqueID = fileHeader.UniqueID; file.VersionUniqueID = fileHeader.VersionUniqueID; file.FolderID = folderMetadata.ID; file.FolderMetadata = folderMetadata; file.Name = fileHeader.FileName; file.BlobID = blobMetadata.ID; file.BlobStartPosition = blobStartPosition; file.BlobEndPosition = blobEndPosition; file.Deleted = false; file.Size = blobHeader.ContentLength; file.TimeCreated = fileHeader.TimeCreated; file.TimeModified = fileHeader.TimeCreated; this.FileAdapter.UpdateFileTransparent(file); } else { if (file.Versions.Any(x => x.UniqueID == fileHeader.VersionUniqueID)) { throw new Exception(String.Format("Версия с идентификатором [{0}] уже существует.", fileHeader.VersionUniqueID.ToString())); } } //создание версии файла FileVersionMetadata version = new FileVersionMetadata(file); version.UniqueID = fileHeader.VersionUniqueID; version.BlobID = blobMetadata.ID; version.BlobStartPosition = blobStartPosition; version.BlobEndPosition = blobEndPosition; version.Size = blobHeader.ContentLength; version.TimeCreated = fileHeader.TimeCreated; version.CreatedStorageID = storageMetadata.ID; version.Name = fileHeader.FileName; //сохранение версии this.FileAdapter.VersionAdapter.InsertVerion(file, version); file.ResetVersions(); //обновление параметров существующего файла if (!justCreated) { bool fileUpdate = false; if (version.TimeCreated > file.TimeModified) { file.TimeModified = version.TimeCreated; file.VersionUniqueID = version.UniqueID; file.BlobID = version.BlobID; fileUpdate = true; } if (version.TimeCreated < file.TimeCreated) { file.TimeCreated = version.TimeCreated; fileUpdate = true; } //обновление файла if (fileUpdate) { this.FileAdapter.UpdateFileTransparent(file); } } return(file); }