コード例 #1
0
        public override IEnumerable <ITableSourceInfo> ListTableSources(IDatabaseInfo database, IsTableSourceToIgnore isTableSourceToIgnore)
        {
            string paramPrefix = DatabaseServices.ExecutionService.ParameterPrefix;
            IList <ITableSourceInfo> tables       = new List <ITableSourceInfo>();
            MySQLDatabaseInfo        databaseInfo = database as MySQLDatabaseInfo;

            if (databaseInfo == null)
            {
                return(null);
            }
            using (IDbConnection conn = DatabaseServices.TransactionService.CreateConnection()) {
                string sql = string.Format(@"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = {0}
                                           UNION
                                           SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS  WHERE TABLE_SCHEMA = {0};", paramPrefix + "schema");

                IDbCommand cmd = DatabaseServices.ExecutionService.CreateCommand(conn, sql);
                cmd.CommandTimeout = QueryTimeout;
                DatabaseServices.ExecutionService.CreateParameter(cmd, paramPrefix + "schema", DbType.String, databaseInfo.Name);
                using (IDataReader reader = cmd.ExecuteReader()) {
                    while (reader.Read())
                    {
                        string tableName = (string)reader["TABLE_NAME"];
                        if (!isTableSourceToIgnore(tableName))
                        {
                            string qualifiedTableName = GetQualifiedIdentifier(databaseInfo.Name, tableName);
                            tables.Add(new MySQLTableSourceInfo(DatabaseServices, databaseInfo, tableName, qualifiedTableName));
                        }
                    }
                }
            }
            return(tables);
        }
        public IDictionary <string, bool> CheckTableSourcesExist(params string[] tableSourcesNames)
        {
            MySQLDatabaseInfo dbInfo = databaseServices.ObjectFactory.CreateLocalDatabaseInfo() as MySQLDatabaseInfo;

            if (dbInfo == null)
            {
                return(null);
            }

            HashSet <string> tableSourcesFound    = new HashSet <string>();
            IList <string>   tableSourceNamesList = tableSourcesNames.ToList();

            if (tableSourceNamesList.IsNullOrEmpty())
            {
                return(null);
            }

            using (IDbConnection conn = databaseServices.TransactionService.CreateConnection()) {
                string tableCondition;
                string paramPrefix = databaseServices.ExecutionService.ParameterPrefix;
                if (tableSourceNamesList.Count == 1)
                {
                    tableCondition = "=" + paramPrefix + "tablename";
                }
                else
                {
                    tableCondition = " IN ('" + tableSourceNamesList.StrCat("','").ToUpper() + "')";
                }
                string sql = string.Format(@"(SELECT TABLE_NAME 
                                              FROM INFORMATION_SCHEMA.TABLES 
                                              WHERE TABLE_NAME {1} AND TABLE_SCHEMA = '{0}')
                                             UNION
                                             (SELECT TABLE_NAME 
                                              FROM INFORMATION_SCHEMA.VIEWS
                                              WHERE TABLE_NAME {1} AND TABLE_SCHEMA = '{0}')", dbInfo.Name, tableCondition);

                using (IDbCommand cmd = databaseServices.ExecutionService.CreateCommand(conn, sql)) {
                    if (tableSourceNamesList.Count == 1)
                    {
                        databaseServices.ExecutionService.CreateParameter(cmd,
                                                                          paramPrefix + "tablename", DbType.String, tableSourceNamesList.First());
                    }
                    using (IDataReader reader = databaseServices.ExecutionService.ExecuteReader(cmd)) {
                        while (reader.Read())
                        {
                            tableSourcesFound.Add(Convert.ToString(reader["TABLE_NAME"]).ToUpper());
                        }
                    }
                }
            }

            IDictionary <string, bool> result = new Dictionary <string, bool>();

            foreach (var tableSource in tableSourceNamesList)
            {
                result.Add(tableSource, tableSourcesFound.Contains(tableSource.ToUpper()));
            }
            return(result);
        }
        private IDataReader GetTriggers(IDbConnection conn, IEnumerable <MySQLTableSourceInfo> tableSources)
        {
            MySQLDatabaseInfo dbInfo = databaseServices.ObjectFactory.CreateLocalDatabaseInfo() as MySQLDatabaseInfo;

            if (dbInfo == null)
            {
                return(null);
            }

            string tableNames = "'" + tableSources.Select(t => t.Name).StrCat("','") + "'";
            string sql        = string.Format(@"select trig.TRIGGER_NAME trigger_name, trig.EVENT_OBJECT_TABLE table_name
                from INFORMATION_SCHEMA.TRIGGERS trig
                where trig.EVENT_OBJECT_SCHEMA = '{0}' and trig.EVENT_OBJECT_TABLE IN ({1}) and UPPER(trig.TRIGGER_NAME) LIKE '{2}%'", dbInfo.Name,
                                              tableNames, PlatformDatabaseObjectConstants.EventTriggerPrefix);

            IDbCommand cmd = databaseServices.ExecutionService.CreateCommand(conn, sql);

            return(databaseServices.ExecutionService.ExecuteReader(cmd));
        }
        public int GetDatabaseObjectsDefinitionHash(string objectNameFilter)
        {
            int hashResult = -1;

            MySQLDatabaseInfo dbInfo = databaseServices.ObjectFactory.CreateLocalDatabaseInfo() as MySQLDatabaseInfo;

            if (dbInfo == null)
            {
                return(hashResult);
            }

            using (IDbConnection conn = databaseServices.TransactionService.CreateConnection()) {
                string columnSql         = string.Format(@"(select crc32(group_concat(crc32(concat_ws(
                                                TABLE_CATALOG, 
                                                TABLE_SCHEMA, 
                                                TABLE_NAME, 
                                                COLUMN_NAME, 
                                                ORDINAL_POSITION, 
                                                COLUMN_DEFAULT, 
                                                IS_NULLABLE, 
                                                DATA_TYPE, 
                                                CHARACTER_MAXIMUM_LENGTH, 
                                                CHARACTER_OCTET_LENGTH, 
                                                NUMERIC_PRECISION, 
                                                NUMERIC_SCALE, 
                                                DATETIME_PRECISION, 
                                                CHARACTER_SET_NAME, 
                                                COLLATION_NAME, 
                                                COLUMN_TYPE, 
                                                COLUMN_KEY, 
                                                EXTRA, 
                                                PRIVILEGES, 
                                                COLUMN_COMMENT)) 
                                                SEPARATOR '.'))
                                            from information_schema.COLUMNS
                                            where TABLE_SCHEMA = '{0}'
                                            and TABLE_NAME like '%{1}%'
                                            order by TABLE_NAME, COLUMN_NAME)", dbInfo.Name, objectNameFilter);
                string viewDefinitionSql = string.Format(@"(select crc32(group_concat(crc32(concat_ws(
                                                TABLE_CATALOG, 
                                                TABLE_SCHEMA, 
                                                TABLE_NAME, 
                                                VIEW_DEFINITION, 
                                                CHECK_OPTION, 
                                                IS_UPDATABLE, 
                                                DEFINER, 
                                                SECURITY_TYPE, 
                                                CHARACTER_SET_CLIENT, 
                                                COLLATION_CONNECTION)) 
                                                SEPARATOR '.'))
                                            from information_schema.VIEWS
                                            where TABLE_SCHEMA = '{0}'
                                            and TABLE_NAME like '%{1}%'
                                            order by TABLE_NAME)", dbInfo.Name, objectNameFilter);
                string indexSql          = string.Format(@"(select crc32(group_concat(crc32(concat_ws(
                                                TABLE_CATALOG, 
                                                TABLE_SCHEMA, 
                                                TABLE_NAME, 
                                                NON_UNIQUE, 
                                                INDEX_SCHEMA, 
                                                INDEX_NAME, 
                                                SEQ_IN_INDEX, 
                                                COLUMN_NAME, 
                                                COLLATION, 
                                                CARDINALITY, 
                                                SUB_PART, 
                                                PACKED, 
                                                NULLABLE, 
                                                INDEX_TYPE, 
                                                COMMENT, 
                                                INDEX_COMMENT)) 
                                                SEPARATOR '.'))
                                            from information_schema.STATISTICS
                                            where TABLE_SCHEMA = '{0}'
                                            and TABLE_NAME like '%{1}%'
                                            order by TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX)", dbInfo.Name, objectNameFilter);
                int    columnHash;
                using (IDbCommand cmd = databaseServices.ExecutionService.CreateCommand(conn, columnSql)) {
                    cmd.CommandTimeout = QueryTimeout;
                    columnHash         = Convert.ToString(databaseServices.ExecutionService.ExecuteScalar(cmd)).GetHashCode();
                }
                int viewDefinitionsHash;
                using (IDbCommand cmd = databaseServices.ExecutionService.CreateCommand(conn, viewDefinitionSql)) {
                    cmd.CommandTimeout  = QueryTimeout;
                    viewDefinitionsHash = Convert.ToString(databaseServices.ExecutionService.ExecuteScalar(cmd)).GetHashCode();
                }
                int indexHash;
                using (IDbCommand cmd = databaseServices.ExecutionService.CreateCommand(conn, indexSql)) {
                    cmd.CommandTimeout = QueryTimeout;
                    indexHash          = Convert.ToString(databaseServices.ExecutionService.ExecuteScalar(cmd)).GetHashCode();
                }
                string meshedHashes = columnHash + "" + viewDefinitionsHash + "" + indexHash;
                hashResult = meshedHashes.GetHashCode();
            }
            return(hashResult);
        }