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-03-21 18:09:11 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-03-21 18:09:11 +0300
commit97a128c1d1bf45bcc00d5fae037f840eff1ae4e0 (patch)
treebb599771ab8da98296a8fbd4573b9eaf137ea315 /lib/gitlab/database
parent7f521d27811b472c43203ed3d1bde4460a617f89 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/database')
-rw-r--r--lib/gitlab/database/schema_validation/inconsistency.rb57
-rw-r--r--lib/gitlab/database/schema_validation/index.rb25
-rw-r--r--lib/gitlab/database/schema_validation/validators/base_validator.rb8
-rw-r--r--lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb4
-rw-r--r--lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb4
-rw-r--r--lib/gitlab/database/schema_validation/validators/extra_indexes.rb8
-rw-r--r--lib/gitlab/database/schema_validation/validators/extra_triggers.rb8
-rw-r--r--lib/gitlab/database/schema_validation/validators/missing_indexes.rb8
-rw-r--r--lib/gitlab/database/schema_validation/validators/missing_triggers.rb8
9 files changed, 111 insertions, 19 deletions
diff --git a/lib/gitlab/database/schema_validation/inconsistency.rb b/lib/gitlab/database/schema_validation/inconsistency.rb
new file mode 100644
index 00000000000..ea85429364b
--- /dev/null
+++ b/lib/gitlab/database/schema_validation/inconsistency.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module SchemaValidation
+ class Inconsistency
+ def initialize(validator_class, structure_sql_object, database_object)
+ @validator_class = validator_class
+ @structure_sql_object = structure_sql_object
+ @database_object = database_object
+ end
+
+ def error_message
+ format(validator_class::ERROR_MESSAGE, object_name)
+ end
+
+ def type
+ validator_class.name.demodulize.underscore
+ end
+
+ def object_name
+ structure_sql_object&.name || database_object&.name
+ end
+
+ def diff
+ Diffy::Diff.new(structure_sql_statement, database_statement)
+ end
+
+ def inspect
+ <<~MSG
+ #{'-' * 54}
+ #{error_message}
+ Diff:
+ #{diff.to_s(:color)}
+ #{'-' * 54}
+ MSG
+ end
+
+ private
+
+ attr_reader :validator_class, :structure_sql_object, :database_object
+
+ def structure_sql_statement
+ return unless structure_sql_object
+
+ "#{structure_sql_object.statement}\n"
+ end
+
+ def database_statement
+ return unless database_object
+
+ "#{database_object.statement}\n"
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/schema_validation/index.rb b/lib/gitlab/database/schema_validation/index.rb
new file mode 100644
index 00000000000..af0d5f31f4e
--- /dev/null
+++ b/lib/gitlab/database/schema_validation/index.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module SchemaValidation
+ class Index
+ def initialize(parsed_stmt)
+ @parsed_stmt = parsed_stmt
+ end
+
+ def name
+ parsed_stmt.idxname
+ end
+
+ def statement
+ @statement ||= PgQuery.deparse_stmt(parsed_stmt)
+ end
+
+ private
+
+ attr_reader :parsed_stmt
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/schema_validation/validators/base_validator.rb b/lib/gitlab/database/schema_validation/validators/base_validator.rb
index 14995b5f378..d3c92871721 100644
--- a/lib/gitlab/database/schema_validation/validators/base_validator.rb
+++ b/lib/gitlab/database/schema_validation/validators/base_validator.rb
@@ -5,7 +5,7 @@ module Gitlab
module SchemaValidation
module Validators
class BaseValidator
- Inconsistency = Struct.new(:type, :object_name, :statement)
+ ERROR_MESSAGE = 'A schema inconsistency has been found'
def initialize(structure_sql, database)
@structure_sql = structure_sql
@@ -31,10 +31,8 @@ module Gitlab
attr_reader :structure_sql, :database
- def build_inconsistency(validator_class, schema_object)
- inconsistency_type = validator_class.name.demodulize.underscore
-
- Inconsistency.new(inconsistency_type, schema_object.name, schema_object.statement)
+ def build_inconsistency(validator_class, structure_sql_object, database_object)
+ Inconsistency.new(validator_class, structure_sql_object, database_object)
end
end
end
diff --git a/lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb b/lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb
index d54b62ac1e7..ba12b3cdc61 100644
--- a/lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb
+++ b/lib/gitlab/database/schema_validation/validators/different_definition_indexes.rb
@@ -5,6 +5,8 @@ module Gitlab
module SchemaValidation
module Validators
class DifferentDefinitionIndexes < BaseValidator
+ ERROR_MESSAGE = "The %s index has a different statement between structure.sql and database"
+
def execute
structure_sql.indexes.filter_map do |structure_sql_index|
database_index = database.fetch_index_by_name(structure_sql_index.name)
@@ -12,7 +14,7 @@ module Gitlab
next if database_index.nil?
next if database_index.statement == structure_sql_index.statement
- build_inconsistency(self.class, structure_sql_index)
+ build_inconsistency(self.class, structure_sql_index, database_index)
end
end
end
diff --git a/lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb b/lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb
index efb87a70ca8..79ffe9a6a98 100644
--- a/lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb
+++ b/lib/gitlab/database/schema_validation/validators/different_definition_triggers.rb
@@ -5,6 +5,8 @@ module Gitlab
module SchemaValidation
module Validators
class DifferentDefinitionTriggers < BaseValidator
+ ERROR_MESSAGE = "The %s trigger has a different statement between structure.sql and database"
+
def execute
structure_sql.triggers.filter_map do |structure_sql_trigger|
database_trigger = database.fetch_trigger_by_name(structure_sql_trigger.name)
@@ -12,7 +14,7 @@ module Gitlab
next if database_trigger.nil?
next if database_trigger.statement == structure_sql_trigger.statement
- build_inconsistency(self.class, structure_sql_trigger)
+ build_inconsistency(self.class, structure_sql_trigger, nil)
end
end
end
diff --git a/lib/gitlab/database/schema_validation/validators/extra_indexes.rb b/lib/gitlab/database/schema_validation/validators/extra_indexes.rb
index 28384dd7cee..c8d3749894b 100644
--- a/lib/gitlab/database/schema_validation/validators/extra_indexes.rb
+++ b/lib/gitlab/database/schema_validation/validators/extra_indexes.rb
@@ -5,11 +5,13 @@ module Gitlab
module SchemaValidation
module Validators
class ExtraIndexes < BaseValidator
+ ERROR_MESSAGE = "The index %s is present in the database, but not in the structure.sql file"
+
def execute
- database.indexes.filter_map do |index|
- next if structure_sql.index_exists?(index.name)
+ database.indexes.filter_map do |database_index|
+ next if structure_sql.index_exists?(database_index.name)
- build_inconsistency(self.class, index)
+ build_inconsistency(self.class, nil, database_index)
end
end
end
diff --git a/lib/gitlab/database/schema_validation/validators/extra_triggers.rb b/lib/gitlab/database/schema_validation/validators/extra_triggers.rb
index f03bb49526c..37dcbc53e2e 100644
--- a/lib/gitlab/database/schema_validation/validators/extra_triggers.rb
+++ b/lib/gitlab/database/schema_validation/validators/extra_triggers.rb
@@ -5,11 +5,13 @@ module Gitlab
module SchemaValidation
module Validators
class ExtraTriggers < BaseValidator
+ ERROR_MESSAGE = "The trigger %s is present in the database, but not in the structure.sql file"
+
def execute
- database.triggers.filter_map do |trigger|
- next if structure_sql.trigger_exists?(trigger.name)
+ database.triggers.filter_map do |database_trigger|
+ next if structure_sql.trigger_exists?(database_trigger.name)
- build_inconsistency(self.class, trigger)
+ build_inconsistency(self.class, nil, database_trigger)
end
end
end
diff --git a/lib/gitlab/database/schema_validation/validators/missing_indexes.rb b/lib/gitlab/database/schema_validation/validators/missing_indexes.rb
index ac0ea0152ba..7f81aaccf0f 100644
--- a/lib/gitlab/database/schema_validation/validators/missing_indexes.rb
+++ b/lib/gitlab/database/schema_validation/validators/missing_indexes.rb
@@ -5,11 +5,13 @@ module Gitlab
module SchemaValidation
module Validators
class MissingIndexes < BaseValidator
+ ERROR_MESSAGE = "The index %s is missing from the database"
+
def execute
- structure_sql.indexes.filter_map do |index|
- next if database.index_exists?(index.name)
+ structure_sql.indexes.filter_map do |structure_sql_index|
+ next if database.index_exists?(structure_sql_index.name)
- build_inconsistency(self.class, index)
+ build_inconsistency(self.class, structure_sql_index, nil)
end
end
end
diff --git a/lib/gitlab/database/schema_validation/validators/missing_triggers.rb b/lib/gitlab/database/schema_validation/validators/missing_triggers.rb
index c7137c68c1c..36236463bbf 100644
--- a/lib/gitlab/database/schema_validation/validators/missing_triggers.rb
+++ b/lib/gitlab/database/schema_validation/validators/missing_triggers.rb
@@ -5,11 +5,13 @@ module Gitlab
module SchemaValidation
module Validators
class MissingTriggers < BaseValidator
+ ERROR_MESSAGE = "The trigger %s is missing from the database"
+
def execute
- structure_sql.triggers.filter_map do |index|
- next if database.trigger_exists?(index.name)
+ structure_sql.triggers.filter_map do |structure_sql_trigger|
+ next if database.trigger_exists?(structure_sql_trigger.name)
- build_inconsistency(self.class, index)
+ build_inconsistency(self.class, structure_sql_trigger, nil)
end
end
end