public IBlobFileVersionMetadata SaveFile(IBlobFileMetadata fileMetadata, DateTime versionTimeCreated) { if (fileMetadata == null) { throw new ArgumentNullException("fileMetadata"); } if (versionTimeCreated == null) { throw new ArgumentNullException("versionTimeCreated"); } FileMetadata typedFile = (FileMetadata)fileMetadata; if (typedFile.ID != 0 && typedFile.RemoteFile == null) { if (typedFile.OriginalVersionUniqueID == Guid.Empty || fileMetadata.VersionUniqueID == typedFile.OriginalVersionUniqueID) { throw new Exception("Для обновления существующего файла необходимо вызвать резервирование параметров сохранения."); } } this.Logger.WriteMessage("SaveFile: Начало."); FileVersionMetadata version = this.FileAdapter.UpdateFile(typedFile, versionTimeCreated); this.Logger.WriteMessage("SaveFile: Конец."); return(version); }
/// <summary> /// Добавление новой версии в коллекцию. /// </summary> /// <param name="version">Метаданные версии.</param> internal void AddVersion(FileVersionMetadata version) { if (version == null) { throw new ArgumentNullException("version"); } if (!this.Versions.ContainsKey(version.UniqueID)) { this.Add(version); this.Versions.Add(version.UniqueID, version); this.__init_VersionsStorages = false; } }
/// <summary> /// Обновляет метаданные файла в БД, либо создает новую запись. /// </summary> /// <param name="file">Метаданные файла.</param> internal FileVersionMetadata UpdateFile(FileMetadata file, DateTime versionTimeCreated) { if (file == null) { throw new ArgumentNullException("folder"); } if (versionTimeCreated == null) { throw new ArgumentNullException("versionTimeCreated"); } if (file.ID == 0) { file.TimeCreated = versionTimeCreated; file.ModifiedUserID = 0; file.TimeModified = versionTimeCreated; file.ID = this.InsertObject(file); } else { if (file.RemoteFile == null) { file.TimeModified = versionTimeCreated; } //если не пришла более ранняя версия файла с удаленного узла, //либо пришла версия с локального хранилища, то сохраняем ее if (!file.PreventSavePreviousVersion) { this.UpdateObject(file); } } //при создании/обновлении создаем новые метаданные версии. FileVersionMetadata version = this.VersionAdapter.CreateVerion(file); return(version); }
/// <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); }