Class: QueueLite::Queue

Inherits:
Object
  • Object
show all
Defined in:
lib/queue_lite/queue.rb

Constant Summary collapse

READY_STATUS =
"ready"
LOCKED_STATUS =
"locked"
FAILED_STATUS =
"failed"
Task =
Data.define(:id, :data) do
  def initialize(data: nil, **)
    super
  end
end

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(db) ⇒ Queue



25
26
27
# File 'lib/queue_lite/queue.rb', line 25

def initialize(db)
  @db = db
end

Class Method Details

.build(connection_string) ⇒ Object



17
18
19
20
21
22
23
# File 'lib/queue_lite/queue.rb', line 17

def self.build(connection_string)
  db = SQLite3::Database.new(connection_string)

  new(db).tap do |instance|
    instance.prepare
  end
end

Instance Method Details

#done(id) ⇒ Object



68
69
70
71
72
73
74
75
76
77
# File 'lib/queue_lite/queue.rb', line 68

def done(id)
  row = db.get_first_row("    UPDATE queue\n    SET status = ?\n    WHERE id = ?\n    RETURNING id, data\n  SQL\n\n  Task.new(*row)\nend\n", [LOCKED_STATUS, id])

#failed(id) ⇒ Object



79
80
81
82
83
84
85
86
87
88
# File 'lib/queue_lite/queue.rb', line 79

def failed(id)
  row = db.get_first_row("    UPDATE queue\n    SET status = ?\n    WHERE id = ?\n    RETURNING id, data\n  SQL\n\n  Task.new(*row)\nend\n", [FAILED_STATUS, id])

#get(id) ⇒ Object



90
91
92
93
94
95
96
97
98
99
# File 'lib/queue_lite/queue.rb', line 90

def get(id)
  row = db.get_first_row("    SELECT id, data\n    FROM queue\n    WHERE id = ?\n    LIMIT 1\n  SQL\n\n  Task.new(*row)\nend\n", [id])

#popObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/queue_lite/queue.rb', line 51

def pop
  row = db.get_first_row("    UPDATE queue\n    SET status = ?\n    WHERE rowid = (SELECT rowid\n                   FROM queue\n                   WHERE status = ?\n                   ORDER BY id\n                   LIMIT 1)\n    RETURNING id, data\n  SQL\n\n  return if row.nil?\n\n  Task.new(*row)\nend\n", [LOCKED_STATUS, READY_STATUS])

#prepareObject



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/queue_lite/queue.rb', line 29

def prepare
  db.execute("PRAGMA journal_mode = 'WAL';")

  db.execute("    CREATE TABLE IF NOT EXISTS queue\n    (\n      id INTEGER PRIMARY KEY AUTOINCREMENT,\n      data TEXT,\n      status TEXT\n    )\n  SQL\nend\n")

#put(data) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/queue_lite/queue.rb', line 42

def put(data)
  row = db.get_first_row("    INSERT INTO queue(data, status) VALUES(?, ?)\n    RETURNING id, data\n  SQL\n\n  Task.new(*row)\nend\n", [data, READY_STATUS])