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

foreign_key_structure_sql_adapter.rb « adapters « schema_validation « database « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e4c1e1adab3754e53a9053138f1199ee065c7534 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# frozen_string_literal: true

module Gitlab
  module Database
    module SchemaValidation
      module Adapters
        class ForeignKeyStructureSqlAdapter
          STATEMENT_REGEX = /\bREFERENCES\s\K\S+\K\s\(/
          EXTRACT_REGEX = /\bFOREIGN KEY.*/

          def initialize(parsed_stmt)
            @parsed_stmt = parsed_stmt
          end

          def name
            "#{schema_name}.#{foreign_key_name}"
          end

          def table_name
            parsed_stmt.relation.relname
          end

          # PgQuery parses FK statements with an extra space in the referenced table column.
          # This extra space needs to be removed.
          #
          # @example REFERENCES ci_pipelines (id) => REFERENCES ci_pipelines(id)
          def statement
            deparse_stmt[EXTRACT_REGEX].gsub(STATEMENT_REGEX, '(')
          end

          private

          attr_reader :parsed_stmt

          def schema_name
            parsed_stmt.relation.schemaname
          end

          def foreign_key_name
            parsed_stmt.cmds.first.alter_table_cmd.def.constraint.conname
          end

          def deparse_stmt
            PgQuery.deparse_stmt(parsed_stmt)
          end
        end
      end
    end
  end
end