Class: RDBr::Catalog::MysqlQueries

Inherits:
Object
  • Object
show all
Defined in:
lib/rdbr/catalog/mysql/queries.rb

Constant Summary collapse

SYSTEM_SCHEMAS =
%w[information_schema mysql performance_schema sys].freeze
DATABASE_SQL =
'/* rdbr: mysql database */ SELECT DATABASE() AS name'.freeze
NAMESPACES_SQL =
<<~SQL.freeze
  /* rdbr: mysql namespaces */
  SELECT SCHEMA_NAME AS name
  FROM information_schema.SCHEMATA
  %<system_filter>s
  ORDER BY SCHEMA_NAME
SQL
RELATIONS_SQL =
<<~SQL.freeze
  /* rdbr: mysql relations */
  SELECT TABLE_SCHEMA AS namespace_name, TABLE_NAME AS relation_name,
         TABLE_TYPE AS relation_kind, TABLE_COMMENT AS comment
  FROM information_schema.TABLES
  WHERE TABLE_TYPE IN ('BASE TABLE', 'VIEW', 'SYSTEM VIEW')
    %<system_filter>s
  ORDER BY TABLE_SCHEMA, TABLE_NAME
SQL
COLUMNS_SQL =
<<~SQL.freeze
  /* rdbr: mysql columns */
  SELECT COLUMN_NAME AS name, DATA_TYPE AS logical_type, COLUMN_TYPE AS sql_type,
         IS_NULLABLE AS nullable, COLUMN_DEFAULT AS default_expression,
         GENERATION_EXPRESSION AS generated_expression, EXTRA AS extra,
         ORDINAL_POSITION AS ordinal
  FROM information_schema.COLUMNS
  WHERE TABLE_SCHEMA = %<namespace>s AND TABLE_NAME = %<relation>s
  ORDER BY ORDINAL_POSITION
SQL
CONSTRAINTS_SQL =
<<~SQL.freeze
  /* rdbr: mysql constraints */
  SELECT constraint_record.CONSTRAINT_NAME AS name,
         constraint_record.CONSTRAINT_TYPE AS constraint_type,
         key_column.COLUMN_NAME AS column_name,
         key_column.ORDINAL_POSITION AS ordinal,
         key_column.REFERENCED_TABLE_SCHEMA AS referenced_namespace,
         key_column.REFERENCED_TABLE_NAME AS referenced_relation,
         key_column.REFERENCED_COLUMN_NAME AS referenced_column,
         reference.UPDATE_RULE AS on_update, reference.DELETE_RULE AS on_delete
  FROM information_schema.TABLE_CONSTRAINTS constraint_record
  LEFT JOIN information_schema.KEY_COLUMN_USAGE key_column
    ON key_column.CONSTRAINT_SCHEMA = constraint_record.CONSTRAINT_SCHEMA
   AND key_column.TABLE_NAME = constraint_record.TABLE_NAME
   AND key_column.CONSTRAINT_NAME = constraint_record.CONSTRAINT_NAME
  LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS reference
    ON reference.CONSTRAINT_SCHEMA = constraint_record.CONSTRAINT_SCHEMA
   AND reference.TABLE_NAME = constraint_record.TABLE_NAME
   AND reference.CONSTRAINT_NAME = constraint_record.CONSTRAINT_NAME
  WHERE constraint_record.TABLE_SCHEMA = %<namespace>s
    AND constraint_record.TABLE_NAME = %<relation>s
    AND constraint_record.CONSTRAINT_TYPE IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY')
  ORDER BY constraint_record.CONSTRAINT_NAME, key_column.ORDINAL_POSITION
SQL
CHECKS_SQL =
<<~SQL.freeze
  /* rdbr: mysql checks */
  SELECT constraint_record.CONSTRAINT_NAME AS name, check_record.CHECK_CLAUSE AS expression
  FROM information_schema.TABLE_CONSTRAINTS constraint_record
  INNER JOIN information_schema.CHECK_CONSTRAINTS check_record
    ON check_record.CONSTRAINT_SCHEMA = constraint_record.CONSTRAINT_SCHEMA
   AND check_record.CONSTRAINT_NAME = constraint_record.CONSTRAINT_NAME
  WHERE constraint_record.TABLE_SCHEMA = %<namespace>s
    AND constraint_record.TABLE_NAME = %<relation>s
    AND constraint_record.CONSTRAINT_TYPE = 'CHECK'
  ORDER BY constraint_record.CONSTRAINT_NAME
SQL
INDEXES_SQL =
<<~SQL.freeze
  /* rdbr: mysql indexes */
  SELECT INDEX_NAME AS name, NON_UNIQUE AS non_unique, INDEX_TYPE AS index_type,
         SEQ_IN_INDEX AS ordinal, COLUMN_NAME AS column_name
  FROM information_schema.STATISTICS
  WHERE TABLE_SCHEMA = %<namespace>s AND TABLE_NAME = %<relation>s
  ORDER BY INDEX_NAME, SEQ_IN_INDEX
SQL

Instance Method Summary collapse

Constructor Details

#initialize(connection, include_system: false) ⇒ MysqlQueries

Returns a new instance of MysqlQueries.



77
78
79
80
# File 'lib/rdbr/catalog/mysql/queries.rb', line 77

def initialize(connection, include_system: false)
  @connection = connection
  @include_system = include_system
end

Instance Method Details

#checks(namespace, relation) ⇒ Object



96
97
98
# File 'lib/rdbr/catalog/mysql/queries.rb', line 96

def checks(namespace, relation)
  connection.select_all_optional(format_for(CHECKS_SQL, namespace, relation))
end

#columns(namespace, relation) ⇒ Object



92
# File 'lib/rdbr/catalog/mysql/queries.rb', line 92

def columns(namespace, relation) = select_for(COLUMNS_SQL, namespace, relation)

#constraints(namespace, relation) ⇒ Object



94
# File 'lib/rdbr/catalog/mysql/queries.rb', line 94

def constraints(namespace, relation) = select_for(CONSTRAINTS_SQL, namespace, relation)

#databaseObject



82
# File 'lib/rdbr/catalog/mysql/queries.rb', line 82

def database = connection.select_all(DATABASE_SQL)

#indexes(namespace, relation) ⇒ Object



100
# File 'lib/rdbr/catalog/mysql/queries.rb', line 100

def indexes(namespace, relation) = select_for(INDEXES_SQL, namespace, relation)

#namespacesObject



84
85
86
# File 'lib/rdbr/catalog/mysql/queries.rb', line 84

def namespaces
  connection.select_all(format(NAMESPACES_SQL, system_filter: namespace_filter))
end

#relationsObject



88
89
90
# File 'lib/rdbr/catalog/mysql/queries.rb', line 88

def relations
  connection.select_all(format(RELATIONS_SQL, system_filter: relation_filter))
end