em-pg-client-helper 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
- s.add_development_dependency 'pry-debugger'
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'
@@ -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(',')}) SELECT #{fp_map.values.join(',')}"
108
+ insert_query = "INSERT INTO #{tbl} (#{fp_map.keys.join(',')}) " +
109
+ "SELECT #{fp_map.values.join(',')}"
106
110
 
107
- ["WITH upsert AS (#{update_query}) #{insert_query} WHERE NOT EXISTS (SELECT * FROM upsert)",
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 upsert AS (UPDATE "foo" SET "bar"=$1 WHERE "wombat"=$2 RETURNING *) ' +
8
- 'INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 ' +
9
- 'WHERE NOT EXISTS (SELECT * FROM upsert)',
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
@@ -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 upsert AS (UPDATE "foo" SET "bar"=$1 WHERE "wombat"=$2 RETURNING *) ' +
7
- 'INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 ' +
8
- 'WHERE NOT EXISTS (SELECT * FROM upsert)',
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
@@ -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 upsert AS (UPDATE "foo" SET "bar"=$1 WHERE "wombat"=$2 RETURNING *) ' +
8
- 'INSERT INTO "foo" ("bar","wombat") SELECT $1,$2 ' +
9
- 'WHERE NOT EXISTS (SELECT * FROM upsert)',
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 upsert AS (UPDATE "user_store_data" SET "data"=$4 ' +
26
- 'WHERE "id"=$1 AND "platform"=$2 AND "profile_type"=$3 RETURNING *) ' +
27
- 'INSERT INTO "user_store_data" ("id","platform","profile_type","data") ' +
28
- 'SELECT $1,$2,$3,$4 WHERE NOT EXISTS (SELECT * FROM upsert)',
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.1.0
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-23 00:00:00.000000000 Z
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-debugger
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: 1.8.23
246
+ rubygems_version: 2.2.2
281
247
  signing_key:
282
- specification_version: 3
248
+ specification_version: 4
283
249
  summary: Simplify common operations using em-pg-client
284
250
  test_files: []
285
251
  has_rdoc: