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:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-04-13 00:18:30 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-04-13 00:18:30 +0300
commitac48f7c24110a7a1e0a0aa49fc7838ab03c28374 (patch)
tree0d323ff3b3317315241fd1c784d82bfa0577711e /lib/gitlab
parent6ce6d20cf0b81275bad7bf8e95cf49bd475c5c4f (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab')
-rw-r--r--lib/gitlab/database/schema_validation/database.rb38
-rw-r--r--lib/gitlab/database/schema_validation/schema_objects/table.rb25
-rw-r--r--lib/gitlab/database/schema_validation/structure_sql.rb16
-rw-r--r--lib/gitlab/database/schema_validation/validators/base_validator.rb2
-rw-r--r--lib/gitlab/database/schema_validation/validators/extra_tables.rb21
-rw-r--r--lib/gitlab/database/schema_validation/validators/missing_tables.rb21
-rw-r--r--lib/gitlab/email/hook/silent_mode_interceptor.rb27
7 files changed, 150 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
diff --git a/lib/gitlab/database/schema_validation/schema_objects/table.rb b/lib/gitlab/database/schema_validation/schema_objects/table.rb
new file mode 100644
index 00000000000..6dc7ee32706
--- /dev/null
+++ b/lib/gitlab/database/schema_validation/schema_objects/table.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module SchemaValidation
+ module SchemaObjects
+ class Table
+ def initialize(name)
+ @name = name
+ end
+
+ def table_name
+ name
+ end
+
+ def statement
+ nil
+ end
+
+ attr_reader :name
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/schema_validation/structure_sql.rb b/lib/gitlab/database/schema_validation/structure_sql.rb
index cb62af8d8b8..687b3b73ec8 100644
--- a/lib/gitlab/database/schema_validation/structure_sql.rb
+++ b/lib/gitlab/database/schema_validation/structure_sql.rb
@@ -19,6 +19,14 @@ module Gitlab
triggers.find { |trigger| trigger.name == trigger_name }.present?
end
+ def fetch_table_by_name(table_name)
+ tables.find { |table| table.name == table_name }
+ end
+
+ def table_exists?(table_name)
+ fetch_table_by_name(table_name).present?
+ end
+
def indexes
@indexes ||= map_with_default_schema(index_statements, SchemaObjects::Index)
end
@@ -27,6 +35,10 @@ module Gitlab
@triggers ||= map_with_default_schema(trigger_statements, SchemaObjects::Trigger)
end
+ def tables
+ @tables ||= table_statements.map { |stmt| SchemaObjects::Table.new(stmt.relation.relname) }
+ end
+
private
attr_reader :structure_file_path, :schema_name
@@ -39,6 +51,10 @@ module Gitlab
statements.filter_map { |s| s.stmt.create_trig_stmt }
end
+ def table_statements
+ statements.filter_map { |s| s.stmt.create_stmt }
+ end
+
def statements
@statements ||= parsed_structure_file.tree.stmts
end
diff --git a/lib/gitlab/database/schema_validation/validators/base_validator.rb b/lib/gitlab/database/schema_validation/validators/base_validator.rb
index d3c92871721..0593bb5f6ae 100644
--- a/lib/gitlab/database/schema_validation/validators/base_validator.rb
+++ b/lib/gitlab/database/schema_validation/validators/base_validator.rb
@@ -14,8 +14,10 @@ module Gitlab
def self.all_validators
[
+ ExtraTables,
ExtraIndexes,
ExtraTriggers,
+ MissingTables,
MissingIndexes,
MissingTriggers,
DifferentDefinitionIndexes,
diff --git a/lib/gitlab/database/schema_validation/validators/extra_tables.rb b/lib/gitlab/database/schema_validation/validators/extra_tables.rb
new file mode 100644
index 00000000000..99e98eb8f67
--- /dev/null
+++ b/lib/gitlab/database/schema_validation/validators/extra_tables.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module SchemaValidation
+ module Validators
+ class ExtraTables < BaseValidator
+ ERROR_MESSAGE = "The table %s is present in the database, but not in the structure.sql file"
+
+ def execute
+ database.tables.filter_map do |database_table|
+ next if structure_sql.table_exists?(database_table.name)
+
+ build_inconsistency(self.class, nil, database_table)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/schema_validation/validators/missing_tables.rb b/lib/gitlab/database/schema_validation/validators/missing_tables.rb
new file mode 100644
index 00000000000..f1c9383487d
--- /dev/null
+++ b/lib/gitlab/database/schema_validation/validators/missing_tables.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module SchemaValidation
+ module Validators
+ class MissingTables < BaseValidator
+ ERROR_MESSAGE = "The table %s is missing from the database"
+
+ def execute
+ structure_sql.tables.filter_map do |structure_sql_table|
+ next if database.table_exists?(structure_sql_table.name)
+
+ build_inconsistency(self.class, structure_sql_table, nil)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/email/hook/silent_mode_interceptor.rb b/lib/gitlab/email/hook/silent_mode_interceptor.rb
new file mode 100644
index 00000000000..56f94119472
--- /dev/null
+++ b/lib/gitlab/email/hook/silent_mode_interceptor.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Email
+ module Hook
+ class SilentModeInterceptor
+ def self.delivering_email(message)
+ if Gitlab::CurrentSettings.silent_mode_enabled?
+ message.perform_deliveries = false
+
+ Gitlab::AppJsonLogger.info(
+ message: "SilentModeInterceptor prevented sending mail",
+ mail_subject: message.subject,
+ silent_mode_enabled: true
+ )
+ else
+ Gitlab::AppJsonLogger.debug(
+ message: "SilentModeInterceptor did nothing",
+ mail_subject: message.subject,
+ silent_mode_enabled: false
+ )
+ end
+ end
+ end
+ end
+ end
+end