riverqueue-activerecord 0.7.0 → 0.9.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/lib/driver.rb +54 -65
- metadata +3 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 201e8285c923206ddd18606392bc32a5f7ab1f1c341bf22b93b5b2baeb95d6dd
|
4
|
+
data.tar.gz: 22ff5b4886ae60a31a279dacb1415272d8475643b656c2eccdeeb808c8ef59b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9aae1b8432920dbbddcfa88b0c3bf35b52d07fb190eb107367694e561c3a17ff751082b206e54a72520ca2ca31d39a4857b50dd4be2bf49f628f67a04d5cb882
|
7
|
+
data.tar.gz: d13f60509d5da2b3865424c012da0b4c4a2d05279e49802894144b5283c32d58444ab1afbf0e86e7c1d54eab0fed56d0d43a3b1c49a4a3f59d60bf3f54dcaa9c
|
data/lib/driver.rb
CHANGED
@@ -31,36 +31,18 @@ module River::Driver
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
def advisory_lock(key)
|
35
|
-
::ActiveRecord::Base.connection.execute("SELECT pg_advisory_xact_lock(#{key})")
|
36
|
-
nil
|
37
|
-
end
|
38
|
-
|
39
|
-
def advisory_lock_try(key)
|
40
|
-
::ActiveRecord::Base.connection.execute("SELECT pg_try_advisory_xact_lock(123)").first["pg_try_advisory_xact_lock"]
|
41
|
-
end
|
42
|
-
|
43
34
|
def job_get_by_id(id)
|
44
35
|
data_set = RiverJob.where(id: id)
|
45
36
|
data_set.first ? to_job_row_from_model(data_set.first) : nil
|
46
37
|
end
|
47
38
|
|
48
|
-
def job_get_by_kind_and_unique_properties(get_params)
|
49
|
-
data_set = RiverJob.where(kind: get_params.kind)
|
50
|
-
data_set = data_set.where("tstzrange(?, ?, '[)') @> created_at", get_params.created_at[0], get_params.created_at[1]) if get_params.created_at
|
51
|
-
data_set = data_set.where(args: get_params.encoded_args) if get_params.encoded_args
|
52
|
-
data_set = data_set.where(queue: get_params.queue) if get_params.queue
|
53
|
-
data_set = data_set.where(state: get_params.state) if get_params.state
|
54
|
-
data_set.first ? to_job_row_from_model(data_set.first) : nil
|
55
|
-
end
|
56
|
-
|
57
39
|
def job_insert(insert_params)
|
58
|
-
|
40
|
+
job_insert_many([insert_params]).first
|
59
41
|
end
|
60
42
|
|
61
|
-
def
|
62
|
-
res = RiverJob.
|
63
|
-
insert_params_to_hash(
|
43
|
+
def job_insert_many(insert_params_many)
|
44
|
+
res = RiverJob.upsert_all(
|
45
|
+
insert_params_many.map { |param| insert_params_to_hash(param) },
|
64
46
|
on_duplicate: Arel.sql("kind = EXCLUDED.kind"),
|
65
47
|
returning: Arel.sql("*, (xmax != 0) AS unique_skipped_as_duplicate"),
|
66
48
|
|
@@ -69,15 +51,9 @@ module River::Driver
|
|
69
51
|
# ActiveRecord tries to look up a unique index instead of letting
|
70
52
|
# Postgres handle that, and of course it doesn't support a `WHERE`
|
71
53
|
# clause. The workaround is to target the index name instead of columns.
|
72
|
-
unique_by: "
|
54
|
+
unique_by: "river_job_unique_idx"
|
73
55
|
)
|
74
|
-
|
75
|
-
[to_job_row_from_raw(res), res.send(:hash_rows)[0]["unique_skipped_as_duplicate"]]
|
76
|
-
end
|
77
|
-
|
78
|
-
def job_insert_many(insert_params_many)
|
79
|
-
RiverJob.insert_all(insert_params_many.map { |p| insert_params_to_hash(p) })
|
80
|
-
insert_params_many.count
|
56
|
+
to_insert_results(res)
|
81
57
|
end
|
82
58
|
|
83
59
|
def job_list
|
@@ -94,8 +70,6 @@ module River::Driver
|
|
94
70
|
end
|
95
71
|
|
96
72
|
private def insert_params_to_hash(insert_params)
|
97
|
-
# the call to `#compact` is important so that we remove nils and table
|
98
|
-
# default values get picked up instead
|
99
73
|
{
|
100
74
|
args: insert_params.encoded_args,
|
101
75
|
kind: insert_params.kind,
|
@@ -104,8 +78,10 @@ module River::Driver
|
|
104
78
|
queue: insert_params.queue,
|
105
79
|
state: insert_params.state,
|
106
80
|
scheduled_at: insert_params.scheduled_at,
|
107
|
-
tags: insert_params.tags
|
108
|
-
|
81
|
+
tags: insert_params.tags || [],
|
82
|
+
unique_key: insert_params.unique_key,
|
83
|
+
unique_states: insert_params.unique_states
|
84
|
+
}
|
109
85
|
end
|
110
86
|
|
111
87
|
private def to_job_row_from_model(river_job)
|
@@ -139,51 +115,64 @@ module River::Driver
|
|
139
115
|
scheduled_at: river_job.scheduled_at.getutc,
|
140
116
|
state: river_job.state,
|
141
117
|
tags: river_job.tags,
|
142
|
-
unique_key: river_job.unique_key
|
118
|
+
unique_key: river_job.unique_key,
|
119
|
+
unique_states: river_job.unique_states
|
143
120
|
)
|
144
121
|
end
|
145
122
|
|
123
|
+
private def to_insert_results(res)
|
124
|
+
res.rows.map do |row|
|
125
|
+
to_job_row_from_raw(row, res.columns, res.column_types)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
146
129
|
# This is really awful, but some of ActiveRecord's methods (e.g. `.create`)
|
147
130
|
# return a model, and others (e.g. `.upsert`) return raw values, and
|
148
131
|
# therefore this second version from unmarshaling a job row exists. I
|
149
132
|
# searched long and hard for a way to have the former type of method return
|
150
133
|
# raw or the latter type of method return a model, but was unable to find
|
151
134
|
# anything.
|
152
|
-
private def to_job_row_from_raw(
|
135
|
+
private def to_job_row_from_raw(row, columns, column_types)
|
153
136
|
river_job = {}
|
154
137
|
|
155
|
-
|
156
|
-
river_job[
|
138
|
+
row.each_with_index do |val, i|
|
139
|
+
river_job[columns[i]] = column_types[i].deserialize(val)
|
157
140
|
end
|
158
141
|
|
159
|
-
|
160
|
-
|
161
|
-
args: JSON.parse(river_job["args"]),
|
162
|
-
attempt: river_job["attempt"],
|
163
|
-
attempted_at: river_job["attempted_at"]&.getutc,
|
164
|
-
attempted_by: river_job["attempted_by"],
|
165
|
-
created_at: river_job["created_at"].getutc,
|
166
|
-
errors: river_job["errors"]&.map { |e|
|
167
|
-
deserialized_error = JSON.parse(e)
|
142
|
+
errors = river_job["errors"]&.map do |e|
|
143
|
+
deserialized_error = JSON.parse(e)
|
168
144
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
145
|
+
River::AttemptError.new(
|
146
|
+
at: Time.parse(deserialized_error["at"]),
|
147
|
+
attempt: deserialized_error["attempt"],
|
148
|
+
error: deserialized_error["error"],
|
149
|
+
trace: deserialized_error["trace"]
|
150
|
+
)
|
151
|
+
end
|
152
|
+
|
153
|
+
[
|
154
|
+
River::JobRow.new(
|
155
|
+
id: river_job["id"],
|
156
|
+
args: JSON.parse(river_job["args"]),
|
157
|
+
attempt: river_job["attempt"],
|
158
|
+
attempted_at: river_job["attempted_at"]&.getutc,
|
159
|
+
attempted_by: river_job["attempted_by"],
|
160
|
+
created_at: river_job["created_at"].getutc,
|
161
|
+
errors: errors,
|
162
|
+
finalized_at: river_job["finalized_at"]&.getutc,
|
163
|
+
kind: river_job["kind"],
|
164
|
+
max_attempts: river_job["max_attempts"],
|
165
|
+
metadata: river_job["metadata"],
|
166
|
+
priority: river_job["priority"],
|
167
|
+
queue: river_job["queue"],
|
168
|
+
scheduled_at: river_job["scheduled_at"].getutc,
|
169
|
+
state: river_job["state"],
|
170
|
+
tags: river_job["tags"],
|
171
|
+
unique_key: river_job["unique_key"],
|
172
|
+
unique_states: ::River::UniqueBitmask.to_states(river_job["unique_states"]&.to_i(2))
|
173
|
+
),
|
174
|
+
river_job["unique_skipped_as_duplicate"]
|
175
|
+
]
|
187
176
|
end
|
188
177
|
end
|
189
178
|
end
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riverqueue-activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Gentry
|
8
8
|
- Brandur Leach
|
9
|
-
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2025-04-12 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activerecord
|
@@ -84,7 +83,6 @@ homepage: https://riverqueue.com
|
|
84
83
|
licenses:
|
85
84
|
- LGPL-3.0-or-later
|
86
85
|
metadata: {}
|
87
|
-
post_install_message:
|
88
86
|
rdoc_options: []
|
89
87
|
require_paths:
|
90
88
|
- lib
|
@@ -99,8 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
97
|
- !ruby/object:Gem::Version
|
100
98
|
version: '0'
|
101
99
|
requirements: []
|
102
|
-
rubygems_version: 3.
|
103
|
-
signing_key:
|
100
|
+
rubygems_version: 3.6.2
|
104
101
|
specification_version: 4
|
105
102
|
summary: ActiveRecord driver for the River Ruby gem.
|
106
103
|
test_files: []
|