Module: Gitlab::Database::SchemaHelpers

Instance Method Summary collapse

Instance Method Details

#assert_not_in_transaction_block(scope:) ⇒ Object


82
83
84
85
86
87
88
# File 'lib/gitlab/database/schema_helpers.rb', line 82

def assert_not_in_transaction_block(scope:)
  return unless transaction_open?

  raise "#{scope} operations can not be run inside a transaction block, " \
    "you can disable transaction blocks by calling disable_ddl_transaction! " \
    "in the body of your migration class"
end

#create_comment(type, name, text) ⇒ Object


57
58
59
# File 'lib/gitlab/database/schema_helpers.rb', line 57

def create_comment(type, name, text)
  execute("COMMENT ON #{type} #{name} IS '#{text}'")
end

#create_trigger(table_name, name, function_name, fires:) ⇒ Object


23
24
25
26
27
28
29
30
31
# File 'lib/gitlab/database/schema_helpers.rb', line 23

def create_trigger(table_name, name, function_name, fires:)
  execute(<<~SQL)
    CREATE TRIGGER #{name}
    #{fires} ON #{table_name}
    FOR EACH ROW
    #{yield if block_given?}
    EXECUTE FUNCTION #{function_name}()
  SQL
end

#create_trigger_function(name, replace: true) ⇒ Object


6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/gitlab/database/schema_helpers.rb', line 6

def create_trigger_function(name, replace: true)
  replace_clause = optional_clause(replace, "OR REPLACE")
  execute(<<~SQL)
    CREATE #{replace_clause} FUNCTION #{name}()
    RETURNS TRIGGER AS
    $$
    BEGIN
    #{yield}
    END
    $$ LANGUAGE PLPGSQL
  SQL
end

#drop_function(name, if_exists: true) ⇒ Object


47
48
49
50
# File 'lib/gitlab/database/schema_helpers.rb', line 47

def drop_function(name, if_exists: true)
  exists_clause = optional_clause(if_exists, "IF EXISTS")
  execute("DROP FUNCTION #{exists_clause} #{name}()")
end

#drop_trigger(table_name, name, if_exists: true) ⇒ Object


52
53
54
55
# File 'lib/gitlab/database/schema_helpers.rb', line 52

def drop_trigger(table_name, name, if_exists: true)
  exists_clause = optional_clause(if_exists, "IF EXISTS")
  execute("DROP TRIGGER #{exists_clause} #{name} ON #{table_name}")
end

#function_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)

19
20
21
# File 'lib/gitlab/database/schema_helpers.rb', line 19

def function_exists?(name)
  connection.select_value("SELECT 1 FROM pg_proc WHERE proname = '#{name}'")
end

#object_name(table, type) ⇒ Object


67
68
69
70
71
72
# File 'lib/gitlab/database/schema_helpers.rb', line 67

def object_name(table, type)
  identifier = "#{table}_#{type}"
  hashed_identifier = Digest::SHA256.hexdigest(identifier).first(10)

  "#{type}_#{hashed_identifier}"
end

#tmp_table_name(base) ⇒ Object


61
62
63
64
65
# File 'lib/gitlab/database/schema_helpers.rb', line 61

def tmp_table_name(base)
  hashed_base = Digest::SHA256.hexdigest(base).first(10)

  "#{base}_#{hashed_base}"
end

#trigger_exists?(table_name, name) ⇒ Boolean

Returns:

  • (Boolean)

33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/gitlab/database/schema_helpers.rb', line 33

def trigger_exists?(table_name, name)
  connection.select_value(<<~SQL)
    SELECT 1
    FROM pg_catalog.pg_trigger trgr
      INNER JOIN pg_catalog.pg_class rel
        ON trgr.tgrelid = rel.oid
      INNER JOIN pg_catalog.pg_namespace nsp
        ON nsp.oid = rel.relnamespace
    WHERE nsp.nspname = #{connection.quote(current_schema)}
      AND rel.relname = #{connection.quote(table_name)}
      AND trgr.tgname = #{connection.quote(name)}
  SQL
end

#with_lock_retries(&block) ⇒ Object


74
75
76
77
78
79
80
# File 'lib/gitlab/database/schema_helpers.rb', line 74

def with_lock_retries(&block)
  Gitlab::Database::WithLockRetries.new(
    connection: connection,
    klass: self.class,
    logger: Gitlab::BackgroundMigration::Logger
  ).run(&block)
end