| 
							
								 | 
							
							using System;
 | 
						
						
						
						
							 | 
							
								 | 
							
							using System.Collections.Generic;
 | 
						
						
						
						
							 | 
							
								 | 
							
							using System.Data;
 | 
						
						
						
						
							 | 
							
								 | 
							
							using System.Globalization;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							namespace ZeroLevel.SqlServer
 | 
						
						
						
						
							 | 
							
								 | 
							
							{
 | 
						
						
						
						
							 | 
							
								 | 
							
							    public sealed class SqlDbInfo
 | 
						
						
						
						
							 | 
							
								 | 
							
							    {
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #region Ctor
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public SqlDbInfo(SqlDbProvider provider)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            _provider = provider;
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #endregion
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private static string FixTableName(string tableName)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            return tableName.Trim().ToLower();
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public void CollectDatabaseInfo(bool tables, bool views, bool storedProcedures)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            if (tables)
 | 
						
						
						
						
							 | 
							
								 | 
							
							                CollectTableInformation();
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public SqlDbTableInfo this[string tableName]
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            get
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                tableName = FixTableName(tableName);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                if (_tables.ContainsKey(tableName))
 | 
						
						
						
						
							 | 
							
								 | 
							
							                {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    return _tables[tableName];
 | 
						
						
						
						
							 | 
							
								 | 
							
							                }
 | 
						
						
						
						
							 | 
							
								 | 
							
							                throw new KeyNotFoundException("Таблица " + tableName + " отсутствует в базе " + _provider.Server + "\\" + _provider.Base);
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #region Private Fields
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private readonly SqlDbProvider _provider;
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private readonly Dictionary<string, SqlDbTableInfo> _tables = new Dictionary<string, SqlDbTableInfo>();
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private readonly List<SqlDbForeignKeyInfo> _foreignKeys = new List<SqlDbForeignKeyInfo>();
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private readonly List<SqlDbPrimaryKeyInfo> _primaryKeys = new List<SqlDbPrimaryKeyInfo>();
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private readonly List<SqlDbObjectInfo> _storedProcedures = new List<SqlDbObjectInfo>();
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private readonly List<SqlDbObjectInfo> _views = new List<SqlDbObjectInfo>();
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #endregion
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #region Public database info
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public IEnumerable<string> Tables
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            get
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                return _tables.Keys;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public IEnumerable<SqlDbTableInfo> TablesInfo
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            get
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                return _tables.Values;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public IEnumerable<SqlDbPrimaryKeyInfo> PrimaryKeys
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            get
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                return _primaryKeys;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public IEnumerable<SqlDbForeignKeyInfo> ForeignKeys
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            get
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                return _foreignKeys;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public IEnumerable<SqlDbObjectInfo> StoredProcedures
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            get
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                return _storedProcedures;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public IEnumerable<SqlDbObjectInfo> Views
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            get
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                return _views;
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #endregion
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #region Public methods
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public bool ContainTable(string tableName)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            tableName = FixTableName(tableName);
 | 
						
						
						
						
							 | 
							
								 | 
							
							            return _tables.ContainsKey(tableName);
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public bool ContainPrimaryKey(SqlDbPrimaryKeyInfo pk)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            return _primaryKeys.Contains(pk);
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public bool ContainForeignKey(SqlDbForeignKeyInfo fk)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            return _foreignKeys.Contains(fk);
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public SqlDbTableInfo TableInfo(string tableName)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            tableName = FixTableName(tableName);
 | 
						
						
						
						
							 | 
							
								 | 
							
							            if (ContainTable(tableName))
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                return _tables[tableName];
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							            return null;
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #endregion
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #region Helpers
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// <summary>
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// Сбор информации о таблицах, перчиных и внешних ключах
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// </summary>
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private void CollectTableInformation()
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            // Таблицы
 | 
						
						
						
						
							 | 
							
								 | 
							
							            foreach (string table in GetTables())
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                SqlDbTableInfo info = GetTableInfo(table);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                if (info != null)
 | 
						
						
						
						
							 | 
							
								 | 
							
							                {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    string tableName = FixTableName(info.Name);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    _tables.Add(tableName, info);
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    if (info.PrimaryKey != null)
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        _primaryKeys.Add(new SqlDbPrimaryKeyInfo { PrimaryKeyTable = tableName, PrimaryKeyColumn = info.PrimaryKey.Name });
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    }
 | 
						
						
						
						
							 | 
							
								 | 
							
							                }
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							            // Внешние ключи
 | 
						
						
						
						
							 | 
							
								 | 
							
							            DataSet fkSet = _provider.ExecuteQuerySqlDataSet(SqlDbForeignKeyInfo.ForeignKeySelectQuery);
 | 
						
						
						
						
							 | 
							
								 | 
							
							            if (fkSet != null && fkSet.Tables.Count > 0)
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                foreach (DataRow row in fkSet.Tables[0].Rows)
 | 
						
						
						
						
							 | 
							
								 | 
							
							                {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    _foreignKeys.Add(new SqlDbForeignKeyInfo
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        ForeignKeyName = Convert.ToString(row["Constraint_Name"], CultureInfo.CurrentCulture),
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        ForeignKeyTable = FixTableName(Convert.ToString(row["K_Table"], CultureInfo.CurrentCulture)),
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        ForeignKeyColumn = Convert.ToString(row["FK_Column"], CultureInfo.CurrentCulture),
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        PrimaryKeyTable = FixTableName(Convert.ToString(row["PK_Table"], CultureInfo.CurrentCulture)),
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        PrimaryKeyColumn = Convert.ToString(row["PK_Column"], CultureInfo.CurrentCulture)
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    });
 | 
						
						
						
						
							 | 
							
								 | 
							
							                }
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #region Private
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// <summary>
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// Получение списка таблиц из базы данных
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// </summary>
 | 
						
						
						
						
							 | 
							
								 | 
							
							        private List<string> GetTables()
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            var tables = new List<string>();
 | 
						
						
						
						
							 | 
							
								 | 
							
							            using (DataSet ds = _provider.ExecuteQuerySqlDataSet("exec sp_tables"))
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                if (ds != null && ds.Tables.Count > 0)
 | 
						
						
						
						
							 | 
							
								 | 
							
							                {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    foreach (DataRow row in ds.Tables[0].Rows)
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                        if (String.Equals(row.ItemArray[3].ToString(), "TABLE", StringComparison.OrdinalIgnoreCase) &&
 | 
						
						
						
						
							 | 
							
								 | 
							
							                            (false == String.Equals(row.ItemArray[1].ToString(), "sys", StringComparison.OrdinalIgnoreCase)))
 | 
						
						
						
						
							 | 
							
								 | 
							
							                            tables.Add(FixTableName(row.ItemArray[2].ToString()));
 | 
						
						
						
						
							 | 
							
								 | 
							
							                    }
 | 
						
						
						
						
							 | 
							
								 | 
							
							                }
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							            return tables;
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// <summary>
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// Получение информации о таблице по ее имени
 | 
						
						
						
						
							 | 
							
								 | 
							
							        /// </summary>
 | 
						
						
						
						
							 | 
							
								 | 
							
							        public SqlDbTableInfo GetTableInfo(string table)
 | 
						
						
						
						
							 | 
							
								 | 
							
							        {
 | 
						
						
						
						
							 | 
							
								 | 
							
							            if (String.IsNullOrEmpty(table))
 | 
						
						
						
						
							 | 
							
								 | 
							
							            {
 | 
						
						
						
						
							 | 
							
								 | 
							
							                throw new ArgumentNullException("table");
 | 
						
						
						
						
							 | 
							
								 | 
							
							            }
 | 
						
						
						
						
							 | 
							
								 | 
							
							            var info = new SqlDbTableInfo(FixTableName(table));
 | 
						
						
						
						
							 | 
							
								 | 
							
							            info.FillTableInfo(_provider);
 | 
						
						
						
						
							 | 
							
								 | 
							
							            return info;
 | 
						
						
						
						
							 | 
							
								 | 
							
							        }
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #endregion
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							        #endregion
 | 
						
						
						
						
							 | 
							
								 | 
							
							    }
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 |