em-pg-client-helper 1.1.0 → 1.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 +7 -0
- data/em-pg-client-helper.gemspec +5 -1
- data/lib/em-pg-client-helper.rb +16 -6
- data/lib/em-pg-client-helper/transaction.rb +3 -0
- data/spec/db_transaction_upsert_spec.rb +3 -3
- data/spec/db_upsert_spec.rb +3 -3
- data/spec/upsert_sql_spec.rb +7 -7
- metadata +38 -72
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2a783cd49553e23ba7a8c35e1b1d23414fa9610c
|
4
|
+
data.tar.gz: 36f31e34a174a42f42a584d4d9e3a3db3b19ecd9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bd1b02760aabac6d0a688e6b548a4b845be2e7c779cb3282c3158bc82abe04bf9a29764d74a5d1b84e8cc81bee679a92191e6a80eb93e4a1bf80edf063bd5b78
|
7
|
+
data.tar.gz: e747e1fea3787a2836268da4708cdcfa7233f9a3ffbed67147a74096b7c9a0fd3c83b3ea4c8dd444125b9232effd92ccccda93082769f3cf13da46a19936c10a
|
data/em-pg-client-helper.gemspec
CHANGED
@@ -25,7 +25,11 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency 'guard-rspec'
|
26
26
|
# Needed for guard
|
27
27
|
s.add_development_dependency 'rb-inotify', '~> 0.9'
|
28
|
-
|
28
|
+
if RUBY_VERSION =~ /^1\./
|
29
|
+
s.add_development_dependency 'pry-debugger'
|
30
|
+
else
|
31
|
+
s.add_development_dependency 'pry-byebug'
|
32
|
+
end
|
29
33
|
s.add_development_dependency 'rake', '~> 10.4', '>= 1.0.4.2'
|
30
34
|
s.add_development_dependency 'redcarpet'
|
31
35
|
s.add_development_dependency 'rspec'
|
data/lib/em-pg-client-helper.rb
CHANGED
@@ -74,6 +74,9 @@ module PG::EM::Client::Helper
|
|
74
74
|
# a small chance that the query will fail with a `PG::UniqueViolation`, so
|
75
75
|
# your code must handle that.
|
76
76
|
#
|
77
|
+
# As an added bonus, the SQL that this method generates will, when executed,
|
78
|
+
# return the complete row that has been inserted or updated.
|
79
|
+
#
|
77
80
|
# @!macro upsert_params
|
78
81
|
#
|
79
82
|
# @return [Array<String, Array<Object>>] A two-element array, the first
|
@@ -102,9 +105,14 @@ module PG::EM::Client::Helper
|
|
102
105
|
select_values = unique_keys.map { |k| "#{k}=#{fp_map[k]}" }.join(' AND ')
|
103
106
|
update_query = "UPDATE #{tbl} SET #{update_values} WHERE #{select_values} RETURNING *"
|
104
107
|
|
105
|
-
insert_query = "INSERT INTO #{tbl} (#{fp_map.keys.join(',')})
|
108
|
+
insert_query = "INSERT INTO #{tbl} (#{fp_map.keys.join(',')}) " +
|
109
|
+
"SELECT #{fp_map.values.join(',')}"
|
106
110
|
|
107
|
-
["WITH
|
111
|
+
["WITH update_query AS (#{update_query}), " +
|
112
|
+
"insert_query AS (#{insert_query} " +
|
113
|
+
"WHERE NOT EXISTS (SELECT * FROM update_query) " +
|
114
|
+
"RETURNING *) " +
|
115
|
+
"SELECT * FROM update_query UNION SELECT * FROM insert_query",
|
108
116
|
data.values
|
109
117
|
]
|
110
118
|
end
|
@@ -127,16 +135,18 @@ module PG::EM::Client::Helper
|
|
127
135
|
# completes with `#callback`, and you can attach an error handler with
|
128
136
|
# `#errback` if you like.
|
129
137
|
#
|
138
|
+
# @yield [PG::Result] the row of data that has been inserted/updated.
|
139
|
+
#
|
130
140
|
def db_upsert(db, tbl, key, data)
|
131
141
|
q = upsert_sql(tbl, key, data)
|
132
142
|
|
133
143
|
::EM::DefaultDeferrable.new.tap do |df|
|
134
|
-
db.exec_defer(*q).callback do
|
135
|
-
df.succeed
|
144
|
+
db.exec_defer(*q).callback do |r|
|
145
|
+
df.succeed(r)
|
136
146
|
end.errback do |ex|
|
137
147
|
if ex.is_a?(PG::UniqueViolation)
|
138
|
-
db.exec_defer(*q).callback do
|
139
|
-
df.succeed
|
148
|
+
db.exec_defer(*q).callback do |r|
|
149
|
+
df.succeed(r)
|
140
150
|
end.errback do |ex|
|
141
151
|
df.fail(ex)
|
142
152
|
end
|
@@ -122,6 +122,9 @@ class PG::EM::Client::Helper::Transaction
|
|
122
122
|
# @see {PG::EM::Client::Helper#upsert_sql} for all the parameters.
|
123
123
|
#
|
124
124
|
# @return [EM::Deferrable]
|
125
|
+
#
|
126
|
+
# @yield [PG::Result] the row of data that has been inserted/updated.
|
127
|
+
#
|
125
128
|
def upsert(*args, &blk)
|
126
129
|
db_upsert(@conn, *args).tap do |df|
|
127
130
|
df.callback(&blk) if block_given?
|
@@ -4,9 +4,9 @@ describe "PG::EM::Client::Helper#db_transaction#upsert" do
|
|
4
4
|
let(:mock_conn) { double(PG::EM::Client) }
|
5
5
|
let(:mock_query) do
|
6
6
|
[
|
7
|
-
'WITH
|
8
|
-
'INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 ' +
|
9
|
-
'
|
7
|
+
'WITH update_query AS (UPDATE "foo" SET "bar"=$1 WHERE "wombat"=$2 RETURNING *), ' +
|
8
|
+
'insert_query AS (INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 WHERE NOT EXISTS (SELECT * FROM update_query) RETURNING *) ' +
|
9
|
+
'SELECT * FROM update_query UNION SELECT * FROM insert_query',
|
10
10
|
["baz", 42]
|
11
11
|
]
|
12
12
|
end
|
data/spec/db_upsert_spec.rb
CHANGED
@@ -3,9 +3,9 @@ require_relative './spec_helper'
|
|
3
3
|
describe "PG::EM::Client::Helper#db_upsert" do
|
4
4
|
let(:mock_query) do
|
5
5
|
[
|
6
|
-
'WITH
|
7
|
-
'INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 ' +
|
8
|
-
'
|
6
|
+
'WITH update_query AS (UPDATE "foo" SET "bar"=$1 WHERE "wombat"=$2 RETURNING *), ' +
|
7
|
+
'insert_query AS (INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 WHERE NOT EXISTS (SELECT * FROM update_query) RETURNING *) ' +
|
8
|
+
'SELECT * FROM update_query UNION SELECT * FROM insert_query',
|
9
9
|
["baz", 42]
|
10
10
|
]
|
11
11
|
end
|
data/spec/upsert_sql_spec.rb
CHANGED
@@ -4,9 +4,9 @@ describe "PG::EM::Client::Helper#upsert_sql" do
|
|
4
4
|
it "assembles a simple query correctly" do
|
5
5
|
expect(upsert_sql("foo", :wombat, :bar => "baz", :wombat => 42)).
|
6
6
|
to eq([
|
7
|
-
'WITH
|
8
|
-
'INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 ' +
|
9
|
-
'
|
7
|
+
'WITH update_query AS (UPDATE "foo" SET "bar"=$1 WHERE "wombat"=$2 RETURNING *), ' +
|
8
|
+
'insert_query AS (INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 WHERE NOT EXISTS (SELECT * FROM update_query) RETURNING *) ' +
|
9
|
+
'SELECT * FROM update_query UNION SELECT * FROM insert_query',
|
10
10
|
["baz", 42]
|
11
11
|
])
|
12
12
|
end
|
@@ -22,10 +22,10 @@ describe "PG::EM::Client::Helper#upsert_sql" do
|
|
22
22
|
:data => "ohai!"
|
23
23
|
)
|
24
24
|
).to eq([
|
25
|
-
'WITH
|
26
|
-
'
|
27
|
-
'
|
28
|
-
'SELECT
|
25
|
+
'WITH update_query AS (UPDATE "user_store_data" SET "data"=$4 WHERE "id"=$1 AND "platform"=$2 AND "profile_type"=$3 RETURNING *), ' +
|
26
|
+
'insert_query AS (INSERT INTO "user_store_data" ("id","platform","profile_type","data") ' +
|
27
|
+
'SELECT $1,$2,$3,$4 WHERE NOT EXISTS (SELECT * FROM update_query) RETURNING *) ' +
|
28
|
+
'SELECT * FROM update_query UNION SELECT * FROM insert_query',
|
29
29
|
[42, "wooden", "xyzzy", "ohai!"]
|
30
30
|
])
|
31
31
|
end
|
metadata
CHANGED
@@ -1,228 +1,201 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-pg-client-helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matt Palmer
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-27 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: git-version-bump
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0.10'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0.10'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: em-pg-client
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0.3'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0.3'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: bundler
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: eventmachine
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - ">="
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - ">="
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: github-release
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - ">="
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - ">="
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: guard-spork
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- -
|
87
|
+
- - ">="
|
100
88
|
- !ruby/object:Gem::Version
|
101
89
|
version: '0'
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- -
|
94
|
+
- - ">="
|
108
95
|
- !ruby/object:Gem::Version
|
109
96
|
version: '0'
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: guard-rspec
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
|
-
- -
|
101
|
+
- - ">="
|
116
102
|
- !ruby/object:Gem::Version
|
117
103
|
version: '0'
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
|
-
- -
|
108
|
+
- - ">="
|
124
109
|
- !ruby/object:Gem::Version
|
125
110
|
version: '0'
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: rb-inotify
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
|
-
- - ~>
|
115
|
+
- - "~>"
|
132
116
|
- !ruby/object:Gem::Version
|
133
117
|
version: '0.9'
|
134
118
|
type: :development
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
121
|
requirements:
|
139
|
-
- - ~>
|
122
|
+
- - "~>"
|
140
123
|
- !ruby/object:Gem::Version
|
141
124
|
version: '0.9'
|
142
125
|
- !ruby/object:Gem::Dependency
|
143
|
-
name: pry-
|
126
|
+
name: pry-byebug
|
144
127
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
128
|
requirements:
|
147
|
-
- -
|
129
|
+
- - ">="
|
148
130
|
- !ruby/object:Gem::Version
|
149
131
|
version: '0'
|
150
132
|
type: :development
|
151
133
|
prerelease: false
|
152
134
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
135
|
requirements:
|
155
|
-
- -
|
136
|
+
- - ">="
|
156
137
|
- !ruby/object:Gem::Version
|
157
138
|
version: '0'
|
158
139
|
- !ruby/object:Gem::Dependency
|
159
140
|
name: rake
|
160
141
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
142
|
requirements:
|
163
|
-
- - ~>
|
143
|
+
- - "~>"
|
164
144
|
- !ruby/object:Gem::Version
|
165
145
|
version: '10.4'
|
166
|
-
- -
|
146
|
+
- - ">="
|
167
147
|
- !ruby/object:Gem::Version
|
168
148
|
version: 1.0.4.2
|
169
149
|
type: :development
|
170
150
|
prerelease: false
|
171
151
|
version_requirements: !ruby/object:Gem::Requirement
|
172
|
-
none: false
|
173
152
|
requirements:
|
174
|
-
- - ~>
|
153
|
+
- - "~>"
|
175
154
|
- !ruby/object:Gem::Version
|
176
155
|
version: '10.4'
|
177
|
-
- -
|
156
|
+
- - ">="
|
178
157
|
- !ruby/object:Gem::Version
|
179
158
|
version: 1.0.4.2
|
180
159
|
- !ruby/object:Gem::Dependency
|
181
160
|
name: redcarpet
|
182
161
|
requirement: !ruby/object:Gem::Requirement
|
183
|
-
none: false
|
184
162
|
requirements:
|
185
|
-
- -
|
163
|
+
- - ">="
|
186
164
|
- !ruby/object:Gem::Version
|
187
165
|
version: '0'
|
188
166
|
type: :development
|
189
167
|
prerelease: false
|
190
168
|
version_requirements: !ruby/object:Gem::Requirement
|
191
|
-
none: false
|
192
169
|
requirements:
|
193
|
-
- -
|
170
|
+
- - ">="
|
194
171
|
- !ruby/object:Gem::Version
|
195
172
|
version: '0'
|
196
173
|
- !ruby/object:Gem::Dependency
|
197
174
|
name: rspec
|
198
175
|
requirement: !ruby/object:Gem::Requirement
|
199
|
-
none: false
|
200
176
|
requirements:
|
201
|
-
- -
|
177
|
+
- - ">="
|
202
178
|
- !ruby/object:Gem::Version
|
203
179
|
version: '0'
|
204
180
|
type: :development
|
205
181
|
prerelease: false
|
206
182
|
version_requirements: !ruby/object:Gem::Requirement
|
207
|
-
none: false
|
208
183
|
requirements:
|
209
|
-
- -
|
184
|
+
- - ">="
|
210
185
|
- !ruby/object:Gem::Version
|
211
186
|
version: '0'
|
212
187
|
- !ruby/object:Gem::Dependency
|
213
188
|
name: yard
|
214
189
|
requirement: !ruby/object:Gem::Requirement
|
215
|
-
none: false
|
216
190
|
requirements:
|
217
|
-
- -
|
191
|
+
- - ">="
|
218
192
|
- !ruby/object:Gem::Version
|
219
193
|
version: '0'
|
220
194
|
type: :development
|
221
195
|
prerelease: false
|
222
196
|
version_requirements: !ruby/object:Gem::Requirement
|
223
|
-
none: false
|
224
197
|
requirements:
|
225
|
-
- -
|
198
|
+
- - ">="
|
226
199
|
- !ruby/object:Gem::Version
|
227
200
|
version: '0'
|
228
201
|
description:
|
@@ -232,8 +205,8 @@ extensions: []
|
|
232
205
|
extra_rdoc_files:
|
233
206
|
- README.md
|
234
207
|
files:
|
235
|
-
- .gitignore
|
236
|
-
- .yardopts
|
208
|
+
- ".gitignore"
|
209
|
+
- ".yardopts"
|
237
210
|
- Gemfile
|
238
211
|
- Guardfile
|
239
212
|
- LICENCE
|
@@ -253,33 +226,26 @@ files:
|
|
253
226
|
- spec/upsert_sql_spec.rb
|
254
227
|
homepage: http://github.com/mpalmer/em-pg-client-helper
|
255
228
|
licenses: []
|
229
|
+
metadata: {}
|
256
230
|
post_install_message:
|
257
231
|
rdoc_options: []
|
258
232
|
require_paths:
|
259
233
|
- lib
|
260
234
|
required_ruby_version: !ruby/object:Gem::Requirement
|
261
|
-
none: false
|
262
235
|
requirements:
|
263
|
-
- -
|
236
|
+
- - ">="
|
264
237
|
- !ruby/object:Gem::Version
|
265
238
|
version: '0'
|
266
|
-
segments:
|
267
|
-
- 0
|
268
|
-
hash: 3057886313740167473
|
269
239
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
270
|
-
none: false
|
271
240
|
requirements:
|
272
|
-
- -
|
241
|
+
- - ">="
|
273
242
|
- !ruby/object:Gem::Version
|
274
243
|
version: '0'
|
275
|
-
segments:
|
276
|
-
- 0
|
277
|
-
hash: 3057886313740167473
|
278
244
|
requirements: []
|
279
245
|
rubyforge_project:
|
280
|
-
rubygems_version:
|
246
|
+
rubygems_version: 2.2.2
|
281
247
|
signing_key:
|
282
|
-
specification_version:
|
248
|
+
specification_version: 4
|
283
249
|
summary: Simplify common operations using em-pg-client
|
284
250
|
test_files: []
|
285
251
|
has_rdoc:
|