lib/rsched/dblock.rb in rsched-0.2.0 vs lib/rsched/dblock.rb in rsched-0.3.0

- old
+ new

@@ -2,13 +2,12 @@ module RSched class DBLock < Lock def initialize(hostname, timeout, uri, user, pass) + super(hostname, timeout) require 'dbi' - @hostname = hostname - @timeout = timeout @db = DBI.connect(uri, user, pass) init_db end def init_db @@ -45,10 +44,17 @@ n = @db.do('UPDATE rsched SET finish=? WHERE ident = ? AND time = ? AND host = ?;', now, ident, time, @hostname) return n > 0 end + def extend_timeout(token, timeout=Time.now.to_i+@timeout) + ident, time = *token + n = @db.do('UPDATE rsched SET timeout=? WHERE ident = ? AND time = ? AND host = ?;', + timeout, ident, time, @hostname) + return n > 0 + end + def delete_before(ident, time) @db.do('DELETE FROM rsched WHERE ident = ? AND time < ? AND finish IS NOT NULL;', ident, time) end private @@ -59,11 +65,11 @@ rescue # TODO unique error return false end def try_update(ident, time, now) - n = @db.do('UPDATE rsched SET host=?, timeout=? WHERE ident = ? AND time = ? AND finish IS NULL AND (timeout < ? OR host = ?);', - @hostname, now+@timeout, ident, time, now, @hostname) + n = @db.do('UPDATE rsched SET host=?, timeout=? WHERE ident = ? AND time = ? AND finish IS NULL AND timeout < ?;', + @hostname, now+@timeout, ident, time, now) return n > 0 end def check_finished(ident, time) x = @db.select_one('SELECT finish FROM rsched WHERE ident = ? AND time = ? AND finish IS NOT NULL;',