lib/good_job/lockable.rb in good_job-0.2.0 vs lib/good_job/lockable.rb in good_job-0.2.1
- old
+ new
@@ -15,11 +15,11 @@
end)
scope :advisory_unlocked, -> { joins_advisory_locks.where(pg_locks: { locktype: nil }) }
scope :with_advisory_lock, (lambda do
where(<<~SQL)
- pg_try_advisory_lock(('x'||substr(md5(id::text), 1, 16))::bit(64)::bigint)
+ pg_try_advisory_lock(('x'||substr(md5(id::text), 1, 16))::bit(64)::bigint)
SQL
end)
def self.first_advisory_locked_row(query)
find_by_sql(<<~SQL)
@@ -40,30 +40,28 @@
def self.advisory_lock_details
connection.select("SELECT * FROM pg_locks WHERE locktype = 'advisory' AND objsubid = 1")
end
def advisory_lock
- self.class.connection.execute(self.class.sanitize_sql_for_conditions(["SELECT 1 as one WHERE pg_try_advisory_lock(('x'||substr(md5(?), 1, 16))::bit(64)::bigint)", id])).ntuples > 0
+ self.class.connection.execute(sanitize_sql_for_conditions(["SELECT 1 as one WHERE pg_try_advisory_lock(('x'||substr(md5(?), 1, 16))::bit(64)::bigint)", id])).ntuples.positive?
end
def advisory_lock!
result = advisory_lock
result || raise(RecordAlreadyAdvisoryLockedError)
end
def with_advisory_lock
- begin
- advisory_lock!
- yield
- rescue StandardError => e
- advisory_unlock unless e.is_a? RecordAlreadyAdvisoryLockedError
- raise
- end
+ advisory_lock!
+ yield
+ rescue StandardError => e
+ advisory_unlock unless e.is_a? RecordAlreadyAdvisoryLockedError
+ raise
end
def advisory_locked?
- self.class.connection.execute(<<~SQL).ntuples > 0
+ self.class.connection.execute(<<~SQL).ntuples.positive?
SELECT 1 as one
FROM pg_locks
WHERE
locktype = 'advisory'
AND objsubid = 1
@@ -71,11 +69,11 @@
AND objid = (('x'||substr(md5('#{id}'), 1, 16))::bit(64) << 32)::bit(32)::int
SQL
end
def owns_advisory_lock?
- self.class.connection.execute(<<~SQL).ntuples > 0
+ self.class.connection.execute(<<~SQL).ntuples.positive?
SELECT 1 as one
FROM pg_locks
WHERE
locktype = 'advisory'
AND objsubid = 1
@@ -89,9 +87,16 @@
self.class.connection.execute("SELECT pg_advisory_unlock(('x'||substr(md5('#{id}'), 1, 16))::bit(64)::bigint)").first["pg_advisory_unlock"]
end
def advisory_unlock!
advisory_unlock while advisory_locked?
+ end
+
+ private
+
+ def sanitize_sql_for_conditions(*args)
+ # Made public in Rails 5.2
+ self.class.send(:sanitize_sql_for_conditions, *args)
end
end
end
end