Class: RSched::DBLock

Inherits:
Lock
  • Object
show all
Defined in:
lib/rsched/dblock.rb

Instance Attribute Summary

Attributes inherited from Lock

#hostname, #timeout

Instance Method Summary collapse

Constructor Details

#initialize(hostname, timeout, uri, user, pass) ⇒ DBLock

Returns a new instance of DBLock.



6
7
8
9
10
11
# File 'lib/rsched/dblock.rb', line 6

def initialize(hostname, timeout, uri, user, pass)
  super(hostname, timeout)
  require 'dbi'
  @db = DBI.connect(uri, user, pass)
  init_db(uri.split(':',3)[1])
end

Instance Method Details

#acquire(ident, time, now = Time.now.to_i) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/rsched/dblock.rb', line 38

def acquire(ident, time, now=Time.now.to_i)
  if try_insert(ident, time, now) || try_update(ident, time, now)
    return [ident, time]
  elsif check_finished(ident, time)
    return nil
  else
    return false
  end
end

#delete_before(ident, time) ⇒ Object



69
70
71
# File 'lib/rsched/dblock.rb', line 69

def delete_before(ident, time)
  @db.do('DELETE FROM rsched WHERE ident = ? AND time < ? AND finish IS NOT NULL;', ident, time)
end

#extend_timeout(token, timeout = Time.now.to_i+@timeout) ⇒ Object



62
63
64
65
66
67
# File 'lib/rsched/dblock.rb', line 62

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

#finish(token, now = Time.now.to_i) ⇒ Object



55
56
57
58
59
60
# File 'lib/rsched/dblock.rb', line 55

def finish(token, now=Time.now.to_i)
  ident, time = *token
  n = @db.do('UPDATE rsched SET finish=? WHERE ident = ? AND time = ? AND host = ?;',
         now, ident, time, @hostname)
  return n > 0
end

#init_db(type) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/rsched/dblock.rb', line 13

def init_db(type)
  sql = ''
  case type
  when /mysql/i
    sql << 'CREATE TABLE IF NOT EXISTS rsched ('
    sql << '  ident VARCHAR(256) CHARACTER SET ASCII NOT NULL,'
    sql << '  time INT NOT NULL,'
    sql << '  host VARCHAR(256) CHARACTER SET ASCII,'
    sql << '  timeout INT,'
    sql << '  finish INT,'
    sql << '  PRIMARY KEY (ident, time)'
    sql << ') ENGINE=INNODB;'
  else
    sql << 'CREATE TABLE IF NOT EXISTS rsched ('
    sql << '  ident VARCHAR(256) NOT NULL,'
    sql << '  time INT NOT NULL,'
    sql << '  host VARCHAR(256),'
    sql << '  timeout INT,'
    sql << '  finish INT,'
    sql << '  PRIMARY KEY (ident, time)'
    sql << ');'
  end
  @db.execute(sql)
end

#release(token) ⇒ Object



48
49
50
51
52
53
# File 'lib/rsched/dblock.rb', line 48

def release(token)
  ident, time = *token
  n = @db.do('UPDATE rsched SET timeout=? WHERE ident = ? AND time = ? AND host = ?;',
         0, ident, time, @hostname)
  return n > 0
end