using System; using System.Collections.Generic; using System.Linq; namespace ZeroLevel.MsSql { public abstract class TableInfo : IEquatable { #region Private fields /// /// Имя таблицы /// protected readonly string _name; /// /// Поле-идентификатор /// private ColumnInfo _primaryKey; /// /// Все поля таблицы /// private readonly Dictionary _columns = new Dictionary(); /// /// Индексы /// private readonly List _indexes = new List(); #endregion #region Properties public ColumnInfo this[string columnName] { get { if (_columns.ContainsKey(columnName)) { return _columns[columnName]; } return null; } } /// /// Первичный ключ /// public ColumnInfo PrimaryKey { get { return _primaryKey; } } /// /// Имя таблицы /// public string Name { get { return _name; } } /// /// Индексы /// public List Indexes { get { return _indexes; } } /// /// Поля таблицы /// public IEnumerable Columns { get { return _columns.Values; } } #endregion #region Ctor /// /// Конструктор по-умолчанию /// /// public TableInfo(string name) { _name = name; } /// /// Конструктор по-умолчанию /// /// public TableInfo(TableInfo other) { _name = other._name; _columns = new Dictionary(other._columns); _indexes = new List(other._indexes); _primaryKey = other._primaryKey; } #endregion #region IEquatable public override bool Equals(object obj) { return this.Equals(obj as TableInfo); } /// /// Сравнение с другой таблицей /// public bool Equals(TableInfo other) { if (other == null || _name.Equals(other._name, StringComparison.OrdinalIgnoreCase) == false) return false; if (false == Columns.NoOrderingEquals(other.Columns)) { return false; } return true; } #endregion #region Abstract protected abstract IEnumerable GetIndexes(IDbProvider db); protected abstract IEnumerable GetColumns(IDbProvider db); #endregion #region Fill table info public void AppendNewColumn(ColumnInfo column) { _columns.Add(column.Name, column); if (column.IsPrimaryKey) _primaryKey = column; } /// /// Заполнение данных о таблице /// /// Подключение к базе данных public void FillTableInfo(IDbProvider db) { foreach (var column in GetColumns(db)) { _columns.Add(column.Name, column); if (column.IsPrimaryKey) { _primaryKey = column; } } foreach (var index in GetIndexes(db)) { _indexes.Add(index); } } #endregion /// /// Проверка наличия поля /// public bool ContainsColumns(ColumnInfo column) { return Columns.Any(r => r.Equals(column)); } /// /// Проверка наличия поля /// public bool ContainsColumns(string columnName) { return Columns.Any(r => r.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase)); } public override int GetHashCode() { return _name.GetHashCode(); } } }