示例#1
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);
        }
示例#2
0
        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);
            }
        }
示例#4
0
        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: Конец.");
        }
示例#5
0
        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;
        }
示例#6
0
        /// <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);
        }