Class: DbSchema::Reader::Postgres

Inherits:
Object
  • Object
show all
Defined in:
lib/db_schema/reader/postgres.rb,
lib/db_schema/reader/postgres/table.rb,
lib/db_schema/reader/postgres/version.rb

Defined Under Namespace

Classes: Table

Constant Summary collapse

TABLES_QUERY =
"SELECT table_name\n  FROM information_schema.tables\n WHERE table_type = 'BASE TABLE'\n   AND table_schema = 'public'\n".freeze
COLUMNS_QUERY =
"   SELECT c.table_name,\n    c.column_name AS name,\n    c.ordinal_position AS pos,\n    c.column_default AS default,\n    c.is_nullable AS null,\n    c.data_type AS type,\n    c.is_identity,\n    c.udt_name AS custom_type_name,\n    c.character_maximum_length AS char_length,\n    c.numeric_precision AS num_precision,\n    c.numeric_scale AS num_scale,\n    c.datetime_precision AS dt_precision,\n    c.interval_type,\n    e.data_type AS element_type,\n    e.udt_name AS element_custom_type_name\n     FROM information_schema.columns AS c\nLEFT JOIN information_schema.element_types AS e\n ON e.object_catalog = c.table_catalog\nAND e.object_schema = c.table_schema\nAND e.object_name = c.table_name\nAND e.object_type = 'TABLE'\nAND e.collection_type_identifier = c.dtd_identifier\n    WHERE c.table_schema = 'public'\n".freeze
INDEXES_QUERY =
"   SELECT table_rel.relname AS table_name,\n    pg_class.relname AS name,\n    indkey AS column_positions,\n    indisprimary AS primary,\n    indisunique AS unique,\n    indoption AS index_options,\n    pg_get_expr(indpred, indrelid, true) AS condition,\n    amname AS index_type,\n    indexrelid AS index_oid\n     FROM pg_class, pg_index\nLEFT JOIN pg_opclass\n ON pg_opclass.oid = ANY(pg_index.indclass::int[])\nLEFT JOIN pg_am\n ON pg_am.oid = pg_opclass.opcmethod\n     JOIN pg_class AS table_rel\n ON table_rel.oid = pg_index.indrelid\n     JOIN pg_namespace\n ON pg_namespace.oid = table_rel.relnamespace\n    WHERE pg_class.oid = pg_index.indexrelid\nAND pg_namespace.nspname = 'public'\n GROUP BY table_name, name, column_positions, indisprimary, indisunique, index_options, condition, index_type, index_oid\n".freeze
EXPRESSION_INDEXES_QUERY =
"    WITH index_ids AS (SELECT unnest(?) AS index_id),\n   elements AS (SELECT unnest(?) AS element)\n  SELECT index_id,\n   array_agg(pg_get_indexdef(index_id, element, 't')) AS definitions\n    FROM index_ids, elements\nGROUP BY index_id;\n".freeze
CONSTRAINTS_QUERY =
"   SELECT owner_table.relname AS table_name,\n    constr.conname AS name,\n    pg_get_expr(conbin, conrelid, true) AS condition,\n    referenced_table.relname AS referenced,\n    conkey,\n    confkey,\n    confupdtype AS on_update,\n    confdeltype AS on_delete,\n    condeferrable AS deferrable,\n    constr.contype AS type\n     FROM pg_constraint AS constr\n     JOIN pg_class AS owner_table\n ON owner_table.oid = constr.conrelid\nLEFT JOIN pg_class AS referenced_table\n ON referenced_table.oid = constr.confrelid\n    WHERE contype IN ('c', 'f');\n".freeze
ENUMS_QUERY =
"  SELECT t.typname AS name,\n   array_agg(e.enumlabel ORDER BY e.enumsortorder) AS values\n    FROM pg_enum AS e\n    JOIN pg_type AS t\nON t.oid = e.enumtypid\nGROUP BY name\n".freeze
EXTENSIONS_QUERY =
"SELECT extname\n  FROM pg_extension\n WHERE extname != 'plpgsql'\n".freeze
VERSION =
'0.2.1'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection) ⇒ Postgres

Returns a new instance of Postgres.



110
111
112
# File 'lib/db_schema/reader/postgres.rb', line 110

def initialize(connection)
  @connection = connection
end

Instance Attribute Details

#connectionObject (readonly)

Returns the value of attribute connection.



108
109
110
# File 'lib/db_schema/reader/postgres.rb', line 108

def connection
  @connection
end

Instance Method Details

#read_enumsObject



136
137
138
139
140
# File 'lib/db_schema/reader/postgres.rb', line 136

def read_enums
  connection[ENUMS_QUERY].map do |enum_data|
    Definitions::Enum.new(enum_data[:name].to_sym, enum_data[:values].map(&:to_sym))
  end
end

#read_extensionsObject



142
143
144
145
146
# File 'lib/db_schema/reader/postgres.rb', line 142

def read_extensions
  connection[EXTENSIONS_QUERY].map do |extension_data|
    Definitions::Extension.new(extension_data[:extname].to_sym)
  end
end

#read_schemaObject



114
115
116
117
118
119
120
# File 'lib/db_schema/reader/postgres.rb', line 114

def read_schema
  Definitions::Schema.new(
    tables:     read_tables,
    enums:      read_enums,
    extensions: read_extensions
  )
end

#read_tablesObject



122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/db_schema/reader/postgres.rb', line 122

def read_tables
  checks_data, foreign_keys_data = constraints_data

  table_names.map do |table_name|
    Table.new(
      table_name.to_sym,
      columns_data[table_name],
      indexes_data[table_name],
      checks_data[table_name],
      foreign_keys_data[table_name]
    ).definition
  end
end