litequeue 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/Gemfile.lock +17 -1
- data/lib/litequeue/migrations.sql.yml +11 -0
- data/lib/litequeue/statements.sql.yml +48 -0
- data/lib/litequeue/version.rb +2 -2
- data/lib/litequeue.rb +98 -3
- metadata +33 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f97ba4711413d74fd5fc46de7253269e5b339699ee7976a75a99aa848005bd05
|
4
|
+
data.tar.gz: f01ca5ac9975a21e6c51e2d48367d622024ae3e8b894216e6ea75403c6f700fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b770e17b77f912b995afd83a78adde03352be6fbfd6cce62bdb798d53babf61039076f0116de757f10ab97113d1f484a9341025b21a88115af6f3b4c8acd43fb
|
7
|
+
data.tar.gz: 3ee4953f64da9a77d00132a62c85ec598c018be999f6b958a02d9fee4f2fc38e9f3fd85ab53fb4aeaae16f2a9331eba90c186ac60106aeaf30dd081b918b991e
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
litequeue (0.
|
4
|
+
litequeue (0.2.0)
|
5
|
+
litedb (>= 0.2.1)
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: https://rubygems.org/
|
8
9
|
specs:
|
9
10
|
ast (2.4.2)
|
11
|
+
docile (1.4.0)
|
10
12
|
json (2.6.3)
|
11
13
|
language_server-protocol (3.17.0.3)
|
12
14
|
lint_roller (1.1.0)
|
15
|
+
litedb (0.2.1)
|
16
|
+
litescheduler (>= 0.2.0)
|
17
|
+
sqlite3 (>= 1.5.0)
|
18
|
+
litescheduler (0.2.1)
|
13
19
|
minitest (5.19.0)
|
14
20
|
parallel (1.23.0)
|
15
21
|
parser (3.2.2.3)
|
@@ -36,6 +42,14 @@ GEM
|
|
36
42
|
rubocop (>= 1.7.0, < 2.0)
|
37
43
|
rubocop-ast (>= 0.4.0)
|
38
44
|
ruby-progressbar (1.13.0)
|
45
|
+
simplecov (0.22.0)
|
46
|
+
docile (~> 1.1)
|
47
|
+
simplecov-html (~> 0.11)
|
48
|
+
simplecov_json_formatter (~> 0.1)
|
49
|
+
simplecov-html (0.12.3)
|
50
|
+
simplecov_json_formatter (0.1.4)
|
51
|
+
sqlite3 (1.6.3-arm64-darwin)
|
52
|
+
sqlite3 (1.6.3-x86_64-linux)
|
39
53
|
standard (1.30.1)
|
40
54
|
language_server-protocol (~> 3.17.0.2)
|
41
55
|
lint_roller (~> 1.0)
|
@@ -52,11 +66,13 @@ GEM
|
|
52
66
|
|
53
67
|
PLATFORMS
|
54
68
|
arm64-darwin-21
|
69
|
+
x86_64-linux
|
55
70
|
|
56
71
|
DEPENDENCIES
|
57
72
|
litequeue!
|
58
73
|
minitest (~> 5.0)
|
59
74
|
rake (~> 13.0)
|
75
|
+
simplecov
|
60
76
|
standard (~> 1.3)
|
61
77
|
|
62
78
|
BUNDLED WITH
|
@@ -0,0 +1,11 @@
|
|
1
|
+
create_table_queue: >
|
2
|
+
CREATE TABLE IF NOT EXISTS queue(
|
3
|
+
id TEXT PRIMARY KEY NOT NULL ON CONFLICT REPLACE,
|
4
|
+
name TEXT NOT NULL ON CONFLICT REPLACE,
|
5
|
+
fire_at INTEGER NOT NULL ON CONFLICT REPLACE,
|
6
|
+
value TEXT,
|
7
|
+
created_at INTEGER DEFAULT(UNIXEPOCH()) NOT NULL ON CONFLICT REPLACE
|
8
|
+
) WITHOUT ROWID;
|
9
|
+
|
10
|
+
create_index_queue_by_name: >
|
11
|
+
CREATE INDEX IF NOT EXISTS idx_queue_by_name ON queue(name, fire_at ASC);
|
@@ -0,0 +1,48 @@
|
|
1
|
+
push: >
|
2
|
+
INSERT INTO queue(id, name, fire_at, value)
|
3
|
+
VALUES (HEX(RANDOMBLOB(32)), $1, (UNIXEPOCH('subsec') + $2), $3)
|
4
|
+
RETURNING id, name;
|
5
|
+
|
6
|
+
pop: >
|
7
|
+
DELETE FROM queue
|
8
|
+
WHERE name != '_dead'
|
9
|
+
AND (name, fire_at, id)
|
10
|
+
IN (
|
11
|
+
SELECT name, fire_at, id FROM queue
|
12
|
+
WHERE name = IFNULL($1, 'default')
|
13
|
+
AND fire_at <= (UNIXEPOCH('subsec'))
|
14
|
+
ORDER BY fire_at ASC
|
15
|
+
LIMIT IFNULL($2, 1)
|
16
|
+
)
|
17
|
+
RETURNING id, value;
|
18
|
+
|
19
|
+
repush: >
|
20
|
+
INSERT INTO queue(id, name, fire_at, value)
|
21
|
+
VALUES ($1, $2, (UNIXEPOCH('subsec') + $3), $4)
|
22
|
+
RETURNING name;
|
23
|
+
|
24
|
+
delete: >
|
25
|
+
DELETE FROM queue
|
26
|
+
WHERE id = $1
|
27
|
+
RETURNING value;
|
28
|
+
|
29
|
+
count: >
|
30
|
+
SELECT COUNT(*)
|
31
|
+
FROM queue
|
32
|
+
WHERE IIF($1 IS NULL, 1, name = $1);
|
33
|
+
|
34
|
+
clear: >
|
35
|
+
DELETE FROM queue
|
36
|
+
WHERE IIF($1 IS NULL, 1, name = $1)
|
37
|
+
RETURNING id;
|
38
|
+
|
39
|
+
info: >
|
40
|
+
SELECT
|
41
|
+
name,
|
42
|
+
COUNT(*) AS count,
|
43
|
+
AVG(UNIXEPOCH('subsec') - created_at) AS avg,
|
44
|
+
MIN(UNIXEPOCH('subsec') - created_at) AS min,
|
45
|
+
MAX(UNIXEPOCH('subsec') - created_at) AS max
|
46
|
+
FROM queue
|
47
|
+
GROUP BY name
|
48
|
+
ORDER BY count DESC;
|
data/lib/litequeue/version.rb
CHANGED
data/lib/litequeue.rb
CHANGED
@@ -2,7 +2,102 @@
|
|
2
2
|
|
3
3
|
require_relative "litequeue/version"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
require "singleton"
|
6
|
+
require "yaml"
|
7
|
+
require "litedb"
|
8
|
+
|
9
|
+
class Litequeue
|
10
|
+
include Singleton
|
11
|
+
|
12
|
+
DEFAULT_QUEUE = "default"
|
13
|
+
|
14
|
+
Configuration = Struct.new(:path, :synchronous, :mmap_size, :journal_size_limit)
|
15
|
+
|
16
|
+
def self.configuration
|
17
|
+
@configuration ||= Configuration.new(
|
18
|
+
_path = "queue.sqlite3",
|
19
|
+
_synchronous = :OFF,
|
20
|
+
_mmap_size = 32 * 1024
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.configure
|
25
|
+
yield(configuration)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.migrations
|
29
|
+
YAML.load_file("#{__dir__}/litequeue/migrations.sql.yml")
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.statements
|
33
|
+
YAML.load_file("#{__dir__}/litequeue/statements.sql.yml")
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
configuration = self.class.configuration
|
38
|
+
file = configuration.path
|
39
|
+
options = configuration.to_h
|
40
|
+
.slice(:synchronous, :mmap_size, :journal_size_limit)
|
41
|
+
.merge(migrations: self.class.migrations,
|
42
|
+
statements: self.class.statements)
|
43
|
+
|
44
|
+
@db = Litedb::Connection.new(file, options)
|
45
|
+
# Once the instance has been initialized, don't allow the configuration to be changed
|
46
|
+
# as it won't have any effect.
|
47
|
+
configuration.freeze
|
48
|
+
end
|
49
|
+
|
50
|
+
def push(value, queue: DEFAULT_QUEUE, delay: 0)
|
51
|
+
results = @db.run_statement(:push, queue, delay, value) # [["{id}", "{name}"]]
|
52
|
+
extract_row(results)
|
53
|
+
end
|
54
|
+
|
55
|
+
def pop(queue: DEFAULT_QUEUE, limit: 1)
|
56
|
+
results = @db.run_statement(:pop, queue, limit)
|
57
|
+
|
58
|
+
return extract_row(results) if limit == 1
|
59
|
+
|
60
|
+
results
|
61
|
+
end
|
62
|
+
|
63
|
+
def repush(id, value, queue: DEFAULT_QUEUE, delay: 0)
|
64
|
+
results = @db.run_statement(:repush, id, queue, delay, value)
|
65
|
+
extract_value(results)
|
66
|
+
end
|
67
|
+
|
68
|
+
def delete(id)
|
69
|
+
results = @db.run_statement(:delete, id)
|
70
|
+
extract_value(results)
|
71
|
+
end
|
72
|
+
|
73
|
+
def count(queue: nil)
|
74
|
+
results = @db.run_statement(:count, queue)
|
75
|
+
extract_value(results)
|
76
|
+
end
|
77
|
+
|
78
|
+
def clear(queue: nil)
|
79
|
+
results = @db.run_statement(:clear, queue)
|
80
|
+
results.count
|
81
|
+
end
|
82
|
+
|
83
|
+
def empty?
|
84
|
+
count.zero?
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def extract_value(results) # [["{value}"]] || []
|
90
|
+
return if results.empty?
|
91
|
+
|
92
|
+
results
|
93
|
+
.first # [[value]] -> [value]
|
94
|
+
.first # [value] -> value
|
95
|
+
end
|
96
|
+
|
97
|
+
def extract_row(results) # [[{value}, {value}]] || []
|
98
|
+
return if results.empty?
|
99
|
+
|
100
|
+
results
|
101
|
+
.first # [[value, value]] -> [value, value]
|
102
|
+
end
|
8
103
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: litequeue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mohamed Hassan
|
@@ -9,8 +9,36 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-08-
|
13
|
-
dependencies:
|
12
|
+
date: 2023-08-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: litedb
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.2.1
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.2.1
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: simplecov
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
14
42
|
description:
|
15
43
|
email:
|
16
44
|
- oldmoe@gmail.com
|
@@ -28,6 +56,8 @@ files:
|
|
28
56
|
- README.md
|
29
57
|
- Rakefile
|
30
58
|
- lib/litequeue.rb
|
59
|
+
- lib/litequeue/migrations.sql.yml
|
60
|
+
- lib/litequeue/statements.sql.yml
|
31
61
|
- lib/litequeue/version.rb
|
32
62
|
- sig/litequeue.rbs
|
33
63
|
homepage: https://github.com/litestack-ruby/litequeue
|