Example #1
0
        protected internal DBCollection <T> FindAll(Predicate <T> match)
        {
            List <T>         resultList = this.Collection.FindAll(match);
            DBCollection <T> result     = new DBCollection <T>(resultList);

            return(result);
        }
Example #2
0
        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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        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());
        }
Example #5
0
        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());
        }
Example #6
0
        /// <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);
        }
Example #7
0
        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());
        }
Example #8
0
        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());
        }
Example #9
0
        /// <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);
        }
Example #11
0
        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);
        }
Example #12
0
        /// <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);
        }
Example #13
0
        /// <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);
        }
Example #14
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);
        }