Guest User

Untitled

a guest
Apr 26th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. # frozen_string_literal: true
  2.  
  3. require 'active_record/connection_adapters/postgresql_adapter'
  4.  
  5. module ActiveRecord
  6. module ConnectionAdapters
  7. class PostgreSQLAdapter
  8. # Resets the sequence of a table's primary key to the maximum value.
  9. def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc:
  10. return if pk || sequence
  11. default_pk, default_sequence = pk_and_sequence_for(table)
  12.  
  13. pk ||= default_pk
  14. sequence ||= default_sequence
  15.  
  16. if @logger && pk && !sequence
  17. @logger.warn "#{table} has primary key #{pk} with no default seq"
  18. end
  19.  
  20. seq = quote_table_name(sequence)
  21. select_value <<~SQL
  22. SELECT setval(#{regclass(seq)},\
  23. #{bigint(table, seq, pk)}, #{max?(table, pk)})
  24. SQL
  25. end
  26.  
  27. private
  28.  
  29. def bigint(table, seq, pk)
  30. return max_value_for(table, pk) if max?(table, pk)
  31. min_value(seq)
  32. end
  33.  
  34. def max?(table, pk)
  35. max_value_for(table, pk).present?
  36. end
  37.  
  38. def max_value_for(table, pk)
  39. select_value("SELECT MAX(#{quote_column_name pk}) \
  40. FROM #{quote_table_name(table)}")
  41. end
  42.  
  43. def regclass(seq)
  44. quote(seq)
  45. end
  46.  
  47. def min_value(seq)
  48. if postgresql_version >= 100_000
  49. select_value("SELECT seqmin FROM pg_sequence \
  50. WHERE seqrelid = #{quote(seq)}::regclass")
  51. else
  52. select_value("SELECT min_value FROM #{seq}")
  53. end
  54. end
  55. end
  56. end
  57. end
Add Comment
Please, Sign In to add comment