em-pg-client-helper 2.0.7 → 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00dae568e9a3fbcee2f9f9d02f1567c29d3b407d
4
- data.tar.gz: b9baf2122794e3f7b9b820f7e452d0538574b64a
3
+ metadata.gz: 454ef9b154d19499a552861f4a24f395f7ce1b28
4
+ data.tar.gz: 31b6924e0d271d1e481594d15b9014558f780b40
5
5
  SHA512:
6
- metadata.gz: f4e0290bba50452b458df0ad181c5b6010c19934a420c132c00625580c7430aa9aea093ef6d9df790104cdad03be27988c1c7603c6f24aaee498482a83992281
7
- data.tar.gz: c4dc5ba9b3d490e51dfd4a246f910d042778626db74895468759ddfba58c6b21af7fbe9bb940c2ce3e4628eb19d66a884f965550bf9d8547e2de2734263d989c
6
+ metadata.gz: 119c158a73d677ac6a17407c0fda64fee465afb4d131a6cede0b0519206336f23cfcc54afdc5ff22020e0ca7138eb655422a45e3fa8fde55bf2f02d6adf4d6de
7
+ data.tar.gz: e16bd157b126e540e1e0bcf48c63342777fd1c4a9408b28fc51b0f2677e846ce11153d764428b5c46d73d40d6e1c281bde4600bfd0202e87a252bfd1e470b9fe
@@ -71,7 +71,7 @@ module PG::EM::Client::Helper
71
71
  # # ... you don't want to know.
72
72
  #
73
73
  def sequel_sql
74
- sqldb = Sequel.connect("mock://postgres")
74
+ sqldb = Thread.current[:em_pg_client_sequel_db] ||= Sequel.connect("mock://postgres", :keep_reference => false)
75
75
  ret = yield sqldb if block_given?
76
76
  sqls = sqldb.sqls
77
77
 
@@ -197,37 +197,37 @@ module PG::EM::Client::Helper
197
197
 
198
198
  # Efficiently perform a "bulk" insert of multiple rows.
199
199
  #
200
- # When you have a large quantity of data to insert into a table, you don't
201
- # want to do it one row at a time -- that's *really* inefficient. On the
202
- # other hand, if you do one giant multi-row insert statement, the insert
203
- # will fail if *any* of the rows causes a constraint failure. What to do?
204
- #
205
- # Well, here's our answer: try to insert all the records at once. If that
206
- # fails with a constraint violation, then split the set of records in half
207
- # and try to bulk insert each of those halves. Recurse in this fashion until
208
- # you only have one record to insert.
209
- #
210
- # @param db [PG::EM::Client, PG::EM::ConnectionPool] the connection against
211
- # which the insert wil be run.
212
- #
213
- # @param tbl [#to_sym] the name of the table into which you wish to insert
214
- # your data.
215
- #
216
- # @param columns [Array<#to_sym>] the columns into which each record of data
217
- # will be inserted.
218
- #
219
- # @param rows [Array<Array<Object>>] the values to insert. Each entry in
220
- # the outermost array is a row of data; the elements of each of these inner
221
- # arrays corresponds to the column in the same position in the `columns`
222
- # array. **NOTE**: we don't do any checking to make sure you're giving
223
- # us the correct list of values for each row. Thus, if you give us a
224
- # row array that has too few, or too many, entries, the database will puke.
225
- #
226
- # @return [EM::Deferrable] the deferrable in which the query is being called;
227
- # once the bulk insert completes successfully, the deferrable will succeed
228
- # with the number of rows that were successfully inserted. If the insert
229
- # could not be completed, the deferrable will fail (`#errback`) with the
230
- # exception.
200
+ # When you have a large quantity of data to insert into a table, you
201
+ # don't want to do it one row at a time -- that's *really* inefficient.
202
+ # On the other hand, if you do one giant multi-row insert statement, the
203
+ # insert will fail if *any* of the rows causes a constraint failure.
204
+ # What to do?
205
+ #
206
+ # Well, here's our answer: try to insert all the records at once. If
207
+ # that fails with a constraint violation, then split the set of records
208
+ # in half and try to bulk insert each of those halves. Recurse in this
209
+ # fashion until you only have one record to insert.
210
+ #
211
+ # @param db [PG::EM::Client, PG::EM::ConnectionPool] the connection
212
+ # against which the insert wil be run.
213
+ #
214
+ # @param tbl [#to_sym] see
215
+ # {PG::EM::Client::Helper::Transaction#bulk_insert}.
216
+ #
217
+ # @param columns [Array<#to_sym>] see
218
+ # {PG::EM::Client::Helper::Transaction#bulk_insert}.
219
+ #
220
+ # @param rows [Array<Array<Object>>] see
221
+ # {PG::EM::Client::Helper::Transaction#bulk_insert}.
222
+ #
223
+ # @return [EM::Deferrable] the deferrable in which the query is being
224
+ # called; once the bulk insert completes successfully, the deferrable
225
+ # will succeed with the number of rows that were successfully inserted.
226
+ # If the insert could not be completed, the deferrable will fail
227
+ # (`#errback`) with the exception.
228
+ #
229
+ # @note for details on the `tbl`, `columns`, and `rows` parameters, see
230
+ # {PG::EM::Client::Helper::Transaction#bulk_insert}.
231
231
  #
232
232
  # @since 2.0.0
233
233
  #
@@ -218,18 +218,37 @@ class PG::EM::Client::Helper::Transaction
218
218
  # and try to bulk insert each of those halves. Recurse in this fashion until
219
219
  # you only have one record to insert.
220
220
  #
221
- # @param tbl [#to_sym] the name of the table into which you wish to insert
222
- # your data.
221
+ # @param tbl [Symbol, String] the name of the table into which you wish to insert
222
+ # your data. If provided as a Symbol, the name will be escaped,
223
+ # otherwise it will be inserted into the query as-is (and may `$DEITY`
224
+ # have mercy on your soul).
223
225
  #
224
- # @param columns [Array<#to_sym>] the columns into which each record of data
225
- # will be inserted.
226
+ # If the symbol name has a double underscore (`__`) in it, the part to
227
+ # the left of the double-underscore will be taken as a schema name, and
228
+ # the part to the right will be taken as the table name.
229
+ #
230
+ # @param columns [Array<Symbol, String>] the columns into which each
231
+ # record of data will be inserted. Any element of the array which is a
232
+ # symbol will be run through `Sequel::Database#literal` to escape it
233
+ # into a "safe" form; elements which are Strings are inserted as-is,
234
+ # and you're responsible for any escaping which may be required.
226
235
  #
227
236
  # @param rows [Array<Array<Object>>] the values to insert. Each entry in
228
237
  # the outermost array is a row of data; the elements of each of these inner
229
238
  # arrays corresponds to the column in the same position in the `columns`
230
- # array. **NOTE**: we don't do any checking to make sure you're giving
231
- # us the correct list of values for each row. Thus, if you give us a
232
- # row array that has too few, or too many, entries, the database will puke.
239
+ # array.
240
+ #
241
+ # Due to the way the bulk insert query is constructed, some of
242
+ # PostgreSQL's default casting behaviours don't work so well,
243
+ # particularly around dates and times. If you find that you're getting
244
+ # errors of the form `column "foo" is of type <something> but
245
+ # expression is of type text`, you'll need to explicitly cast the field
246
+ # that is having problems, replacing `value` in the array with
247
+ # something like `Sequel.cast(value, "timestamp without time zone")`.
248
+ #
249
+ # **NOTE**: We don't do any checking to make sure you're providing the
250
+ # correct number of elements for each row. Thus, if you give a row
251
+ # array that has too few, or too many, entries, the database will puke.
233
252
  #
234
253
  # @yield [Integer] Once the insert has completed, the number of rows that
235
254
  # were successfully inserted (that may be less than `rows.length` if
@@ -259,7 +278,7 @@ class PG::EM::Client::Helper::Transaction
259
278
  else
260
279
  # Guh hand-hacked SQL is fugly... but what I'm doing is so utterly
261
280
  # niche that Sequel doesn't support it.
262
- q_tbl = usdb.literal(tbl.to_sym)
281
+ q_tbl = usdb.literal(tbl)
263
282
  q_cols = columns.map { |c| usdb.literal(c) }
264
283
 
265
284
  # If there are any unique indexes which the set of columns to
@@ -362,7 +381,7 @@ class PG::EM::Client::Helper::Transaction
362
381
  # call methods like `#literal` on, for easy quoting.
363
382
  #
364
383
  def usdb
365
- @usdb ||= Sequel.connect("mock://postgres")
384
+ Thread.current[:em_pg_client_sequel_db] ||= Sequel.connect("mock://postgres", :keep_reference => false)
366
385
  end
367
386
 
368
387
  # Find the unique indexes for a table, and yield the columns in each.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-pg-client-helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7
4
+ version: 2.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2015-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: em-pg-client