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
|