class PactBroker::Versions::Sequence

Public Instance Methods

next_val() click to toggle source

The easiest way to implement a cross database compatible sequence. Sad, I know.

# File lib/pact_broker/versions/sequence.rb, line 8
def next_val
  if PactBroker::Dataset::Helpers.postgres?
    db.execute("SELECT nextval('version_order_sequence') as val") { |v| v.first["val"].to_i }
  else
    db.transaction do
      for_update.first
      select_all.update(value: Sequel[:value]+1)
      row = first
      if row
        row.value
      else
        # The first row should have been created in the migration, so this code
        # should only ever be executed in a test context, after we've truncated all the
        # tables after a test.
        # There would be a risk of a race condition creating two rows if this
        # code executed in prod, as I don't think you can lock an empty table
        # to prevent another record being inserted.
        max_version_order = PactBroker::Domain::Version.max(:order)
        value = max_version_order ? max_version_order + 100 : 1
        insert(value: value)
        value
      end
    end
  end
end