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

Class Method Details

.cross_foreign_key_allowed?(table_schemas, all_tables) ⇒ Boolean

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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_schemaObject



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_schemaObject



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_schemaObject



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

Returns:

  • (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_namesObject



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_schemaObject



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_schemaObject



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_schemaObject



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