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