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.
@@ -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.0000000000000000E+00\",\"2.0000000000000000E+00\")"
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.
@@ -162,7 +162,7 @@ class PG::BasicTypeRegistry
162
162
 
163
163
  include Checker
164
164
 
165
- def initialize
165
+ def initialize
166
166
  # The key of these hashs maps to the `typname` column from the table pg_type.
167
167
  @coders_by_name = []
168
168
  end
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/9.2/interactive/libpq.html], the C
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
- alias sync_get_result get_result
368
- def async_get_result(*args)
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
- alias sync_get_copy_data get_copy_data
374
- def async_get_copy_data(async=false, decoder=nil)
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
- def async_setnonblocking(enabled)
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
- alias sync_isnonblocking isnonblocking
400
- def async_isnonblocking
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
- alias sync_put_copy_data put_copy_data
405
- def async_put_copy_data(buffer, encoder=nil)
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 sync_put_copy_end put_copy_end
412
- def async_put_copy_end(*args)
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? :encrypt_password
420
- alias sync_encrypt_password encrypt_password
421
- def async_encrypt_password( password, username, algorithm=nil )
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
- alias sync_reset reset
428
- def async_reset
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
- alias sync_cancel cancel
434
- def async_cancel
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
- alias sync_connect new
524
-
525
- def async_connect(*args, **kwargs)
526
- conn = PG::Connection.connect_start(*args, **kwargs ) or
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
- alias sync_ping ping
535
- def async_ping(*args)
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
@@ -1,4 +1,4 @@
1
1
  module PG
2
2
  # Library version
3
- VERSION = '1.3.0.rc1'
3
+ VERSION = '1.3.0'
4
4
  end
data/lib/pg.rb CHANGED
@@ -63,8 +63,8 @@ module PG
63
63
 
64
64
 
65
65
  ### Convenience alias for PG::Connection.new.
66
- def self::connect( *args )
67
- return PG::Connection.new( *args )
66
+ def self::connect( *args, **kwargs )
67
+ return PG::Connection.new( *args, **kwargs )
68
68
  end
69
69
 
70
70
 
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.rc1
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
- 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
- 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
- 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
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK+5uh+zqCXKho0zXIaLmJD6YDpa
18
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
35
+ btEP+7EplFuoiMfd
30
36
  -----END CERTIFICATE-----
31
- date: 2021-12-27 00:00:00.000000000 Z
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: 1.3.1
176
+ version: '0'
171
177
  requirements: []
172
- rubygems_version: 3.2.15
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