riverqueue-sequel 0.6.1 → 0.8.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/driver.rb +101 -0
  3. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8436cdaf040ad522e33e795f753af4fdb39096899c3be0ceef7c21c7007c3001
4
- data.tar.gz: 5fd60f6832b705e7a7ac762a6c987e87364a9ced39b59e086d0e082c07eeeccb
3
+ metadata.gz: dcba38bb9184685170e02a42f53ef69efa47ef25c364cfa6047d7ed7b457ee01
4
+ data.tar.gz: 95e6cc145f3faa7632a3ab8e25d0896537d54a34756ec0b246028cf736e47086
5
5
  SHA512:
6
- metadata.gz: e0ccf08462f9577e3a84011d267088cdc06874713f3cdc6e47b58d1350441d76c5e61a963d1101050c72e78db32e29af17f0cda2f40012bfe5d6c2c5833a2fd2
7
- data.tar.gz: e5251265a2b4587f732b7408b3ebfc7132621acbd3df7e0bb530fb4f3f6d4728a149d05dcf9c7d6aef47d2435543e88f2e3df26c5beb2a56b260b7491a14b845
6
+ metadata.gz: 416b64b2e91fadf29ed0b30814556dcaae74671ed74165586330518c9f4622fb40c13ed4c35cce7cb9b6d8089be9d8cb3f310b329e0682efa864e6380288d6e5
7
+ data.tar.gz: 45ae9a7abbf4d15e0c7f2cd5cbc9974446f5ee0da6d3718aa679e668a2f52b8164e7c1176ab1c21637896f5922afde189aed0b567fba147e2fecb8b887029e92
data/lib/driver.rb ADDED
@@ -0,0 +1,101 @@
1
+ module River::Driver
2
+ # Provides a Sequel driver for River.
3
+ #
4
+ # Used in conjunction with a River client like:
5
+ #
6
+ # DB = Sequel.connect("postgres://...")
7
+ # client = River::Client.new(River::Driver::Sequel.new(DB))
8
+ #
9
+ class Sequel
10
+ def initialize(db)
11
+ @db = db
12
+ @db.extension(:pg_array)
13
+ @db.extension(:pg_json)
14
+ end
15
+
16
+ def job_get_by_id(id)
17
+ data_set = @db[:river_job].where(id: id)
18
+ data_set.first ? to_job_row(data_set.first) : nil
19
+ end
20
+
21
+ def job_insert(insert_params)
22
+ job_insert_many([insert_params]).first
23
+ end
24
+
25
+ def job_insert_many(insert_params_array)
26
+ @db[:river_job]
27
+ .insert_conflict(
28
+ target: [:unique_key],
29
+ conflict_where: ::Sequel.lit(
30
+ "unique_key IS NOT NULL AND unique_states IS NOT NULL AND river_job_state_in_bitmask(unique_states, state)"
31
+ ),
32
+ update: {kind: ::Sequel[:excluded][:kind]}
33
+ )
34
+ .returning(::Sequel.lit("*, (xmax != 0) AS unique_skipped_as_duplicate"))
35
+ .multi_insert(insert_params_array.map { |p| insert_params_to_hash(p) })
36
+ .map { |row| to_insert_result(row) }
37
+ end
38
+
39
+ def job_list
40
+ data_set = @db[:river_job].order_by(:id)
41
+ data_set.all.map { |job| to_job_row(job) }
42
+ end
43
+
44
+ def rollback_exception
45
+ ::Sequel::Rollback
46
+ end
47
+
48
+ def transaction(&)
49
+ @db.transaction(savepoint: true, &)
50
+ end
51
+
52
+ private def insert_params_to_hash(insert_params)
53
+ {
54
+ args: insert_params.encoded_args,
55
+ kind: insert_params.kind,
56
+ max_attempts: insert_params.max_attempts,
57
+ priority: insert_params.priority,
58
+ queue: insert_params.queue,
59
+ state: insert_params.state,
60
+ scheduled_at: insert_params.scheduled_at,
61
+ tags: ::Sequel.pg_array(insert_params.tags || [], :text),
62
+ unique_key: insert_params.unique_key ? ::Sequel.blob(insert_params.unique_key) : nil,
63
+ unique_states: insert_params.unique_states
64
+ }
65
+ end
66
+
67
+ private def to_insert_result(result)
68
+ [to_job_row(result), result[:unique_skipped_as_duplicate]]
69
+ end
70
+
71
+ private def to_job_row(river_job)
72
+ River::JobRow.new(
73
+ id: river_job[:id],
74
+ args: river_job[:args].to_h,
75
+ attempt: river_job[:attempt],
76
+ attempted_at: river_job[:attempted_at]&.getutc,
77
+ attempted_by: river_job[:attempted_by],
78
+ created_at: river_job[:created_at].getutc,
79
+ errors: river_job[:errors]&.map { |deserialized_error|
80
+ River::AttemptError.new(
81
+ at: Time.parse(deserialized_error["at"]),
82
+ attempt: deserialized_error["attempt"],
83
+ error: deserialized_error["error"],
84
+ trace: deserialized_error["trace"]
85
+ )
86
+ },
87
+ finalized_at: river_job[:finalized_at]&.getutc,
88
+ kind: river_job[:kind],
89
+ max_attempts: river_job[:max_attempts],
90
+ metadata: river_job[:metadata],
91
+ priority: river_job[:priority],
92
+ queue: river_job[:queue],
93
+ scheduled_at: river_job[:scheduled_at].getutc,
94
+ state: river_job[:state],
95
+ tags: river_job[:tags].to_a,
96
+ unique_key: river_job[:unique_key]&.to_s,
97
+ unique_states: ::River::UniqueBitmask.to_states(river_job[:unique_states]&.to_i(2))
98
+ )
99
+ end
100
+ end
101
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riverqueue-sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blake Gentry
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-08-21 00:00:00.000000000 Z
12
+ date: 2024-12-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pg
@@ -58,6 +58,7 @@ executables: []
58
58
  extensions: []
59
59
  extra_rdoc_files: []
60
60
  files:
61
+ - lib/driver.rb
61
62
  - lib/riverqueue-sequel.rb
62
63
  homepage: https://riverqueue.com
63
64
  licenses:
@@ -78,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
79
  - !ruby/object:Gem::Version
79
80
  version: '0'
80
81
  requirements: []
81
- rubygems_version: 3.4.20
82
+ rubygems_version: 3.5.16
82
83
  signing_key:
83
84
  specification_version: 4
84
85
  summary: Sequel driver for the River Ruby gem.