Module: Gitlab::Database::GitlabSchema
- Defined in:
- lib/gitlab/database/gitlab_schema.rb
Constant Summary collapse
- UnknownSchemaError =
Class.new(StandardError)
- IMPLICIT_GITLAB_SCHEMAS =
Mainly used for test tables It maps table names prefixes to gitlab_schemas. The order of keys matter. Prefixes that contain other prefixes should come first.
{ '_test_gitlab_main_clusterwide_' => :gitlab_main_clusterwide, '_test_gitlab_main_cell_' => :gitlab_main_cell, '_test_gitlab_main_' => :gitlab_main, '_test_gitlab_ci_' => :gitlab_ci, '_test_gitlab_sec_' => :gitlab_sec, '_test_gitlab_jh_' => :gitlab_jh, '_test_gitlab_embedding_' => :gitlab_embedding, '_test_gitlab_geo_' => :gitlab_geo, '_test_gitlab_pm_' => :gitlab_pm, '_test_' => :gitlab_shared, 'pg_' => :gitlab_internal }.freeze
Class Method Summary collapse
- .cross_foreign_key_allowed?(table_schemas, all_tables) ⇒ Boolean
- .cross_joins_allowed?(table_schemas, all_tables) ⇒ Boolean
- .cross_transactions_allowed?(table_schemas, all_tables) ⇒ Boolean
- .deleted_tables_to_schema ⇒ Object
- .deleted_views_and_tables_to_schema ⇒ Object
- .deleted_views_to_schema ⇒ Object
- .require_sharding_key?(schema) ⇒ Boolean
- .schema_names ⇒ Object
- .sharding_root_tables(schema) ⇒ Object
- .table_schema(name) ⇒ Object
- .table_schema!(name) ⇒ Object
- .table_schemas!(tables) ⇒ Object
- .tables_to_schema ⇒ Object
- .views_and_tables_to_schema ⇒ Object
- .views_to_schema ⇒ Object
Class Method Details
.cross_foreign_key_allowed?(table_schemas, all_tables) ⇒ Boolean
120 121 122 123 124 125 126 127 128 129 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 120 def self.cross_foreign_key_allowed?(table_schemas, all_tables) return true if table_schemas.one? table_schemas.any? do |schema| schema_info = Gitlab::Database.all_gitlab_schemas[schema] next false unless schema_info schema_info.allow_cross_foreign_keys?(table_schemas, all_tables) end end |
.cross_joins_allowed?(table_schemas, all_tables) ⇒ Boolean
98 99 100 101 102 103 104 105 106 107 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 98 def self.cross_joins_allowed?(table_schemas, all_tables) return true unless table_schemas.many? table_schemas.any? do |schema| schema_info = Gitlab::Database.all_gitlab_schemas[schema] next false unless schema_info schema_info.allow_cross_joins?(table_schemas, all_tables) end end |
.cross_transactions_allowed?(table_schemas, all_tables) ⇒ Boolean
109 110 111 112 113 114 115 116 117 118 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 109 def self.cross_transactions_allowed?(table_schemas, all_tables) return true unless table_schemas.many? table_schemas.any? do |schema| schema_info = Gitlab::Database.all_gitlab_schemas[schema] next false unless schema_info schema_info.allow_cross_transactions?(table_schemas, all_tables) end end |
.deleted_tables_to_schema ⇒ Object
139 140 141 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 139 def self.deleted_tables_to_schema @deleted_tables_to_schema ||= ::Gitlab::Database::Dictionary.entries('deleted_tables').to_name_and_schema_mapping end |
.deleted_views_and_tables_to_schema ⇒ Object
135 136 137 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 135 def self.deleted_views_and_tables_to_schema @deleted_views_and_tables_to_schema ||= self.deleted_tables_to_schema.merge(self.deleted_views_to_schema) end |
.deleted_views_to_schema ⇒ Object
143 144 145 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 143 def self.deleted_views_to_schema @deleted_views_to_schema ||= ::Gitlab::Database::Dictionary.entries('deleted_views').to_name_and_schema_mapping end |
.require_sharding_key?(schema) ⇒ Boolean
90 91 92 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 90 def self.require_sharding_key?(schema) Gitlab::Database.all_gitlab_schemas[schema.to_s].require_sharding_key end |
.schema_names ⇒ Object
155 156 157 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 155 def self.schema_names @schema_names ||= self.views_and_tables_to_schema.values.to_set end |
.sharding_root_tables(schema) ⇒ Object
94 95 96 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 94 def self.sharding_root_tables(schema) Gitlab::Database.all_gitlab_schemas[schema.to_s].sharding_root_tables end |
.table_schema(name) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 43 def self.table_schema(name) schema_name, table_name = name.split('.', 2) # Strip schema name like: `public.` # Most of names do not have schemas, ensure that this is table unless table_name table_name = schema_name schema_name = nil end # strip partition number of a form `loose_foreign_keys_deleted_records_1` table_name.gsub!(/_[0-9]+$/, '') # Tables and views that are properly mapped if gitlab_schema = views_and_tables_to_schema[table_name] return gitlab_schema end # Tables and views that are deleted, but we still need to reference them if gitlab_schema = deleted_views_and_tables_to_schema[table_name] return gitlab_schema end # Partitions that belong to the CI domain if table_name.start_with?('ci_') && gitlab_schema = views_and_tables_to_schema["p_#{table_name}"] return gitlab_schema end # All tables from `information_schema.` are marked as `internal` return :gitlab_internal if schema_name == 'information_schema' IMPLICIT_GITLAB_SCHEMAS.each do |prefix, gitlab_schema| return gitlab_schema if table_name.start_with?(prefix) end nil end |
.table_schema!(name) ⇒ Object
80 81 82 83 84 85 86 87 88 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 80 def self.table_schema!(name) # rubocop:disable Gitlab/DocumentationLinks/HardcodedUrl self.table_schema(name) || raise( UnknownSchemaError, "Could not find gitlab schema for table #{name}: Any new or deleted tables must be added to the database dictionary " \ "See https://docs.gitlab.com/ee/development/database/database_dictionary.html" ) # rubocop:enable Gitlab/DocumentationLinks/HardcodedUrl end |
.table_schemas!(tables) ⇒ Object
22 23 24 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 22 def self.table_schemas!(tables) tables.map { |table| table_schema!(table) }.to_set end |
.tables_to_schema ⇒ Object
147 148 149 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 147 def self.tables_to_schema @tables_to_schema ||= ::Gitlab::Database::Dictionary.entries.to_name_and_schema_mapping end |
.views_and_tables_to_schema ⇒ Object
131 132 133 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 131 def self.views_and_tables_to_schema @views_and_tables_to_schema ||= self.tables_to_schema.merge(self.views_to_schema) end |
.views_to_schema ⇒ Object
151 152 153 |
# File 'lib/gitlab/database/gitlab_schema.rb', line 151 def self.views_to_schema @views_to_schema ||= ::Gitlab::Database::Dictionary.entries('views').to_name_and_schema_mapping end |