Example #1
0
        /// <summary>
        /// Возвращает существующий кластеризованный индекс существующей таблицы, соответвующий схеме индекса.
        /// </summary>
        /// <param name="existingTable">Существующая таблица.</param>
        /// <returns></returns>
        protected override DBIndexInfo GetExistingIndex(DBTableInfo existingTable)
        {
            if (existingTable == null)
            {
                throw new ArgumentNullException("existingTable");
            }

            //получаем кластеризованный индекс по имени.
            DBIndexInfo existingIndex = existingTable.GetIndex(this.Name);

            //обрабатываем ошибку изменения существующих индексов SharePoint-таблиц,
            //у которых состав столбцов совпадает с состовом столбцов индексов, определенных в SPXObjects.
            if (!this.Schema.SchemaAdapter.IsPermanentSchema)
            {
                //если индекс по имени не получили, пытаемся найти индекс по признаку первичного ключа - такой индекс в таблице может быть только один.
                if (existingIndex == null)
                {
                    existingIndex = existingTable.PrimaryKey;
                }
            }

            //если для кластеризованного индекса получили обычный, ругаемся.
            if (existingIndex != null && !existingIndex.IsPrimaryKey)
            {
                throw new Exception(string.Format("Существующий индекс [{0}] таблицы {1} должен быть кластеризованным индексом.", this.Name, existingTable.Name));
            }

            return(existingIndex);
        }
Example #2
0
        /// <summary>
        /// Возвращает true, если сравниваемый с данным индексом существующий индекс имеет одинаковый набор столбцов,
        /// расположенных в одинаковом порядке, имеющих одинаковые направления сортировки.
        /// </summary>
        /// <param name="existingIndexToCompare">Существующий индекс таблицы, сравниваемый с данным индексом.</param>
        /// <returns></returns>
        internal bool ColumnsEqual(DBIndexInfo existingIndexToCompare)
        {
            if (existingIndexToCompare == null)
            {
                throw new ArgumentNullException("existingIndexToCompare");
            }

            //флаг равенства индексов
            bool equal = false;

            //сначала сравниваем количество столбцов
            if (this.Columns.Count == existingIndexToCompare.Columns.Count)
            {
                equal = true;
                for (int i = 0; i < this.Columns.Count; i++)
                {
                    DBIndexColumnSchema column          = this.Columns[i];
                    DBIndexColumnInfo   columnToCompare = existingIndexToCompare.Columns[i];
                    //если хотя бы один столбец не равен соответствующему по то му же порядковому номеру,
                    //прекращаем сравнение и возвращаем false.
                    if (!column.EqualsTo(columnToCompare))
                    {
                        equal = false;
                        break;
                    }
                }
            }
            return(equal);
        }
 internal DBTableRequiredInitAction(DBIndexInfo indexToDelete, DBTable table)
     : this(table)
 {
     if (indexToDelete == null)
     {
         throw new ArgumentNullException("indexToDelete");
     }
     this.IndexToDelete = indexToDelete;
 }
 internal DBTableRequiredInitAction(bool isFullTextKey, DBIndexInfo primaryKeyToDropFullTextIndex, DBTable table)
     : this(table)
 {
     if (!isFullTextKey)
     {
         throw new ArgumentException("Значение должно быть равно true", "isFullTextKey");
     }
     if (primaryKeyToDropFullTextIndex == null)
     {
         throw new ArgumentNullException("primaryKeyToDropFullTextIndex");
     }
     this.PrimaryKeyToDropFullTextIndex = primaryKeyToDropFullTextIndex;
 }
Example #5
0
        internal DBIndexColumnInfo(DataRow data, DBIndexInfo index)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }
            if (index == null)
            {
                throw new ArgumentNullException("index");
            }

            this.Data  = data;
            this.Index = index;
        }
Example #6
0
        /// <summary>
        /// Возвращает существующий индекс таблицы.
        /// </summary>
        /// <param name="indexName">Название индекса.</param>
        /// <param name="throwNotFoundException">При переданном значение true генерирует исключение в случае отсутствия индекса в таблице.</param>
        /// <returns></returns>
        public DBIndexInfo GetIndex(string indexName, bool throwNotFoundException)
        {
            if (string.IsNullOrEmpty(indexName))
            {
                throw new ArgumentNullException("indexName");
            }

            //получаем индекс
            string      indexNameLow = indexName.ToLower();
            DBIndexInfo index        = null;

            if (this.IndexesByName.ContainsKey(indexNameLow))
            {
                index = this.IndexesByName[indexNameLow];
            }

            if (index == null && throwNotFoundException)
            {
                throw new Exception(string.Format("Не удалось получить существующий индекс [{0}] в таблице {1}.", indexName, this.Name));
            }

            return(index);
        }
Example #7
0
        /// <summary>
        /// Возвращает существующий некластеризованный индекс существующей таблицы, соответвующий схеме индекса.
        /// </summary>
        /// <param name="existingTable">Существующая таблица.</param>
        /// <returns></returns>
        protected override DBIndexInfo GetExistingIndex(DBTableInfo existingTable)
        {
            if (existingTable == null)
            {
                throw new ArgumentNullException("existingTable");
            }


            //получаем некластеризованный индекс по имени.
            DBIndexInfo existingIndex = existingTable.GetIndex(this.Name);

            //если индекс по имени не получили, пытаемся найти индекс по набору столбцов.
            if (existingIndex == null)
            {
                foreach (DBIndexInfo indexInfo in existingTable.Indexes)
                {
                    //пропускаем индекс с первичным ключом.
                    if (indexInfo.IsPrimaryKey)
                    {
                        continue;
                    }

                    if (!this.Schema.SchemaAdapter.IsPermanentSchema)
                    {
                        //т.к. индексов с соответствующем набором столбцов может быть несколько то выбираем тот, имя которого оканчивается на DBIndex.RelativeName.
                        //а если такового не имеется, то выбираем первый попавшийся индекс с набором столбцов, соответствующих схеме.
                        if (indexInfo.NameLow.EndsWith("_" + this.Schema.RelativeNameLow))
                        {
                            existingIndex = indexInfo;
                            break;
                        }
                        else if (this.ColumnsEqual(indexInfo) && existingIndex == null)
                        {
                            if (!this.Table.ContainsIndex(indexInfo.Name))
                            {
                                existingIndex = indexInfo;
                            }
                        }
                    }
                    else
                    {
                        //обрабатываем ошибку изменения существующих индексов SharePoint-таблиц,
                        //у которых состав столбцов совпадает с состовом столбцов индексов, определенных в SPXObjects.
                        if (indexInfo.NameLow.StartsWith(("IX_" + this.Table.Prefix).ToLower()) ||
                            indexInfo.NameLow.StartsWith(("IX_" + this.Table.OriginalPrefix).ToLower()) ||
                            indexInfo.NameLow.StartsWith(("Ind_" + this.Table.Prefix).ToLower()) ||
                            indexInfo.NameLow.StartsWith(("Ind_" + this.Table.OriginalPrefix).ToLower()))
                        {
                            if (this.ColumnsEqual(indexInfo) && existingIndex == null)
                            {
                                if (!this.Table.ContainsIndex(indexInfo.Name))
                                {
                                    existingIndex = indexInfo;
                                }
                            }
                        }
                    }
                }
            }

            //если для обычного индекса получили кластеризованный, ругаемся.
            if (existingIndex != null && existingIndex.IsPrimaryKey)
            {
                throw new Exception(string.Format("Существующий индекс [{0}] таблицы {1} должен быть некластеризованным индексом.", this.Name, existingTable.Name));
            }

            return(existingIndex);
        }