/// <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); }
/// <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; }
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; }
/// <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); }
/// <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); }