protected internal DBCollection <T> FindAll(Predicate <T> match) { List <T> resultList = this.Collection.FindAll(match); DBCollection <T> result = new DBCollection <T>(resultList); return(result); }
public IReplicationFolderMetadata GetReplicationFolder(IFolderMetadata folder, IStorageMetadata storage) { if (folder == null) { throw new ArgumentNullException("folder"); } if (storage == null) { throw new ArgumentNullException("storage"); } string condition = string.Format("[StorageID] = {0} AND [FolderID] = {1}", storage.ID, folder.ID); IReplicationFolderMetadata result = null; DBCollection <ReplicationFolderMetadata> replicationFolders = this.ReplicationFolderAdapter.GetReplicationFolders(condition); if (replicationFolders != null && replicationFolders.Count > 0) { result = replicationFolders[0]; } return(result); }
/// <summary> /// Получение метаданных папок из БД. /// </summary> /// <param name="query">Запрос на получение метаданных.</param> /// <returns></returns> internal DBCollection <FolderMetadata> GetFolders(string query) { DBCollection <FolderMetadata> folders = new DBCollection <FolderMetadata>(); string resultQuery = null; if (String.IsNullOrEmpty(query)) { resultQuery = this.SelectQuery; } else { resultQuery = @"{SelectQuery} WHERE {Query}" .ReplaceKey("SelectQuery", this.SelectQuery) .ReplaceKey("Query", query); } DataTable resultTable = this.DataAdapter.GetDataTable(resultQuery); if (resultTable != null) { foreach (DataRow row in resultTable.Rows) { FolderMetadata metadata = new FolderMetadata(row); folders.Add(metadata); } } return(folders); }
public ICollection <IFolderMetadata> GetFolders(int parentFolderID = 0) { this.Logger.WriteFormatMessage("GetFolders: начало операции. parentFolderID={0}", parentFolderID); DBCollection <FolderMetadata> resultFolders = this.FolderAdapter.GetFolders(String.Format("[ParentID] = {0}", parentFolderID)); this.Logger.WriteMessage("GetFolders: конец операции."); return(resultFolders.Cast <IFolderMetadata>().ToList()); }
public ICollection <IStorageMetadata> GetStorages() { this.Logger.WriteMessage("GetStorages: Получение всех хранилищ"); IEnumerable <int> ids = null; DBCollection <StorageMetadata> storages = this.StorageAdapter.GetStorages(ids); this.Logger.WriteMessage("GetStorages: Получение всех хранилищ завершено."); return(storages.Cast <IStorageMetadata>().ToList()); }
/// <summary> /// Добавляет новый объект в базу данных. /// </summary> /// <param name="metadataObject">Объект метаданных.</param> /// <param name="tableName">Название таблицы</param> /// <returns></returns> protected int InsertObject(T metadataObject) { if (metadataObject == null) { throw new ArgumentNullException("metadataObject"); } //идентификатор созданного объекта. int createdID = 0; string tableName = this.GetTableName(metadataObject); if (String.IsNullOrEmpty(tableName)) { throw new Exception(String.Format("Не удалось определить конечную таблицу для объекта {0} типа {1}", metadataObject.ToString(), metadataObject.GetType().Name)); } DBObjectDistributedTable table = this.MetadataAdapter.TableActivator.EnsureDistributedTable(this.DBSchemaAdapter, tableName); MetadataQueryBuilder queryBuilder = new MetadataQueryBuilder(table.TablePartition.Table, this.TypeDefinition); string insertQuery = @" {InsertQuery} SELECT SCOPE_IDENTITY() AS CreatedID, @@ROWCOUNT AS AffectedRowsCount" .ReplaceKey("InsertQuery", queryBuilder.InsertQuery); DBCollection <SqlParameter> insertParams = this.CreateInsertParameters(metadataObject); DataRow insertResult = this.DataAdapter.GetDataRow(insertQuery, insertParams.ToArray()); if (insertResult == null) { throw new Exception(string.Format("Не удалось получить результат создания объекта.")); } DataRowReader insertResultReader = new DataRowReader(insertResult); int affectedRowsCount = insertResultReader.GetIntegerValue("AffectedRowsCount"); //если объект по заданному условию уже существовал, устанавливаем идентификатор созданного элемента равный -1. if (affectedRowsCount == 0) { createdID = -1; } //проставляем свойства созданного списка else { createdID = insertResultReader.GetIntegerValue("CreatedID"); if (createdID == 0) { throw new Exception("Не удалось получить идентификатор созданного объекта."); } } //возвращаем идентификатор созданного объекта. return(createdID); }
public ICollection <IStorageMetadata> GetStorages(IEnumerable <int> storageIDs) { if (storageIDs == null) { throw new ArgumentNullException("storageIDs"); } this.Logger.WriteFormatMessage("GetStorages: начало. Идентификаторы: [{0}]", String.Join(",", storageIDs.Select(x => x.ToString()).ToArray <string>())); DBCollection <StorageMetadata> storages = this.StorageAdapter.GetStorages(storageIDs); this.Logger.WriteMessage("GetStorages: Получение хранилищ завершено."); return(storages.Cast <IStorageMetadata>().ToList()); }
public ICollection <IFolderMetadata> GetFolders(ICollection <string> folderUrls) { if (folderUrls == null) { throw new ArgumentNullException("folderUrls"); } this.Logger.WriteFormatMessage("GetFolders: начало операции. folderUrls=[{0}]", String.Join(",", folderUrls.ToArray())); DBCollection <FolderMetadata> resultFolders = this.FolderAdapter.GetFolders(String.Format("[Url] in ({0})", String.Join(",", folderUrls.Select(x => String.Format("N'{0}'", x)).ToArray()))); this.Logger.WriteMessage("GetFolders по folderUrls конец операции."); return(resultFolders.Cast <IFolderMetadata>().ToList()); }
/// <summary> /// Обновляет существующий объект в базе данных. /// </summary> /// <param name="metadataObject">Объект метаданных.</param> /// <returns></returns> protected bool UpdateObject(T metadataObject) { if (metadataObject == null) { throw new ArgumentNullException("metadataObject"); } string tableName = this.GetTableName(metadataObject); if (String.IsNullOrEmpty(tableName)) { throw new Exception(String.Format("Не удалось определить конечную таблицу для объекта {0} типа {1}", metadataObject.ToString(), metadataObject.GetType().Name)); } DBObjectDistributedTable table = this.MetadataAdapter.TableActivator.GetDistributedTable(this.DBSchemaAdapter, tableName); MetadataQueryBuilder queryBuilder = new MetadataQueryBuilder(table.TablePartition.Table, this.TypeDefinition); //приводим объект к типу метаданных. IMetadataObject metadata = this.GetMetadataObject(metadataObject); if (metadata.ID == 0) { throw new ArgumentNullException("metadata.ID", "Не передан идентификатор объекта."); } //формируем условие обновления объекта по идентификатору. string identityCondition = string.Format("[ID] = {1}", table.TablePartition.Table.IdentityColumn.Name, metadata.ID); //запрос обновления объекта метаданных. string updateQuery = @" {UpdateQuery} WHERE {IdentityCondition} SELECT @@ROWCOUNT" .ReplaceKey("UpdateQuery", queryBuilder.UpdateQuery) .ReplaceKey("IdentityCondition", identityCondition) ; //формируем параметры обновления, соответствующие значениям свойств объекта. DBCollection <SqlParameter> updateParams = this.CreateInsertParameters(metadataObject); //выполняем запрос. int affectedRowsCount = this.DataAdapter.GetScalarValue <int>(updateQuery, updateParams.ToArray()); return(affectedRowsCount > 0); }
private DBCollection <SqlParameter> CreateParameters(T metadataObject, DBCollection <MetadataPropertyDefinition> metadataProperties) { if (metadataObject == null) { throw new ArgumentNullException("metadataObject"); } DBCollection <SqlParameter> parameters = new DBCollection <SqlParameter>(); foreach (MetadataPropertyDefinition property in metadataProperties) { object value = property.Property.GetValue(metadataObject, null); DBColumnSchema columnSchema = this.DBSchemaAdapter.TableSchema.GetColumn(property.ColumnName, true); SqlParameter param = new SqlParameter(property.ParameterName, columnSchema.Type); param.Value = this.EnsureParameterValue(value); parameters.Add(param); } return(parameters); }
protected int InsertObject(T metadataObject) { //идентификатор созданного объекта. int createdID = 0; string insertQuery = @" {InsertQuery} SELECT SCOPE_IDENTITY() AS CreatedID, @@ROWCOUNT AS AffectedRowsCount" .ReplaceKey("InsertQuery", this.InsertQuery); DBCollection <SqlParameter> insertParams = this.CreateInsertParameters(metadataObject); DataRow insertResult = this.DataAdapter.GetDataRow(insertQuery, insertParams.ToArray()); if (insertResult == null) { throw new Exception(string.Format("Не удалось получить результат создания объекта.")); } DataRowReader insertResultReader = new DataRowReader(insertResult); int affectedRowsCount = insertResultReader.GetIntegerValue("AffectedRowsCount"); //если объект по заданному условию уже существовал, устанавливаем идентификатор созданного элемента равный -1. if (affectedRowsCount == 0) { createdID = -1; } //проставляем свойства созданного списка else { createdID = insertResultReader.GetIntegerValue("CreatedID"); if (createdID == 0) { throw new Exception("Не удалось получить идентификатор созданного объекта."); } } //возвращаем идентификатор созданного объекта. return(createdID); }
/// <summary> /// Получение коллекции объектов хранилища по условию. /// </summary> /// <param name="condition">Условие.</param> /// <returns></returns> internal DBCollection <StorageMetadata> GetStorages(string condition) { string resultQuery = this.SelectQuery; if (!string.IsNullOrEmpty(condition)) { resultQuery += string.Format("WHERE {0}", condition); } DataTable resultTable = this.DataAdapter.GetDataTable(resultQuery); DBCollection <StorageMetadata> result = new DBCollection <StorageMetadata>(); if (resultTable != null) { foreach (DataRow resultRow in resultTable.Rows) { StorageMetadata metadata = new StorageMetadata(resultRow); result.Add(metadata); } } return(result); }
/// <summary> /// Обновляет существующий объект в базе данных. /// </summary> /// <param name="metadataObject">Объект метаданных.</param> /// <returns></returns> protected bool UpdateObject(T metadataObject) { if (metadataObject == null) { throw new ArgumentNullException("metadataObject"); } //приводим объект к типу метаданных. IMetadataObject metadata = this.GetMetadataObject(metadataObject); if (metadata.ID == 0) { throw new ArgumentNullException("metadata.ID", "Не передан идентификатор объекта."); } //формируем условие обновления объекта по идентификатору. string identityCondition = string.Format("[ID] = {1}", this.IdentityColumn.Name, metadata.ID); //запрос обновления объекта метаданных. string updateQuery = @" {UpdateQuery} WHERE {IdentityCondition} SELECT @@ROWCOUNT" .ReplaceKey("UpdateQuery", this.UpdateQuery) .ReplaceKey("IdentityCondition", identityCondition) ; //формируем параметры обновления, соответствующие значениям свойств объекта. DBCollection <SqlParameter> updateParams = this.CreateInsertParameters(metadataObject); //выполняем запрос. int affectedRowsCount = this.DataAdapter.GetScalarValue <int>(updateQuery, updateParams.ToArray()); return(affectedRowsCount > 0); }
/// <summary> /// Возвращает коллекцию папок репликации. /// </summary> /// <param name="condition">Условие на выборку метаданных.</param> /// <returns></returns> internal DBCollection <ReplicationFolderMetadata> GetReplicationFolders(string condition = null) { DBCollection <ReplicationFolderMetadata> replicationFolders = new DBCollection <ReplicationFolderMetadata>(); string resultQuery = null; if (string.IsNullOrEmpty(condition)) { resultQuery = this.SelectQuery; } else { resultQuery = @"{SelectQuery} WHERE {Condition}" .ReplaceKey("SelectQuery", this.SelectQuery) .ReplaceKey("Condition", condition); } DataTable resultTable = this.DataAdapter.GetDataTable(resultQuery); if (resultTable != null) { //собираем все идентификаторы папок и узлов хранилища //чтобы получить их за отдельный запрос Dictionary <int, FolderMetadata> uniqueFolders = new Dictionary <int, FolderMetadata>(); Dictionary <int, StorageMetadata> uniqueStorages = new Dictionary <int, StorageMetadata>(); //сначала заполняем ключи словарей foreach (DataRow row in resultTable.Rows) { int folderID = DataRowReader.GetIntegerValue(row, "FolderID"); if (folderID > 0 && !uniqueFolders.ContainsKey(folderID)) { uniqueFolders.Add(folderID, null); } int storageID = DataRowReader.GetIntegerValue(row, "StorageID"); if (storageID > 0 && !uniqueStorages.ContainsKey(storageID)) { uniqueStorages.Add(storageID, null); } } //потом получаем объекты по этим ключам и "дозаполняем" словарь if (uniqueFolders.Count > 0) { string foldersIdentities = string.Join(",", uniqueFolders.Keys.ToArray()); string foldersCondition = string.Format("[ID] IN ({0})", foldersIdentities); DBCollection <FolderMetadata> folders = this.MetadataAdapter.FolderAdapter.GetFolders(foldersCondition); foreach (FolderMetadata folder in folders) { if (uniqueFolders.ContainsKey(folder.ID)) { uniqueFolders[folder.ID] = folder; } } } if (uniqueStorages.Count > 0) { string storagesIdentities = string.Join(",", uniqueStorages.Keys.ToArray()); string storagesCondition = string.Format("[ID] IN ({0})", storagesIdentities); DBCollection <StorageMetadata> storages = this.MetadataAdapter.StorageAdapter.GetStorages(storagesCondition); foreach (StorageMetadata storage in storages) { if (uniqueStorages.ContainsKey(storage.ID)) { uniqueStorages[storage.ID] = storage; } } } foreach (DataRow row in resultTable.Rows) { FolderMetadata folder = null; StorageMetadata storage = null; int folderID = DataRowReader.GetIntegerValue(row, "FolderID"); if (folderID > 0 && uniqueFolders.ContainsKey(folderID)) { folder = uniqueFolders[folderID]; } int storageID = DataRowReader.GetIntegerValue(row, "StorageID"); if (storageID > 0 && uniqueStorages.ContainsKey(storageID)) { storage = uniqueStorages[storageID]; } if (folder == null) { int rowID = DataRowReader.GetIntegerValue(row, "ID"); throw new Exception(string.Format("Для строки метаданных папки репликации с идентификатором {0} не найдена папка с идентификатором {1}", rowID, folderID)); } if (storage == null) { int rowID = DataRowReader.GetIntegerValue(row, "ID"); throw new Exception(string.Format("Для строки метаданных папки репликации с идентификатором {0} не найден узел хранилища с идентификатором {1}", rowID, storageID)); } ReplicationFolderMetadata metadata = new ReplicationFolderMetadata(row, folder, storage); replicationFolders.Add(metadata); } } return(replicationFolders); }