summaryrefslogtreecommitdiff
path: root/config/initializers/ar5_pg_10_support.rb
diff options
context:
space:
mode:
authorNick Thomas <nick@gitlab.com>2018-01-15 17:05:51 +0000
committerNick Thomas <nick@gitlab.com>2018-01-16 14:04:50 +0000
commit3bb798756e52368ae2ae4a512e86a543dea8ca21 (patch)
tree99f05f8b6a93bfbd5160bbc740dc9cc905eddbf0 /config/initializers/ar5_pg_10_support.rb
parent04edbb5fb34c219e5179e3a6f59584835ce9ef8f (diff)
downloadgitlab-ce-3bb798756e52368ae2ae4a512e86a543dea8ca21.tar.gz
Support PostgreSQL 10
Diffstat (limited to 'config/initializers/ar5_pg_10_support.rb')
-rw-r--r--config/initializers/ar5_pg_10_support.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/config/initializers/ar5_pg_10_support.rb b/config/initializers/ar5_pg_10_support.rb
new file mode 100644
index 00000000000..3d8ccd814a8
--- /dev/null
+++ b/config/initializers/ar5_pg_10_support.rb
@@ -0,0 +1,48 @@
+raise "Vendored ActiveRecord 5 code! Delete #{__FILE__}!" if ActiveRecord::VERSION::MAJOR >= 5
+
+require 'active_record/connection_adapters/postgresql/schema_statements'
+
+#
+# Monkey-patch the refused Rails 4.2 patch at https://github.com/rails/rails/pull/31330
+#
+# Updates sequence logic to support PostgreSQL 10.
+#
+# rubocop:disable all
+module ActiveRecord
+ module ConnectionAdapters
+ module PostgreSQL
+ module SchemaStatements
+ # Resets the sequence of a table's primary key to the maximum value.
+ def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc:
+ unless pk and sequence
+ default_pk, default_sequence = pk_and_sequence_for(table)
+
+ pk ||= default_pk
+ sequence ||= default_sequence
+ end
+
+ if @logger && pk && !sequence
+ @logger.warn "#{table} has primary key #{pk} with no default sequence"
+ end
+
+ if pk && sequence
+ quoted_sequence = quote_table_name(sequence)
+ max_pk = select_value("SELECT MAX(#{quote_column_name pk}) FROM #{quote_table_name(table)}")
+ if max_pk.nil?
+ if postgresql_version >= 100000
+ minvalue = select_value("SELECT seqmin FROM pg_sequence WHERE seqrelid = #{quote(quoted_sequence)}::regclass")
+ else
+ minvalue = select_value("SELECT min_value FROM #{quoted_sequence}")
+ end
+ end
+
+ select_value <<-end_sql, 'SCHEMA'
+ SELECT setval(#{quote(quoted_sequence)}, #{max_pk ? max_pk : minvalue}, #{max_pk ? true : false})
+ end_sql
+ end
+ end
+ end
+ end
+ end
+end
+# rubocop:enable all