Class: Gitlab::Database::AlterCellSequencesRange
- Inherits:
-
Object
- Object
- Gitlab::Database::AlterCellSequencesRange
- Defined in:
- lib/gitlab/database/alter_cell_sequences_range.rb
Constant Summary collapse
- MISSING_LIMIT_MSG =
'minval and maxval are required to alter sequence range'
Instance Attribute Summary collapse
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
-
#logger ⇒ Object
readonly
Returns the value of attribute logger.
-
#maxval ⇒ Object
readonly
Returns the value of attribute maxval.
-
#minval ⇒ Object
readonly
Returns the value of attribute minval.
-
#sequence_names ⇒ Object
readonly
Returns the value of attribute sequence_names.
Instance Method Summary collapse
- #alter_new_sequences_range_function ⇒ Object
- #alter_new_sequences_range_trigger ⇒ Object
- #execute ⇒ Object
-
#initialize(minval, maxval, connection, sequence_names: nil, logger: Gitlab::AppLogger) ⇒ AlterCellSequencesRange
constructor
A new instance of AlterCellSequencesRange.
Constructor Details
#initialize(minval, maxval, connection, sequence_names: nil, logger: Gitlab::AppLogger) ⇒ AlterCellSequencesRange
Returns a new instance of AlterCellSequencesRange.
10 11 12 13 14 15 16 17 18 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 10 def initialize(minval, maxval, connection, sequence_names: nil, logger: Gitlab::AppLogger) raise MISSING_LIMIT_MSG unless minval.present? && maxval.present? @minval = minval @maxval = maxval @connection = connection @logger = logger @sequence_names = Array(sequence_names) end |
Instance Attribute Details
#connection ⇒ Object (readonly)
Returns the value of attribute connection.
8 9 10 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 8 def connection @connection end |
#logger ⇒ Object (readonly)
Returns the value of attribute logger.
8 9 10 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 8 def logger @logger end |
#maxval ⇒ Object (readonly)
Returns the value of attribute maxval.
8 9 10 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 8 def maxval @maxval end |
#minval ⇒ Object (readonly)
Returns the value of attribute minval.
8 9 10 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 8 def minval @minval end |
#sequence_names ⇒ Object (readonly)
Returns the value of attribute sequence_names.
8 9 10 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 8 def sequence_names @sequence_names end |
Instance Method Details
#alter_new_sequences_range_function ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 47 def alter_new_sequences_range_function " CREATE OR REPLACE FUNCTION alter_new_sequences_range()\n RETURNS event_trigger\n AS $$\n DECLARE\n command_record RECORD;\n sequence_name text;\n current_minval BIGINT;\n current_maxval BIGINT;\n BEGIN\n FOR command_record IN SELECT * FROM pg_event_trigger_ddl_commands () LOOP\n -- CREATE TABLE, ALTER TABLE will fire ALTER SEQUENCE event when SERIAL, BIGSERIAL IDs are used.\n IF command_record.command_tag IN ('CREATE SEQUENCE', 'ALTER SEQUENCE') THEN\n sequence_name := substring(command_record.object_identity FROM '([^.]+)$');\n\n SELECT min_value, max_value INTO current_minval, current_maxval FROM pg_sequences\n WHERE sequencename = sequence_name;\n\n -- On bumping sequence ranges using gitlab:db:increase_sequences_range, new ranges will always be\n -- greater than the existing ones. The below check catches the default minval (1) and updates accordingly.\n IF current_minval < \#{minval} OR current_maxval < \#{maxval} THEN\n RAISE NOTICE 'Altering sequence \"%\" with range [%, %]', sequence_name, \#{minval}, \#{maxval};\n\n EXECUTE FORMAT('ALTER SEQUENCE %I START %s RESTART %s MINVALUE %s MAXVALUE %s',\n sequence_name,\n \#{minval},\n \#{minval},\n \#{minval},\n \#{maxval}\n );\n END IF;\n END IF;\n END LOOP;\n END;\n $$ LANGUAGE plpgsql;\n SQL\nend\n" |
#alter_new_sequences_range_trigger ⇒ Object
86 87 88 89 90 91 92 93 94 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 86 def alter_new_sequences_range_trigger " DROP EVENT TRIGGER IF EXISTS alter_new_sequences_range;\n\n CREATE EVENT TRIGGER alter_new_sequences_range ON ddl_command_end\n WHEN TAG IN ('CREATE TABLE', 'ALTER TABLE', 'CREATE SEQUENCE', 'ALTER SEQUENCE')\n EXECUTE FUNCTION alter_new_sequences_range();\n SQL\nend\n" |
#execute ⇒ Object
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 |
# File 'lib/gitlab/database/alter_cell_sequences_range.rb', line 20 def execute logger.info("Altering sequences with minval: #{minval}, maxval: #{maxval}") sequences.each do |sequence| # Ensures sequence will not provide already existing IDs if minval <= sequence.last_value.to_i raise "`minval` should be greater than the `last_value` of the sequence #{sequence.seq_name}" end with_lock_retries do alter_sequence_query = " ALTER SEQUENCE \#{sequence.seq_name}\n START \#{minval} RESTART \#{minval} MINVALUE \#{minval} MAXVALUE \#{maxval}\n SQL\n\n connection.execute(alter_sequence_query)\n end\n end\n\n logger.info(\"Altered [\#{sequences.pluck(:seq_name).join(',')}] range.\")\n\n return if sequence_names.present? # Below event trigger is needed only while loading the Db.\n\n connection.execute(alter_new_sequences_range_function)\n connection.execute(alter_new_sequences_range_trigger)\nend\n" |