/// <summary> /// Возвращает метаданные файла по уникальному идентификатору. /// </summary> /// <param name="uniqueID">Уникальный идентификатор.</param> /// <param name="folderMetadata">Метаданные папки в которой располагается файл.</param> /// <returns></returns> internal FileMetadata GetFile(Guid uniqueID, IFolderMetadata folderMetadata) { if (uniqueID == Guid.Empty) { throw new ArgumentNullException("uniqueID"); } if (folderMetadata == null) { throw new ArgumentNullException("folderMetadata"); } FileMetadata metadata = null; string query = String.Format("[UniqueID] = '{0}' AND Deleted != 1", uniqueID); string tableName = this.GetTableName(uniqueID, folderMetadata); DBObjectDistributedTable table = this.MetadataAdapter.TableActivator.GetDistributedTable(this.DBSchemaAdapter, tableName); MetadataQueryBuilder queryBuilder = new MetadataQueryBuilder(table.TablePartition.Table, this.TypeDefinition); string resultQuery = @"{SelectQuery} WHERE {Query}" .ReplaceKey("SelectQuery", queryBuilder.SelectQuery) .ReplaceKey("Query", query); DataRow resultRow = this.DataAdapter.GetDataRow(resultQuery); if (resultRow != null) { metadata = new FileMetadata(resultRow, this, folderMetadata); } return(metadata); }
/// <summary> /// Возвращает метаданные всех версий файла. /// </summary> /// <param name="file">Метаданные файла.</param> /// <returns>Коллекцию метаданных версий файла.</returns> internal FileVersionsCollection GetFileVersions(FileMetadata file) { if (file == null) { throw new ArgumentNullException("file"); } FileVersionsCollection versions = new FileVersionsCollection(file); string query = String.Format("[FileID] = '{0}'", file.ID); string tableName = this.GetTableName(file); DBObjectDistributedTable table = this.MetadataAdapter.TableActivator.GetDistributedTable(this.DBSchemaAdapter, tableName); MetadataQueryBuilder queryBuilder = new MetadataQueryBuilder(table.TablePartition.Table, this.TypeDefinition); string resultQuery = @"{SelectQuery} WHERE {Query} ORDER BY [TimeCreated] ASC" .ReplaceKey("SelectQuery", queryBuilder.SelectQuery) .ReplaceKey("Query", query); DataTable resultTable = this.DataAdapter.GetDataTable(resultQuery); if (resultTable != null) { foreach (DataRow row in resultTable.Rows) { FileVersionMetadata metadata = new FileVersionMetadata(row, versions); versions.AddVersion(metadata); } } return(versions); }
/// <summary> /// Получение токена доступа к версии файла по уникальносму идентификатору. /// </summary> /// <param name="fileVersionMetadata">Метаданные версии файла.</param> /// <param name="tokenUniqueID">Уникальный идентификатор токена.</param> /// <returns></returns> public IFileToken GetToken(IFileVersionMetadata fileVersionMetadata, Guid tokenUniqueID) { FileToken token = null; this.Logger.WriteFormatMessage("GetToken: Начало операции получения токена. tokenUniqueID='{0}' fileUniqueID='{1}' folderUrl='{2}'", tokenUniqueID, fileVersionMetadata.FileMetadata.UniqueID, fileVersionMetadata.FileMetadata.FolderMetadata.Url); string tableName = this.GetTableName(fileVersionMetadata.FileMetadata); DBObjectDistributedTable table = null; this.Logger.WriteMessage("GetToken: Получение таблицы."); try { table = this.TypedMetadataAdapter.TableActivator.GetDistributedTable(this.DBSchemaAdapter, tableName); } //В случае когда для данного файла и папки генерация токена не запрашивалась, таблица токенов могла быть не создана. //В данном случае ошибки нет, т.к. токен еще не генерировался. catch (DistributedTableNotFoundException notFoundEx) { return(null); } catch (Exception ex) { throw ex; } this.Logger.WriteMessage("GetToken: Конец получения таблицы."); MetadataQueryBuilder queryBuilder = new MetadataQueryBuilder(table.TablePartition.Table, this.TypeDefinition); string query = @" {SelectQuery} WHERE [UniqueID] = '{UniqueID}' AND [Expired] > GETDATE()" .ReplaceKey("SelectQuery", queryBuilder.SelectQuery) .ReplaceKey("UniqueID", tokenUniqueID); this.Logger.WriteFormatMessage("GetToken: Начало запроса в БД. Запрос:'{0}'", query); DataRow resultRow = this.DataAdapter.GetDataRow(query); this.Logger.WriteMessage("GetToken: Конец запроса в БД."); if (resultRow != null) { token = new FileToken(resultRow, fileVersionMetadata); } this.Logger.WriteMessage("GetToken: Конец."); return(token); }
/// <summary> /// Проверяет наличие уже выданного токена на файл и при отсутствии создает новый. /// </summary> /// <param name="fileVersionMetadata">Метаданные версии файла.</param> /// <returns>Токен доступа к версии файла.</returns> private FileToken EnsureFileToken(IFileVersionMetadata fileVersionMetadata) { if (fileVersionMetadata == null) { throw new ArgumentNullException("fileVersionMetadata"); } this.Logger.WriteFormatMessage("EnsureFileToken: Начало операции. fileUniqueID: {0}, folderUrl: {1}", fileVersionMetadata.FileMetadata.UniqueID, fileVersionMetadata.FileMetadata.FolderMetadata.Url); FileToken fileToken = null; this.Logger.WriteMessage("EnsureFileToken: Получение таблицы."); string tableName = this.GetTableName(fileVersionMetadata.FileMetadata); DBObjectDistributedTable table = this.TypedMetadataAdapter.TableActivator.EnsureDistributedTable(this.DBSchemaAdapter, tableName); MetadataQueryBuilder queryBuilder = new MetadataQueryBuilder(table.TablePartition.Table, this.TypeDefinition); this.Logger.WriteMessage("EnsureFileToken: Конец получения таблицы."); string resultQuery = @"DELETE FROM {TableName} WHERE [Expired] < GETDATE() {SelectQuery} WHERE [FileID] = {FileID} AND [VersionID] = {VersionID} AND ([SecurityIdentifier] IS NULL OR [SecurityIdentifier] = '')" .ReplaceKey("TableName", tableName) .ReplaceKey("SelectQuery", queryBuilder.SelectQuery) .ReplaceKey("FileID", fileVersionMetadata.FileMetadata.ID) .ReplaceKey("VersionID", fileVersionMetadata.ID); this.Logger.WriteFormatMessage("EnsureFileToken: Начало запроса в БД. Запрос:{0}", resultQuery); DataRow tokenRow = this.DataAdapter.GetDataRow(resultQuery); this.Logger.WriteMessage("EnsureFileToken: Конец запроса в БД."); if (tokenRow != null) { fileToken = new FileToken(tokenRow, fileVersionMetadata); } else { fileToken = this.CreateToken(fileVersionMetadata, null); } this.Logger.WriteMessage("EnsureFileToken: Конец операции."); return(fileToken); }