Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/database/schema_validation/database.rb')
-rw-r--r--lib/gitlab/database/schema_validation/database.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/gitlab/database/schema_validation/database.rb b/lib/gitlab/database/schema_validation/database.rb
index 07bd02e58e1..83224629e5f 100644
--- a/lib/gitlab/database/schema_validation/database.rb
+++ b/lib/gitlab/database/schema_validation/database.rb
@@ -18,6 +18,10 @@ module Gitlab
trigger_map[trigger_name]
end
+ def fetch_table_by_name(table_name)
+ table_map[table_name]
+ end
+
def index_exists?(index_name)
index_map[index_name].present?
end
@@ -26,6 +30,10 @@ module Gitlab
trigger_map[trigger_name].present?
end
+ def table_exists?(table_name)
+ fetch_table_by_name(table_name).present?
+ end
+
def indexes
index_map.values
end
@@ -34,6 +42,10 @@ module Gitlab
trigger_map.values
end
+ def tables
+ table_map.values
+ end
+
private
attr_reader :connection
@@ -56,6 +68,10 @@ module Gitlab
end
end
+ def table_map
+ @table_map ||= fetch_tables.transform_values! { |stmt| SchemaObjects::Table.new(stmt.first['table_name']) }
+ end
+
def fetch_indexes
sql = <<~SQL
SELECT indexname, indexdef
@@ -78,6 +94,28 @@ module Gitlab
connection.select_rows(sql, nil, schemas).to_h
end
+
+ def fetch_tables
+ sql = <<~SQL
+ SELECT
+ table_information.relname AS table_name,
+ col_information.attname AS column_name,
+ col_information.attnotnull AS not_null,
+ format_type(col_information.atttypid, col_information.atttypmod) AS data_type,
+ pg_get_expr(col_default_information.adbin, col_default_information.adrelid) AS column_default
+ FROM pg_attribute AS col_information
+ JOIN pg_class AS table_information ON col_information.attrelid = table_information.oid
+ JOIN pg_namespace AS schema_information ON table_information.relnamespace = schema_information.oid
+ LEFT JOIN pg_attrdef AS col_default_information ON col_information.attrelid = col_default_information.adrelid
+ AND col_information.attnum = col_default_information.adnum
+ WHERE NOT col_information.attisdropped
+ AND col_information.attnum > 0
+ AND table_information.relkind IN ('r', 'p')
+ AND schema_information.nspname IN ($1, $2)
+ SQL
+
+ connection.exec_query(sql, nil, schemas).group_by { |row| row['table_name'] }
+ end
end
end
end