Ejemplo n.º 1
0
        public DBObjectDistributedTable GetDistributedTable(DBObjectTableSchemaAdapter schemaAdapter, string tableName)//DBConnection connection, string tableName)
        {
            if (schemaAdapter == null)
            {
                throw new ArgumentNullException("schemaAdapter");
            }

            if (String.IsNullOrEmpty(tableName))
            {
                throw new ArgumentNullException("tableName");
            }

            DBConnection connection = schemaAdapter.PrimaryDatabaseConnection;
            string       tableKey   = string.Format("{0}.{1}.{2}", connection.DisplayName.ToLower(), schemaAdapter.ClassDefinition.TypeUniqueKey, tableName);

            this.Logger.WriteFormatMessage("Получение распределенной таблицы. Ключ: '{0}'", tableKey);

            DBObjectDistributedTable table = null;

            if (DBObjectTableActivator.TablesByKey.ContainsKey(tableKey))
            {
                table = DBObjectTableActivator.TablesByKey[tableKey];
            }
            else
            {
                if (!DBObjectTableActivator.LockObjects.ContainsKey(tableKey))
                {
                    lock (DBObjectTableActivator.LokersLocker)
                    {
                        if (!DBObjectTableActivator.LockObjects.ContainsKey(tableKey))
                        {
                            DBObjectTableActivator.LockObjects.Add(tableKey, new object());
                        }
                    }
                }

                lock (DBObjectTableActivator.LockObjects[tableKey])
                {
                    if (!DBObjectTableActivator.TablesByKey.ContainsKey(tableKey))
                    {
                        this.Logger.WriteFormatMessage("Вызов конструктора объекта таблицы. Ключ: '{0}'", tableKey);
                        table = new DBObjectDistributedTable(schemaAdapter, tableName);
                        if (!table.TablePartition.Table.Exists)
                        {
                            throw new DistributedTableNotFoundException(connection.DisplayName, tableName);
                        }
                    }
                    else
                    {
                        table = DBObjectTableActivator.TablesByKey[tableKey];
                    }
                }
            }

            this.Logger.WriteFormatMessage("Получение распределенной таблицы завершено. Ключ:  '{0}'", tableKey);

            return(table);
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        public DBObjectDistributedTable EnsureDistributedTable(DBObjectTableSchemaAdapter schemaAdapter, string tableName)
        {
            if (schemaAdapter == null)
            {
                throw new ArgumentNullException("schemaAdapter");
            }

            if (String.IsNullOrEmpty(tableName))
            {
                throw new ArgumentNullException("tableName");
            }

            DBConnection             connection = schemaAdapter.PrimaryDatabaseConnection;
            string                   tableKey   = string.Format("{0}.{1}.{2}", connection.DisplayName.ToLower(), schemaAdapter.ClassDefinition.TypeUniqueKey, tableName);
            DBObjectDistributedTable table      = null;

            this.Logger.WriteFormatMessage("Получение/создание распределенной таблицы. Ключ: '{0}'", tableKey);

            if (!DBObjectTableActivator.TablesByKey.ContainsKey(tableKey))
            {
                if (!DBObjectTableActivator.LockObjects.ContainsKey(tableKey))
                {
                    lock (DBObjectTableActivator.LokersLocker)
                    {
                        if (!DBObjectTableActivator.LockObjects.ContainsKey(tableKey))
                        {
                            DBObjectTableActivator.LockObjects.Add(tableKey, new object());
                        }
                    }
                }

                lock (DBObjectTableActivator.LockObjects[tableKey])
                {
                    if (!DBObjectTableActivator.TablesByKey.ContainsKey(tableKey))
                    {
                        this.Logger.WriteFormatMessage("Вызов конструктора объекта таблицы. Ключ: '{0}'", tableKey);
                        table = new DBObjectDistributedTable(schemaAdapter, tableName);
                        this.Logger.WriteFormatMessage("Инициализация объекта таблицы. Ключ: '{0}'", tableKey);
                        table.TablePartition.Table.Init();
                        this.Logger.WriteFormatMessage("Инициализация объекта таблицы завершена. Ключ: '{0}'", tableKey);

                        lock (DBObjectTableActivator.LokersLocker)
                        {
                            DBObjectTableActivator.TablesByKey.Add(tableKey, table);
                        }
                    }
                    else
                    {
                        table = DBObjectTableActivator.TablesByKey[tableKey];
                    }
                }
            }
            else
            {
                table = DBObjectTableActivator.TablesByKey[tableKey];
            }

            if (table == null)
            {
                throw new Exception(string.Format("Не удалось получить таблицу файлов, с названием {0}.", tableName));
            }

            this.Logger.WriteFormatMessage("Получение/создание распределенной таблицы завершено. Ключ: '{0}'", tableKey);

            return(table);
        }