pg_conn 0.25.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.
- checksums.yaml +4 -4
- data/TODO +5 -0
- data/lib/pg_conn/version.rb +1 -1
- data/lib/pg_conn.rb +70 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dc75936f3c9bd5db772a2f8a80aa8e8bb25cbd1ae2181492766a7ed6ab9104a
|
4
|
+
data.tar.gz: 8ac094777a20c074f4a018b4bb0ea53efff219eb2401e18bf9c5887721fbb1fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8651be5de05b08d991cc257dab9cc060c4dfe22f8c22b2489f7e9ecc3654d51c55ad8494287b1cb829dc92a50cf60eb777b8814bcc23b348143caf9339729a8c
|
7
|
+
data.tar.gz: 8c11d1e8cb3ceb859438e9ccb98fe38de9ed9126c449c58972cef97d9fb3108c87ea2a18899aea9d500eaa249625d0a1a783176e3fd4e8bc7ebe035cec31f67b
|
data/TODO
CHANGED
data/lib/pg_conn/version.rb
CHANGED
data/lib/pg_conn.rb
CHANGED
@@ -269,8 +269,8 @@ module PgConn
|
|
269
269
|
#
|
270
270
|
# The :elem_type option can be a postgres type name (String or Symbol) or
|
271
271
|
# an array of type names. It is used as the required explicit element
|
272
|
-
# type when the argument is an empty array.
|
273
|
-
#
|
272
|
+
# type when the argument is an empty array. It is not needed if the array
|
273
|
+
# is guaranteed to be non-empty. Nested arrays are not supported
|
274
274
|
#
|
275
275
|
def quote_value(value, elem_type: nil)
|
276
276
|
case value
|
@@ -294,19 +294,42 @@ module PgConn
|
|
294
294
|
|
295
295
|
# Quote values and concatenate them using ',' as separator
|
296
296
|
def quote_values(values, elem_type: nil)
|
297
|
-
|
298
|
-
|
297
|
+
values.map { |value| quote_value(value, elem_type: elem_type) }.join(", ")
|
298
|
+
end
|
299
|
+
|
300
|
+
# Quote an array of values as a tuple. The element types should be in the
|
301
|
+
# same order as the array arguments. #quote_tuples is same as #quote_values
|
302
|
+
# except the values may have different types (this makes no difference
|
303
|
+
# except in the case when the tuple may contain empty array(s))
|
304
|
+
def quote_tuple(tuple, elem_types: nil)
|
305
|
+
elem_types = Array(elem_types)
|
306
|
+
tuple.map { |value|
|
299
307
|
elem_type = value.is_a?(Array) ? elem_types&.shift : nil
|
300
308
|
quote_value(value, elem_type: elem_type)
|
301
309
|
}.join(", ")
|
302
310
|
end
|
303
311
|
|
304
|
-
# Quote an array of values as a tuple. Just an alias for #quote_values
|
305
|
-
def quote_tuple(tuple, elem_type: nil) = quote_values(tuple, elem_type: elem_type)
|
306
|
-
|
307
312
|
# Quote an array of tuples
|
308
|
-
def quote_tuples(tuples,
|
309
|
-
tuples.map { |tuple| "(#{
|
313
|
+
def quote_tuples(tuples, elem_types: nil)
|
314
|
+
tuples.map { |tuple| "(#{quote_tuple(tuple, elem_types: elem_types)})" }.join(", ")
|
315
|
+
end
|
316
|
+
|
317
|
+
# Quote a record and cast it into the given type, the type can also be a
|
318
|
+
# table or view. 'data' is an array, hash, or struct representation of the
|
319
|
+
# record
|
320
|
+
#
|
321
|
+
# Note that the fields are retrived from the database so this method is not
|
322
|
+
# as fast as the other quote-methods. It is however very convenient when
|
323
|
+
# you're testing and need a composite type because record-quoting can
|
324
|
+
# easily become unwieldly
|
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)
|
327
|
+
end
|
328
|
+
|
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)
|
310
333
|
end
|
311
334
|
|
312
335
|
# :call-seq:
|
@@ -651,7 +674,7 @@ module PgConn
|
|
651
674
|
|
652
675
|
# Find method and normalize data
|
653
676
|
if data.is_a?(Array) # Array of tuples
|
654
|
-
method = :values
|
677
|
+
method = :values # The pg_conn method when multiple records are inserted
|
655
678
|
if data.empty?
|
656
679
|
return []
|
657
680
|
elsif data.first.is_a?(Array) # Tuple (array) element. Requires the 'fields' argument
|
@@ -664,7 +687,7 @@ module PgConn
|
|
664
687
|
raise ArgumentError
|
665
688
|
end
|
666
689
|
elsif data.is_a?(Hash)
|
667
|
-
method = :value
|
690
|
+
method = :value # The pg_conn method when only one record is inserted
|
668
691
|
fields ||= data.keys
|
669
692
|
tuples = [fields.map { |field| data[field] }]
|
670
693
|
else
|
@@ -937,6 +960,42 @@ module PgConn
|
|
937
960
|
end
|
938
961
|
end
|
939
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
|
+
|
940
999
|
# :call-seq:
|
941
1000
|
# pg_exec(string)
|
942
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.
|
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
|
+
date: 2024-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|