pg 1.3.0.rc1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/binary-gems.yml +15 -9
- data/.github/workflows/source-gem.yml +9 -8
- data/Gemfile +1 -1
- data/History.rdoc +10 -5
- data/Rakefile.cross +2 -1
- data/certs/ged.pem +12 -12
- data/ext/extconf.rb +1 -0
- data/ext/pg.c +24 -3
- data/ext/pg_connection.c +213 -288
- data/ext/pg_record_coder.c +1 -1
- data/lib/pg/basic_type_registry.rb +1 -1
- data/lib/pg/connection.rb +245 -29
- data/lib/pg/version.rb +1 -1
- data/lib/pg.rb +2 -2
- data.tar.gz.sig +0 -0
- metadata +30 -24
- metadata.gz.sig +0 -0
data/ext/pg_record_coder.c
CHANGED
@@ -134,7 +134,7 @@ pg_recordcoder_type_map_get(VALUE self)
|
|
134
134
|
* tm = PG::TypeMapByColumn.new([PG::TextEncoder::Float.new]*2)
|
135
135
|
* # Use this type map to encode the record:
|
136
136
|
* PG::TextEncoder::Record.new(type_map: tm).encode([1,2])
|
137
|
-
* # => "(\"1.
|
137
|
+
* # => "(\"1.0\",\"2.0\")"
|
138
138
|
*
|
139
139
|
* Records can also be encoded and decoded directly to and from the database.
|
140
140
|
* This avoids intermediate string allocations and is very fast.
|
data/lib/pg/connection.rb
CHANGED
@@ -7,7 +7,7 @@ require 'io/wait'
|
|
7
7
|
require 'socket'
|
8
8
|
|
9
9
|
# The PostgreSQL connection class. The interface for this class is based on
|
10
|
-
# {libpq}[http://www.postgresql.org/docs/
|
10
|
+
# {libpq}[http://www.postgresql.org/docs/current/libpq.html], the C
|
11
11
|
# application programmer's interface to PostgreSQL. Some familiarity with libpq
|
12
12
|
# is recommended, but not necessary.
|
13
13
|
#
|
@@ -21,6 +21,13 @@ require 'socket'
|
|
21
21
|
#
|
22
22
|
# See the PG::Result class for information on working with the results of a query.
|
23
23
|
#
|
24
|
+
# Many methods of this class have three variants kind of:
|
25
|
+
# 1. #exec - the base method which is an alias to #async_exec .
|
26
|
+
# This is the method that should be used in general.
|
27
|
+
# 2. #async_exec - the async aware version of the method, implemented by libpq's async API.
|
28
|
+
# 3. #sync_exec - the method version that is implemented by blocking function(s) of libpq.
|
29
|
+
#
|
30
|
+
# Sync and async version of the method can be switched by Connection.async_api= , however it is not recommended to change the default.
|
24
31
|
class PG::Connection
|
25
32
|
|
26
33
|
# The order the options are passed to the ::connect method.
|
@@ -364,14 +371,44 @@ class PG::Connection
|
|
364
371
|
end
|
365
372
|
end
|
366
373
|
|
367
|
-
|
368
|
-
|
374
|
+
# call-seq:
|
375
|
+
# conn.get_result() -> PG::Result
|
376
|
+
# conn.get_result() {|pg_result| block }
|
377
|
+
#
|
378
|
+
# Blocks waiting for the next result from a call to
|
379
|
+
# #send_query (or another asynchronous command), and returns
|
380
|
+
# it. Returns +nil+ if no more results are available.
|
381
|
+
#
|
382
|
+
# Note: call this function repeatedly until it returns +nil+, or else
|
383
|
+
# you will not be able to issue further commands.
|
384
|
+
#
|
385
|
+
# If the optional code block is given, it will be passed <i>result</i> as an argument,
|
386
|
+
# and the PG::Result object will automatically be cleared when the block terminates.
|
387
|
+
# In this instance, <code>conn.exec</code> returns the value of the block.
|
388
|
+
def get_result(*args)
|
369
389
|
block
|
370
390
|
sync_get_result
|
371
391
|
end
|
392
|
+
alias async_get_result get_result
|
372
393
|
|
373
|
-
|
374
|
-
|
394
|
+
# call-seq:
|
395
|
+
# conn.get_copy_data( [ nonblock = false [, decoder = nil ]] ) -> Object
|
396
|
+
#
|
397
|
+
# Return one row of data, +nil+
|
398
|
+
# if the copy is done, or +false+ if the call would
|
399
|
+
# block (only possible if _nonblock_ is true).
|
400
|
+
#
|
401
|
+
# If _decoder_ is not set or +nil+, data is returned as binary string.
|
402
|
+
#
|
403
|
+
# If _decoder_ is set to a PG::Coder derivation, the return type depends on this decoder.
|
404
|
+
# PG::TextDecoder::CopyRow decodes the received data fields from one row of PostgreSQL's
|
405
|
+
# COPY text format to an Array of Strings.
|
406
|
+
# Optionally the decoder can type cast the single fields to various Ruby types in one step,
|
407
|
+
# if PG::TextDecoder::CopyRow#type_map is set accordingly.
|
408
|
+
#
|
409
|
+
# See also #copy_data.
|
410
|
+
#
|
411
|
+
def get_copy_data(async=false, decoder=nil)
|
375
412
|
if async
|
376
413
|
return sync_get_copy_data(async, decoder)
|
377
414
|
else
|
@@ -382,56 +419,143 @@ class PG::Connection
|
|
382
419
|
return res
|
383
420
|
end
|
384
421
|
end
|
422
|
+
alias async_get_copy_data get_copy_data
|
385
423
|
|
386
|
-
# In async_api=false mode all send calls run directly on libpq.
|
387
|
-
# Blocking vs. nonblocking state can be changed in libpq.
|
388
|
-
alias sync_setnonblocking setnonblocking
|
389
424
|
|
390
425
|
# In async_api=true mode (default) all send calls run nonblocking.
|
391
426
|
# The difference is that setnonblocking(true) disables automatic handling of would-block cases.
|
392
|
-
|
427
|
+
# In async_api=false mode all send calls run directly on libpq.
|
428
|
+
# Blocking vs. nonblocking state can be changed in libpq.
|
429
|
+
|
430
|
+
# call-seq:
|
431
|
+
# conn.setnonblocking(Boolean) -> nil
|
432
|
+
#
|
433
|
+
# Sets the nonblocking status of the connection.
|
434
|
+
# In the blocking state, calls to #send_query
|
435
|
+
# will block until the message is sent to the server,
|
436
|
+
# but will not wait for the query results.
|
437
|
+
# In the nonblocking state, calls to #send_query
|
438
|
+
# will return an error if the socket is not ready for
|
439
|
+
# writing.
|
440
|
+
# Note: This function does not affect #exec, because
|
441
|
+
# that function doesn't return until the server has
|
442
|
+
# processed the query and returned the results.
|
443
|
+
#
|
444
|
+
# Returns +nil+.
|
445
|
+
def setnonblocking(enabled)
|
393
446
|
singleton_class.async_send_api = !enabled
|
394
447
|
self.flush_data = !enabled
|
395
448
|
sync_setnonblocking(true)
|
396
449
|
end
|
450
|
+
alias async_setnonblocking setnonblocking
|
397
451
|
|
398
452
|
# sync/async isnonblocking methods are switched by async_setnonblocking()
|
399
|
-
|
400
|
-
|
453
|
+
|
454
|
+
# call-seq:
|
455
|
+
# conn.isnonblocking() -> Boolean
|
456
|
+
#
|
457
|
+
# Returns the blocking status of the database connection.
|
458
|
+
# Returns +true+ if the connection is set to nonblocking mode and +false+ if blocking.
|
459
|
+
def isnonblocking
|
401
460
|
false
|
402
461
|
end
|
462
|
+
alias async_isnonblocking isnonblocking
|
463
|
+
alias nonblocking? isnonblocking
|
403
464
|
|
404
|
-
|
405
|
-
|
465
|
+
# call-seq:
|
466
|
+
# conn.put_copy_data( buffer [, encoder] ) -> Boolean
|
467
|
+
#
|
468
|
+
# Transmits _buffer_ as copy data to the server.
|
469
|
+
# Returns true if the data was sent, false if it was
|
470
|
+
# not sent (false is only possible if the connection
|
471
|
+
# is in nonblocking mode, and this command would block).
|
472
|
+
#
|
473
|
+
# _encoder_ can be a PG::Coder derivation (typically PG::TextEncoder::CopyRow).
|
474
|
+
# This encodes the data fields given as _buffer_ from an Array of Strings to
|
475
|
+
# PostgreSQL's COPY text format inclusive proper escaping. Optionally
|
476
|
+
# the encoder can type cast the fields from various Ruby types in one step,
|
477
|
+
# if PG::TextEncoder::CopyRow#type_map is set accordingly.
|
478
|
+
#
|
479
|
+
# Raises an exception if an error occurs.
|
480
|
+
#
|
481
|
+
# See also #copy_data.
|
482
|
+
#
|
483
|
+
def put_copy_data(buffer, encoder=nil)
|
406
484
|
until sync_put_copy_data(buffer, encoder)
|
407
485
|
flush
|
408
486
|
end
|
409
487
|
flush
|
410
488
|
end
|
411
|
-
alias
|
412
|
-
|
489
|
+
alias async_put_copy_data put_copy_data
|
490
|
+
|
491
|
+
# call-seq:
|
492
|
+
# conn.put_copy_end( [ error_message ] ) -> Boolean
|
493
|
+
#
|
494
|
+
# Sends end-of-data indication to the server.
|
495
|
+
#
|
496
|
+
# _error_message_ is an optional parameter, and if set,
|
497
|
+
# forces the COPY command to fail with the string
|
498
|
+
# _error_message_.
|
499
|
+
#
|
500
|
+
# Returns true if the end-of-data was sent, #false* if it was
|
501
|
+
# not sent (*false* is only possible if the connection
|
502
|
+
# is in nonblocking mode, and this command would block).
|
503
|
+
def put_copy_end(*args)
|
413
504
|
until sync_put_copy_end(*args)
|
414
505
|
flush
|
415
506
|
end
|
416
507
|
flush
|
417
508
|
end
|
509
|
+
alias async_put_copy_end put_copy_end
|
418
510
|
|
419
|
-
if method_defined? :
|
420
|
-
|
421
|
-
|
511
|
+
if method_defined? :sync_encrypt_password
|
512
|
+
# call-seq:
|
513
|
+
# conn.encrypt_password( password, username, algorithm=nil ) -> String
|
514
|
+
#
|
515
|
+
# This function is intended to be used by client applications that wish to send commands like <tt>ALTER USER joe PASSWORD 'pwd'</tt>.
|
516
|
+
# It is good practice not to send the original cleartext password in such a command, because it might be exposed in command logs, activity displays, and so on.
|
517
|
+
# Instead, use this function to convert the password to encrypted form before it is sent.
|
518
|
+
#
|
519
|
+
# The +password+ and +username+ arguments are the cleartext password, and the SQL name of the user it is for.
|
520
|
+
# +algorithm+ specifies the encryption algorithm to use to encrypt the password.
|
521
|
+
# Currently supported algorithms are +md5+ and +scram-sha-256+ (+on+ and +off+ are also accepted as aliases for +md5+, for compatibility with older server versions).
|
522
|
+
# Note that support for +scram-sha-256+ was introduced in PostgreSQL version 10, and will not work correctly with older server versions.
|
523
|
+
# If algorithm is omitted or +nil+, this function will query the server for the current value of the +password_encryption+ setting.
|
524
|
+
# That can block, and will fail if the current transaction is aborted, or if the connection is busy executing another query.
|
525
|
+
# If you wish to use the default algorithm for the server but want to avoid blocking, query +password_encryption+ yourself before calling #encrypt_password, and pass that value as the algorithm.
|
526
|
+
#
|
527
|
+
# Return value is the encrypted password.
|
528
|
+
# The caller can assume the string doesn't contain any special characters that would require escaping.
|
529
|
+
#
|
530
|
+
# Available since PostgreSQL-10.
|
531
|
+
# See also corresponding {libpq function}[https://www.postgresql.org/docs/current/libpq-misc.html#LIBPQ-PQENCRYPTPASSWORDCONN].
|
532
|
+
def encrypt_password( password, username, algorithm=nil )
|
422
533
|
algorithm ||= exec("SHOW password_encryption").getvalue(0,0)
|
423
534
|
sync_encrypt_password(password, username, algorithm)
|
424
535
|
end
|
536
|
+
alias async_encrypt_password encrypt_password
|
425
537
|
end
|
426
538
|
|
427
|
-
|
428
|
-
|
539
|
+
# call-seq:
|
540
|
+
# conn.reset()
|
541
|
+
#
|
542
|
+
# Resets the backend connection. This method closes the
|
543
|
+
# backend connection and tries to re-connect.
|
544
|
+
def reset
|
429
545
|
reset_start
|
430
546
|
async_connect_or_reset(:reset_poll)
|
431
547
|
end
|
548
|
+
alias async_reset reset
|
432
549
|
|
433
|
-
|
434
|
-
|
550
|
+
# call-seq:
|
551
|
+
# conn.cancel() -> String
|
552
|
+
#
|
553
|
+
# Requests cancellation of the command currently being
|
554
|
+
# processed.
|
555
|
+
#
|
556
|
+
# Returns +nil+ on success, or a string containing the
|
557
|
+
# error message if a failure occurs.
|
558
|
+
def cancel
|
435
559
|
be_pid = backend_pid
|
436
560
|
be_key = backend_key
|
437
561
|
cancel_request = [0x10, 1234, 5678, be_pid, be_key].pack("NnnNN")
|
@@ -484,6 +608,7 @@ class PG::Connection
|
|
484
608
|
rescue SystemCallError => err
|
485
609
|
err.to_s
|
486
610
|
end
|
611
|
+
alias async_cancel cancel
|
487
612
|
|
488
613
|
private def async_connect_or_reset(poll_meth)
|
489
614
|
# Now grab a reference to the underlying socket so we know when the connection is established
|
@@ -520,19 +645,90 @@ class PG::Connection
|
|
520
645
|
end
|
521
646
|
|
522
647
|
class << self
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
648
|
+
# call-seq:
|
649
|
+
# PG::Connection.new -> conn
|
650
|
+
# PG::Connection.new(connection_hash) -> conn
|
651
|
+
# PG::Connection.new(connection_string) -> conn
|
652
|
+
# PG::Connection.new(host, port, options, tty, dbname, user, password) -> conn
|
653
|
+
#
|
654
|
+
# Create a connection to the specified server.
|
655
|
+
#
|
656
|
+
# +connection_hash+ must be a ruby Hash with connection parameters.
|
657
|
+
# See the {list of valid parameters}[https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS] in the PostgreSQL documentation.
|
658
|
+
#
|
659
|
+
# There are two accepted formats for +connection_string+: plain <code>keyword = value</code> strings and URIs.
|
660
|
+
# See the documentation of {connection strings}[https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING].
|
661
|
+
#
|
662
|
+
# The positional parameter form has the same functionality except that the missing parameters will always take on default values. The parameters are:
|
663
|
+
# [+host+]
|
664
|
+
# server hostname
|
665
|
+
# [+port+]
|
666
|
+
# server port number
|
667
|
+
# [+options+]
|
668
|
+
# backend options
|
669
|
+
# [+tty+]
|
670
|
+
# (ignored in all versions of PostgreSQL)
|
671
|
+
# [+dbname+]
|
672
|
+
# connecting database name
|
673
|
+
# [+user+]
|
674
|
+
# login user name
|
675
|
+
# [+password+]
|
676
|
+
# login password
|
677
|
+
#
|
678
|
+
# Examples:
|
679
|
+
#
|
680
|
+
# # Connect using all defaults
|
681
|
+
# PG::Connection.new
|
682
|
+
#
|
683
|
+
# # As a Hash
|
684
|
+
# PG::Connection.new( dbname: 'test', port: 5432 )
|
685
|
+
#
|
686
|
+
# # As a String
|
687
|
+
# PG::Connection.new( "dbname=test port=5432" )
|
688
|
+
#
|
689
|
+
# # As an Array
|
690
|
+
# PG::Connection.new( nil, 5432, nil, nil, 'test', nil, nil )
|
691
|
+
#
|
692
|
+
# # As an URI
|
693
|
+
# PG::Connection.new( "postgresql://user:pass@pgsql.example.com:5432/testdb?sslmode=require" )
|
694
|
+
#
|
695
|
+
# If the Ruby default internal encoding is set (i.e., <code>Encoding.default_internal != nil</code>), the
|
696
|
+
# connection will have its +client_encoding+ set accordingly.
|
697
|
+
#
|
698
|
+
# Raises a PG::Error if the connection fails.
|
699
|
+
def new(*args, **kwargs)
|
700
|
+
conn = self.connect_start(*args, **kwargs ) or
|
527
701
|
raise(PG::Error, "Unable to create a new connection")
|
528
702
|
|
529
703
|
raise(PG::ConnectionBad, conn.error_message) if conn.status == PG::CONNECTION_BAD
|
530
704
|
|
531
705
|
conn.send(:async_connect_or_reset, :connect_poll)
|
532
706
|
end
|
707
|
+
alias async_connect new
|
708
|
+
alias connect new
|
709
|
+
alias open new
|
710
|
+
alias setdb new
|
711
|
+
alias setdblogin new
|
533
712
|
|
534
|
-
|
535
|
-
|
713
|
+
# call-seq:
|
714
|
+
# PG::Connection.ping(connection_hash) -> Integer
|
715
|
+
# PG::Connection.ping(connection_string) -> Integer
|
716
|
+
# PG::Connection.ping(host, port, options, tty, dbname, login, password) -> Integer
|
717
|
+
#
|
718
|
+
# Check server status.
|
719
|
+
#
|
720
|
+
# See PG::Connection.new for a description of the parameters.
|
721
|
+
#
|
722
|
+
# Returns one of:
|
723
|
+
# [+PQPING_OK+]
|
724
|
+
# server is accepting connections
|
725
|
+
# [+PQPING_REJECT+]
|
726
|
+
# server is alive but rejecting connections
|
727
|
+
# [+PQPING_NO_RESPONSE+]
|
728
|
+
# could not establish connection
|
729
|
+
# [+PQPING_NO_ATTEMPT+]
|
730
|
+
# connection not attempted (bad params)
|
731
|
+
def ping(*args)
|
536
732
|
if Fiber.respond_to?(:scheduler) && Fiber.scheduler
|
537
733
|
# Run PQping in a second thread to avoid blocking of the scheduler.
|
538
734
|
# Unfortunately there's no nonblocking way to run ping.
|
@@ -541,9 +737,14 @@ class PG::Connection
|
|
541
737
|
sync_ping(*args)
|
542
738
|
end
|
543
739
|
end
|
740
|
+
alias async_ping ping
|
544
741
|
|
545
742
|
REDIRECT_CLASS_METHODS = {
|
546
743
|
:new => [:async_connect, :sync_connect],
|
744
|
+
:connect => [:async_connect, :sync_connect],
|
745
|
+
:open => [:async_connect, :sync_connect],
|
746
|
+
:setdb => [:async_connect, :sync_connect],
|
747
|
+
:setdblogin => [:async_connect, :sync_connect],
|
547
748
|
:ping => [:async_ping, :sync_ping],
|
548
749
|
}
|
549
750
|
|
@@ -586,6 +787,22 @@ class PG::Connection
|
|
586
787
|
end
|
587
788
|
end
|
588
789
|
|
790
|
+
# Switch between sync and async libpq API.
|
791
|
+
#
|
792
|
+
# PG::Connection.async_api = true
|
793
|
+
# this is the default.
|
794
|
+
# It sets an alias from #exec to #async_exec, #reset to #async_reset and so on.
|
795
|
+
#
|
796
|
+
# PG::Connection.async_api = false
|
797
|
+
# sets an alias from #exec to #sync_exec, #reset to #sync_reset and so on.
|
798
|
+
#
|
799
|
+
# pg-1.1.0+ defaults to libpq's async API for query related blocking methods.
|
800
|
+
# pg-1.3.0+ defaults to libpq's async API for all possibly blocking methods.
|
801
|
+
#
|
802
|
+
# _PLEASE_ _NOTE_: This method is not part of the public API and is for debug and development use only.
|
803
|
+
# Do not use this method in production code.
|
804
|
+
# Any issues with the default setting of <tt>async_api=true</tt> should be reported to the maintainers instead.
|
805
|
+
#
|
589
806
|
def async_api=(enable)
|
590
807
|
self.async_send_api = enable
|
591
808
|
REDIRECT_METHODS.each do |ali, (async, sync)|
|
@@ -599,6 +816,5 @@ class PG::Connection
|
|
599
816
|
end
|
600
817
|
end
|
601
818
|
|
602
|
-
# pg-1.1.0+ defaults to libpq's async API for query related blocking methods
|
603
819
|
self.async_api = true
|
604
820
|
end # class PG::Connection
|
data/lib/pg/version.rb
CHANGED
data/lib/pg.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,34 +1,40 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.0
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
8
8
|
- Lars Kanis
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain:
|
12
12
|
- |
|
13
13
|
-----BEGIN CERTIFICATE-----
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
14
|
+
MIID+DCCAmCgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
|
15
|
+
REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMjAxMDcyMzU4MTRaFw0yMzAxMDcyMzU4
|
16
|
+
MTRaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
|
17
|
+
hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
|
18
|
+
L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
|
19
|
+
M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
|
20
|
+
5PU2AEbf04GGSrmqADGWXeaslaoRdb1fu/0M5qfPTRn5V39sWD9umuDAF9qqil/x
|
21
|
+
Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2UPfgsrtvpdXjsHGfpT3IPN+B
|
22
|
+
vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
|
23
|
+
dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
|
24
|
+
ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
|
25
|
+
N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
|
26
|
+
VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
|
27
|
+
9w0BAQsFAAOCAYEASrm1AbEoxACZ9WXJH3R5axV3U0CA4xaETlL2YT+2nOfVBMQ9
|
28
|
+
0ZlkPx6j4ghKJgAIi1TMfDM2JyPJsppQh8tiNccDjWc62UZRY/dq26cMqf/lcI+a
|
29
|
+
6YBuEYvzZfearwVs8tHnXtwYV3WSCoCOQaB+nq2lA1O+nkKNl41WOsVbNama5jx3
|
30
|
+
8cQtVSEEmZy6jIDJ8c5TmBJ7BQUDEUEWA/A3V42Xyctoj7DvUXWE0lP+X6ypAVSr
|
31
|
+
lFh3TS64D7NTvxkmg7natUoCvobl6kGl4yMaqE4YRTlfuzhpf91TSOntClqrAOsS
|
32
|
+
K1s56WndQj3IoBocdY9mQhDZLtLHofSkymoP8btBlj5SsN24TiF0VMSZlctSCYZg
|
33
|
+
GKyHim/MMlIfGOWsgfioq5jzwmql7W4CDubbb8Lkg70v+hN2E/MnNVAcNE3gyaGc
|
34
|
+
P5YP5BAbNW+gvd3QHRiWTTuhgHrdDnGdXg93N2M5KHn1ug8BtPLQwlcFwEpKnlLn
|
35
|
+
btEP+7EplFuoiMfd
|
30
36
|
-----END CERTIFICATE-----
|
31
|
-
date:
|
37
|
+
date: 2022-01-23 00:00:00.000000000 Z
|
32
38
|
dependencies: []
|
33
39
|
description: Pg is the Ruby interface to the PostgreSQL RDBMS. It works with PostgreSQL
|
34
40
|
9.3 and later.
|
@@ -152,7 +158,7 @@ metadata:
|
|
152
158
|
source_code_uri: https://github.com/ged/ruby-pg
|
153
159
|
changelog_uri: https://github.com/ged/ruby-pg/blob/master/History.rdoc
|
154
160
|
documentation_uri: http://deveiate.org/code/pg
|
155
|
-
post_install_message:
|
161
|
+
post_install_message:
|
156
162
|
rdoc_options:
|
157
163
|
- "--main"
|
158
164
|
- README.rdoc
|
@@ -165,12 +171,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
171
|
version: '2.5'
|
166
172
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
173
|
requirements:
|
168
|
-
- - "
|
174
|
+
- - ">="
|
169
175
|
- !ruby/object:Gem::Version
|
170
|
-
version:
|
176
|
+
version: '0'
|
171
177
|
requirements: []
|
172
|
-
rubygems_version: 3.2.
|
173
|
-
signing_key:
|
178
|
+
rubygems_version: 3.2.22
|
179
|
+
signing_key:
|
174
180
|
specification_version: 4
|
175
181
|
summary: Pg is the Ruby interface to the PostgreSQL RDBMS
|
176
182
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|