pg_conn 0.26.0 → 0.26.1

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pg_conn/version.rb +1 -1
  3. data/lib/pg_conn.rb +44 -28
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4148bbd8c21613249beed07d5248aa71780a8805881afc94899f9f29cd2d452d
4
- data.tar.gz: 21bea1c8c108a4a135eb1d6936a56995b457db0e8192a17b745d0b3dd1676846
3
+ metadata.gz: 6dc75936f3c9bd5db772a2f8a80aa8e8bb25cbd1ae2181492766a7ed6ab9104a
4
+ data.tar.gz: 8ac094777a20c074f4a018b4bb0ea53efff219eb2401e18bf9c5887721fbb1fe
5
5
  SHA512:
6
- metadata.gz: 7cca5aea976d949607b1650e8f00347a22be14907c8296a26379cd804a51f5610bb9786bc21b3b9317496a00ef135564033f276d5e3300dbd4d133b056835a79
7
- data.tar.gz: 8bcf303b9712c1e6de69c301115c88a53d908aad90c8bce6b8e73e912d6b710772fb88a6bb191bc34142ca29f016845bfbc035cda4670c91d5e3d407ce82907e
6
+ metadata.gz: 8651be5de05b08d991cc257dab9cc060c4dfe22f8c22b2489f7e9ecc3654d51c55ad8494287b1cb829dc92a50cf60eb777b8814bcc23b348143caf9339729a8c
7
+ data.tar.gz: 8c11d1e8cb3ceb859438e9ccb98fe38de9ed9126c449c58972cef97d9fb3108c87ea2a18899aea9d500eaa249625d0a1a783176e3fd4e8bc7ebe035cec31f67b
@@ -1,3 +1,3 @@
1
1
  module PgConn
2
- VERSION = "0.26.0"
2
+ VERSION = "0.26.1"
3
3
  end
data/lib/pg_conn.rb CHANGED
@@ -315,41 +315,21 @@ module PgConn
315
315
  end
316
316
 
317
317
  # Quote a record and cast it into the given type, the type can also be a
318
- # table or view. 'data' is a hash or struct representation of the record
318
+ # table or view. 'data' is an array, hash, or struct representation of the
319
+ # record
319
320
  #
320
321
  # Note that the fields are retrived from the database so this method is not
321
322
  # as fast as the other quote-methods. It is however very convenient when
322
323
  # you're testing and need a composite type because record-quoting can
323
324
  # easily become unwieldly
324
- def quote_record(schema_name = nil, type, data, elem_types: nil)
325
- qual_name = [schema_name, type].compact .join('.')
326
-
327
- fields = self.values(%(
328
- select attname
329
- from pg_attribute
330
- where
331
- attrelid = '#{qual_name}'::regclass
332
- and attnum > 0
333
- and not attisdropped
334
- order by attnum
335
- )).map(&:to_sym)
336
-
337
- values =
338
- case data
339
- when Hash; fields.map { |f| data[f] }
340
- when OpenStruct; fields.map { |f| data.send(f) }
341
- when Array; data
342
- else
343
- raise Error, "Illegal value #{data.inspect}"
344
- end
345
-
346
- "(#{quote_tuple(values, elem_types: elem_types)})::#{qual_name}"
325
+ def quote_record(data, schema_name = nil, type, elem_types: nil)
326
+ quote_record_impl(data, schema_name, type, elem_types: elem_types, array: false)
347
327
  end
348
328
 
349
- def quote_records(schema_name = nil, type, datas, elem_types: nil)
350
- qual_name = [schema_name, type].compact .join('.') + "[]"
351
- records = datas.map { |data| quote_record(schema_name, type, data, elem_types: elem_types) }
352
- "array[#{records.join(", ")}]::#{qual_name}"
329
+ # Quote an array of records. The type is the record type, not the type of
330
+ # the enclosing array
331
+ def quote_records(data, schema_name = nil, type, elem_types: nil)
332
+ quote_record_impl(data, schema_name, type, elem_types: elem_types, array: true)
353
333
  end
354
334
 
355
335
  # :call-seq:
@@ -980,6 +960,42 @@ module PgConn
980
960
  end
981
961
  end
982
962
 
963
+ # Common implementation for #quote_record and #quote_records that avoids
964
+ # query the database multiple times while not duplication the code. the
965
+ # :array flag controls the mode
966
+ def quote_record_impl(datas, schema_name = nil, type, elem_types: nil, array: nil)
967
+ pg_type = [schema_name, type].compact.join('.')
968
+ fields = self.values(%(
969
+ select attname
970
+ from pg_attribute
971
+ where
972
+ attrelid = '#{pg_type}'::regclass
973
+ and attnum > 0
974
+ and not attisdropped
975
+ order by attnum
976
+ )).map(&:to_sym)
977
+
978
+ datas = [datas] if !array
979
+
980
+ literals = datas.map { |data|
981
+ values =
982
+ case data
983
+ when Hash; fields.map { |f| data[f] }
984
+ when OpenStruct; fields.map { |f| data.send(f) }
985
+ when Array; data
986
+ else
987
+ raise Error, "Illegal value #{data.inspect}"
988
+ end
989
+ "(#{quote_tuple(values, elem_types: elem_types)})::#{pg_type}"
990
+ }
991
+
992
+ if array
993
+ "array[#{literals.join(', ')}]::#{pg_type}[]"
994
+ else
995
+ literals.first
996
+ end
997
+ end
998
+
983
999
  # :call-seq:
984
1000
  # pg_exec(string)
985
1001
  # pg_exec(array)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_conn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.0
4
+ version: 0.26.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claus Rasmussen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-16 00:00:00.000000000 Z
11
+ date: 2024-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg