pg 1.3.0-x86-mingw32 → 1.3.4-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.appveyor.yml +1 -1
  4. data/.github/workflows/binary-gems.yml +3 -3
  5. data/.github/workflows/source-gem.yml +5 -6
  6. data/History.rdoc +55 -1
  7. data/Rakefile.cross +3 -1
  8. data/certs/larskanis-2022.pem +26 -0
  9. data/ext/errorcodes.rb +0 -0
  10. data/ext/extconf.rb +13 -10
  11. data/ext/pg.h +1 -0
  12. data/ext/pg_connection.c +11 -26
  13. data/ext/pg_result.c +15 -9
  14. data/ext/pg_tuple.c +2 -8
  15. data/ext/pg_type_map_all_strings.c +1 -0
  16. data/ext/pg_type_map_by_column.c +2 -0
  17. data/lib/2.5/pg_ext.so +0 -0
  18. data/lib/2.6/pg_ext.so +0 -0
  19. data/lib/2.7/pg_ext.so +0 -0
  20. data/lib/3.0/pg_ext.so +0 -0
  21. data/lib/3.1/pg_ext.so +0 -0
  22. data/lib/pg/connection.rb +11 -9
  23. data/lib/pg/version.rb +1 -1
  24. data/lib/pg.rb +7 -5
  25. data/lib/x86-mingw32/libpq.dll +0 -0
  26. data/misc/openssl-pg-segfault.rb +0 -0
  27. data/rakelib/task_extension.rb +46 -0
  28. data/sample/array_insert.rb +0 -0
  29. data/sample/async_api.rb +3 -7
  30. data/sample/async_copyto.rb +0 -0
  31. data/sample/async_mixed.rb +0 -0
  32. data/sample/check_conn.rb +0 -0
  33. data/sample/copydata.rb +0 -0
  34. data/sample/copyfrom.rb +0 -0
  35. data/sample/copyto.rb +0 -0
  36. data/sample/cursor.rb +0 -0
  37. data/sample/disk_usage_report.rb +0 -0
  38. data/sample/issue-119.rb +0 -0
  39. data/sample/losample.rb +0 -0
  40. data/sample/minimal-testcase.rb +0 -0
  41. data/sample/notify_wait.rb +0 -0
  42. data/sample/pg_statistics.rb +0 -0
  43. data/sample/replication_monitor.rb +0 -0
  44. data/sample/test_binary_values.rb +0 -0
  45. data/sample/wal_shipper.rb +0 -0
  46. data/sample/warehouse_partitions.rb +0 -0
  47. data.tar.gz.sig +0 -0
  48. metadata +28 -24
  49. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4732ecf33214fa123ade5c9cd465e9511371ce366abb09ac93cd64a64276576
4
- data.tar.gz: dbdf516938ec978e241d8053c34b2a903be00d67f6a476a1b513177b23d8876c
3
+ metadata.gz: 7c43a7eedd1ed47087a0125ae20c780498e451e96cca842cbb5ce75b31922e1e
4
+ data.tar.gz: 464ea1a2cb643cdfe820d2f2a7a5653f44a934dffca9502fb48db78d4478f50b
5
5
  SHA512:
6
- metadata.gz: b59d82e69760a9e89179a15fc2b9d07d008748f2a5363746acfa0c60d451b167653b52b00718b4d5112ffc1631124184473024b8d72df29a63b863010635496d
7
- data.tar.gz: 8b8c84d4b286ad0afec7ec3edca5b469f6bb6110c822094ae32636c052dd27e081e003fd2bbbaff6af6d3a9ac2dd168beb599dd4a18848d2ec435b198a49f240
6
+ metadata.gz: 0ee7268b176b4f8992f23c90e4b919c8aba56dae767a7bb05845ec269991851cf4f4dec58b147110b30476b59d105cf4a91047834639159819d7cd9961bceec0
7
+ data.tar.gz: fbfbc3cccb24e894cd16b0e3b34843260502d909e62f0927b05df993bece18010b0e3e469ed1afdd5f4e77c6bd295c127c60c63dc83b1f4711d88ac6c23de91d
checksums.yaml.gz.sig CHANGED
Binary file
data/.appveyor.yml CHANGED
@@ -29,7 +29,7 @@ environment:
29
29
  matrix:
30
30
  - ruby_version: "head"
31
31
  RUBYDOWNLOAD: x86
32
- PGVERSION: 10.16-1-windows
32
+ PGVERSION: 10.20-1-windows
33
33
  PGVER: 10
34
34
  - ruby_version: "25"
35
35
  PGVERSION: 9.3.25-1-windows
@@ -45,10 +45,10 @@ jobs:
45
45
  include:
46
46
  - ruby: "3.1"
47
47
  platform: "x64-mingw-ucrt"
48
- PGVERSION: 14.0-1-windows-x64
48
+ PGVERSION: 14.2-1-windows-x64
49
49
  - ruby: "2.5"
50
50
  platform: "x64-mingw32"
51
- PGVERSION: 10.16-1-windows
51
+ PGVERSION: 10.20-1-windows
52
52
 
53
53
  runs-on: windows-latest
54
54
  env:
@@ -56,7 +56,7 @@ jobs:
56
56
  steps:
57
57
  - uses: actions/checkout@v2
58
58
  - name: Set up Ruby
59
- uses: MSP-Greg/ruby-setup-ruby@win-ucrt-1
59
+ uses: ruby/setup-ruby@v1
60
60
  with:
61
61
  ruby-version: ${{ matrix.ruby }}
62
62
 
@@ -31,12 +31,12 @@ jobs:
31
31
  include:
32
32
  - os: windows
33
33
  ruby: "head"
34
- PGVERSION: 14.1-1-windows-x64
34
+ PGVERSION: 14.2-1-windows-x64
35
35
  PGVER: "14"
36
36
  - os: windows
37
37
  ruby: "2.5"
38
- PGVERSION: 9.3.25-1-windows-x64
39
- PGVER: "9.3"
38
+ PGVERSION: 9.4.26-1-windows-x64
39
+ PGVER: "9.4"
40
40
  - os: ubuntu
41
41
  ruby: "head"
42
42
  PGVER: "14"
@@ -54,7 +54,7 @@ jobs:
54
54
  PGVER: "14"
55
55
  - os: macos
56
56
  ruby: "head"
57
- PGVERSION: 14.1-1-osx
57
+ PGVERSION: 14.2-1-osx
58
58
  PGVER: "14"
59
59
 
60
60
  runs-on: ${{ matrix.os }}-latest
@@ -65,7 +65,7 @@ jobs:
65
65
  steps:
66
66
  - uses: actions/checkout@v2
67
67
  - name: Set up Ruby
68
- uses: MSP-Greg/ruby-setup-ruby@win-ucrt-1
68
+ uses: ruby/setup-ruby@v1
69
69
  with:
70
70
  ruby-version: ${{ matrix.ruby }}
71
71
 
@@ -116,7 +116,6 @@ jobs:
116
116
  - run: gem install --local *.gem --verbose
117
117
 
118
118
  - name: Run specs
119
- continue-on-error: ${{ matrix.ruby == 'truffleruby-head' }}
120
119
  env:
121
120
  PG_DEBUG: 0
122
121
  run: ruby -rpg -S rspec spec/**/*_spec.rb -cfdoc
data/History.rdoc CHANGED
@@ -1,3 +1,56 @@
1
+ == v1.3.4 [2022-03-10] Lars Kanis <lars@greiz-reinsdorf.de>
2
+
3
+ Bugfixes:
4
+
5
+ - Don't leak IO in case of connection errors. #439
6
+ Previously it was kept open until the PG::Connection was garbage collected.
7
+ - Fix a performance regession in conn.get_result noticed in single row mode. #442
8
+ - Fix occasional error Errno::EBADF (Bad file descriptor) while connecting. #444
9
+ - Fix compatibility of res.stream_each* methods with Fiber.scheduler. #446
10
+ - Remove FL_TEST and FL_SET, which are MRI-internal. #437
11
+
12
+ Enhancements:
13
+
14
+ - Allow pgresult_stream_any to be used by sequel_pg. #443
15
+
16
+
17
+ == v1.3.3 [2022-02-22] Lars Kanis <lars@greiz-reinsdorf.de>
18
+
19
+ Bugfixes:
20
+
21
+ - Fix omission of the third digit of IPv4 addresses in connection URI. #435
22
+ - Fix wrong permission of certs/larskanis-2022.pem in the pg-1.3.2.gem. #432
23
+
24
+
25
+ == v1.3.2 [2022-02-14] Lars Kanis <lars@greiz-reinsdorf.de>
26
+
27
+ Bugfixes:
28
+
29
+ - Cancel only active query after failing transaction. #430
30
+ This avoids an incompatibility with pgbouncer since pg-1.3.0.
31
+ - Fix String objects with non-applied encoding when using COPY or record decoders. #427
32
+ - Update Windows fat binary gem to PostgreSQL-14.2.
33
+
34
+ Enhancements:
35
+
36
+ - Improve extconf.rb checks to reduces the number of compiler calls.
37
+ - Add a check for PGRES_PIPELINE_SYNC, to make sure the library version and the header files are PostgreSQL-14+. #429
38
+
39
+
40
+ == v1.3.1 [2022-02-01] Michael Granger <ged@FaerieMUD.org>
41
+
42
+ Bugfixes:
43
+
44
+ - Fix wrong handling of socket writability on Windows introduced in #417.
45
+ This caused starvation in conn.put_copy_data.
46
+ - Fix error in PG.version_string(true). #419
47
+ - Fix a regression in pg 1.3.0 where Ruby 2.x busy-looping any fractional seconds for every wait. #420
48
+
49
+ Enhancements:
50
+
51
+ - Raise an error when conn.copy_data is used in nonblocking mode.
52
+
53
+
1
54
  == v1.3.0 [2022-01-20] Michael Granger <ged@FaerieMUD.org>
2
55
 
3
56
  Install Enhancements:
@@ -26,7 +79,7 @@ API Enhancements:
26
79
  - Run Connection.ping in a second thread.
27
80
  - Make discard_results scheduler friendly
28
81
  - Do all socket waiting through the conn.socket_io object.
29
- - Avoid PG.connect blocking while address resolution by automatically providing the +hostaddr+ parameter.
82
+ - Avoid PG.connect blocking while address resolution by automatically providing the +hostaddr+ parameter and resolving in Ruby instead of libpq.
30
83
  - On Windows Fiber.scheduler support requires Ruby-3.1+.
31
84
  It is also only partly usable since may ruby IO methods are not yet scheduler aware on Windows.
32
85
  - Add support for pipeline mode of PostgreSQL-14. #401
@@ -65,6 +118,7 @@ Deprecated:
65
118
  Removed:
66
119
  - Remove support of ruby-2.2, 2.3 and 2.4. Minimum is ruby-2.5 now.
67
120
  - Remove support for PostgreSQL-9.2. Minimum is PostgreSQL-9.3 now.
121
+ - Remove constant PG::REVISION, which was broken since pg-1.1.4.
68
122
 
69
123
  Repository:
70
124
  - Replace Hoe by Bundler for gem packaging
data/Rakefile.cross CHANGED
@@ -7,6 +7,7 @@ require 'rake/clean'
7
7
  require 'rake/extensiontask'
8
8
  require 'rake/extensioncompiler'
9
9
  require 'ostruct'
10
+ require_relative 'rakelib/task_extension'
10
11
 
11
12
  MISCDIR = BASEDIR + 'misc'
12
13
 
@@ -20,6 +21,7 @@ end
20
21
 
21
22
  class CrossLibrary < OpenStruct
22
23
  include Rake::DSL
24
+ prepend TaskExtension
23
25
 
24
26
  def initialize(for_platform, openssl_config, toolchain)
25
27
  super()
@@ -30,7 +32,7 @@ class CrossLibrary < OpenStruct
30
32
 
31
33
  # Cross-compilation constants
32
34
  self.openssl_version = ENV['OPENSSL_VERSION'] || '1.1.1m'
33
- self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '14.1'
35
+ self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '14.2'
34
36
 
35
37
  # Check if symlinks work in the current working directory.
36
38
  # This fails, if rake-compiler-dock is running on a Windows box.
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIETTCCArWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
3
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yMjAyMTQxMzMwNTZaFw0yMzAy
4
+ MTQxMzMwNTZaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
5
+ PWRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAwum6Y1KznfpzXOT/
6
+ mZgJTBbxZuuZF49Fq3K0WA67YBzNlDv95qzSp7V/7Ek3NCcnT7G+2kSuhNo1FhdN
7
+ eSDO/moYebZNAcu3iqLsuzuULXPLuoU0GsMnVMqV9DZPh7cQHE5EBZ7hlzDBK7k/
8
+ 8nBMvR0mHo77kIkapHc26UzVq/G0nKLfDsIHXVylto3PjzOumjG6GhmFN4r3cP6e
9
+ SDfl1FSeRYVpt4kmQULz/zdSaOH3AjAq7PM2Z91iGwQvoUXMANH2v89OWjQO/NHe
10
+ JMNDFsmHK/6Ji4Kk48Z3TyscHQnipAID5GhS1oD21/WePdj7GhmbF5gBzkV5uepd
11
+ eJQPgWGwrQW/Z2oPjRuJrRofzWfrMWqbOahj9uth6WSxhNexUtbjk6P8emmXOJi5
12
+ chQPnWX+N3Gj+jjYxqTFdwT7Mj3pv1VHa+aNUbqSPpvJeDyxRIuo9hvzDaBHb/Cg
13
+ 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjgYEwfzAJ
14
+ BgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUOIdbSMr3VFrTCO9/cTM0
15
+ 0exHzBcwIgYDVR0RBBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwIgYDVR0S
16
+ BBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwDQYJKoZIhvcNAQELBQADggGB
17
+ AFWP7F/y3Oq3NgrqUOnjKOeDaBa7AqNhHS+PZg+C90lnJzMgOs4KKgZYxqSQVSab
18
+ SCEmzIO/StkXY4NpJ4fYLrHemf/fJy1wPyu+fNdp5SEEUwEo+2toRFlzTe4u4LdS
19
+ QC636nPPTMt8H3xz2wf/lUIUeo2Qc95Qt2BQM465ibbG9kmA3c7Sopx6yOabYOAl
20
+ KPRbOSEPiWYcF9Suuz8Gdf8jxEtPlnZiwRvnYJ+IHMq3XQCJWPpMzdDMbtlgHbXE
21
+ vq1zOTLMSYAS0UB3uionR4yo1hLz60odwkCm7qf0o2Ci/5OjtB0a89VuyqRU2vUJ
22
+ QH95WBjDJ6lCCW7J0mrMPnJQSUFTmufsU6jOChvPaCeAzW1YwrsP/YKnvwueG7ip
23
+ VOdW6RitjtFxhS7evRL0201+KUvLz12zZWWjOcujlQs64QprxOtiv/MiisKb1Ng+
24
+ oL1mUdzB8KrZL4/WbG5YNX6UTtJbIOu9qEFbBAy4/jtIkJX+dlNoFwd4GXQW1YNO
25
+ nA==
26
+ -----END CERTIFICATE-----
data/ext/errorcodes.rb CHANGED
File without changes
data/ext/extconf.rb CHANGED
@@ -37,12 +37,12 @@ else
37
37
 
38
38
  if pgconfig && pgconfig != 'ignore'
39
39
  $stderr.puts "Using config values from %s" % [ pgconfig ]
40
- incdir = `"#{pgconfig}" --includedir`.chomp
41
- libdir = `"#{pgconfig}" --libdir`.chomp
40
+ incdir = IO.popen([pgconfig, "--includedir"], &:read).chomp
41
+ libdir = IO.popen([pgconfig, "--libdir"], &:read).chomp
42
42
  dir_config 'pg', incdir, libdir
43
43
 
44
44
  # Windows traditionally stores DLLs beside executables, not in libdir
45
- dlldir = RUBY_PLATFORM=~/mingw|mswin/ ? `"#{pgconfig}" --bindir`.chomp : libdir
45
+ dlldir = RUBY_PLATFORM=~/mingw|mswin/ ? IO.popen([pgconfig, "--bindir"], &:read).chomp : libdir
46
46
 
47
47
  elsif checking_for "libpq per pkg-config" do
48
48
  _cflags, ldflags, _libs = pkg_config("libpq")
@@ -87,7 +87,7 @@ begin
87
87
  have_library( 'libpq', 'PQconnectdb', ['libpq-fe.h'] ) ||
88
88
  have_library( 'ms/libpq', 'PQconnectdb', ['libpq-fe.h'] )
89
89
 
90
- rescue SystemExit => err
90
+ rescue SystemExit
91
91
  install_text = case RUBY_PLATFORM
92
92
  when /linux/
93
93
  <<-EOT
@@ -138,15 +138,18 @@ if /mingw/ =~ RUBY_PLATFORM && RbConfig::MAKEFILE_CONFIG['CC'] =~ /gcc/
138
138
  end
139
139
  end
140
140
 
141
- have_func 'PQconninfo' or
141
+ have_func 'PQconninfo', 'libpq-fe.h' or
142
142
  abort "Your PostgreSQL is too old. Either install an older version " +
143
143
  "of this gem or upgrade your database to at least PostgreSQL-9.3."
144
144
  # optional headers/functions
145
- have_func 'PQsslAttribute' # since PostgreSQL-9.5
146
- have_func 'PQresultVerboseErrorMessage' # since PostgreSQL-9.6
147
- have_func 'PQencryptPasswordConn' # since PostgreSQL-10
148
- have_func 'PQresultMemorySize' # since PostgreSQL-12
149
- have_func 'PQenterPipelineMode' # since PostgreSQL-14
145
+ have_func 'PQsslAttribute', 'libpq-fe.h' # since PostgreSQL-9.5
146
+ have_func 'PQresultVerboseErrorMessage', 'libpq-fe.h' # since PostgreSQL-9.6
147
+ have_func 'PQencryptPasswordConn', 'libpq-fe.h' # since PostgreSQL-10
148
+ have_func 'PQresultMemorySize', 'libpq-fe.h' # since PostgreSQL-12
149
+ have_func 'PQenterPipelineMode', 'libpq-fe.h' do |src| # since PostgreSQL-14
150
+ # Ensure header files fit as well
151
+ src + " int con(){ return PGRES_PIPELINE_SYNC; }"
152
+ end
150
153
  have_func 'timegm'
151
154
  have_func 'rb_gc_adjust_memory_usage' # since ruby-2.4
152
155
  have_func 'rb_gc_mark_movable' # since ruby-2.7
data/ext/pg.h CHANGED
@@ -344,6 +344,7 @@ void pg_typemap_compact _(( void * ));
344
344
 
345
345
  PGconn *pg_get_pgconn _(( VALUE ));
346
346
  t_pg_connection *pg_get_connection _(( VALUE ));
347
+ VALUE pgconn_block _(( int, VALUE *, VALUE ));
347
348
 
348
349
  VALUE pg_new_result _(( PGresult *, VALUE ));
349
350
  VALUE pg_new_result_autoclear _(( PGresult *, VALUE ));
data/ext/pg_connection.c CHANGED
@@ -475,9 +475,7 @@ pgconn_connect_poll(VALUE self)
475
475
  PostgresPollingStatusType status;
476
476
  status = gvl_PQconnectPoll(pg_get_pgconn(self));
477
477
 
478
- if ( status == PGRES_POLLING_FAILED ) {
479
- pgconn_close_socket_io(self);
480
- }
478
+ pgconn_close_socket_io(self);
481
479
 
482
480
  return INT2FIX((int)status);
483
481
  }
@@ -556,9 +554,7 @@ pgconn_reset_poll(VALUE self)
556
554
  PostgresPollingStatusType status;
557
555
  status = gvl_PQresetPoll(pg_get_pgconn(self));
558
556
 
559
- if ( status == PGRES_POLLING_FAILED ) {
560
- pgconn_close_socket_io(self);
561
- }
557
+ pgconn_close_socket_io(self);
562
558
 
563
559
  return INT2FIX((int)status);
564
560
  }
@@ -2241,19 +2237,15 @@ pg_rb_thread_io_wait(VALUE io, VALUE events, VALUE timeout) {
2241
2237
  GetOpenFile((io), fptr);
2242
2238
  if( !NIL_P(timeout) ){
2243
2239
  ptimeout.tv_sec = (time_t)(NUM2DBL(timeout));
2244
- ptimeout.tv_usec = (time_t)(NUM2DBL(timeout) - (double)ptimeout.tv_sec);
2240
+ ptimeout.tv_usec = (time_t)((NUM2DBL(timeout) - (double)ptimeout.tv_sec) * 1e6);
2245
2241
 
2246
2242
  gettimeofday(&currtime, NULL);
2247
2243
  timeradd(&currtime, &ptimeout, &aborttime);
2248
2244
  }
2249
2245
 
2250
- if(rb_events & PG_RUBY_IO_READABLE) {
2251
- w32_events |= FD_READ | FD_ACCEPT | FD_CLOSE;
2252
- } else if(rb_events & PG_RUBY_IO_WRITABLE) {
2253
- w32_events |= FD_WRITE | FD_CONNECT;
2254
- } else if(rb_events & PG_RUBY_IO_PRIORITY) {
2255
- w32_events |= FD_OOB;
2256
- }
2246
+ if(rb_events & PG_RUBY_IO_READABLE) w32_events |= FD_READ | FD_ACCEPT | FD_CLOSE;
2247
+ if(rb_events & PG_RUBY_IO_WRITABLE) w32_events |= FD_WRITE | FD_CONNECT;
2248
+ if(rb_events & PG_RUBY_IO_PRIORITY) w32_events |= FD_OOB;
2257
2249
 
2258
2250
  for(;;) {
2259
2251
  if ( WSAEventSelect(_get_osfhandle(fptr->fd), hEvent, w32_events) == SOCKET_ERROR ) {
@@ -2336,7 +2328,7 @@ pg_rb_io_wait(VALUE io, VALUE events, VALUE timeout) {
2336
2328
  GetOpenFile((io), fptr);
2337
2329
  if( !NIL_P(timeout) ){
2338
2330
  waittime.tv_sec = (time_t)(NUM2DBL(timeout));
2339
- waittime.tv_usec = (time_t)(NUM2DBL(timeout) - (double)waittime.tv_sec);
2331
+ waittime.tv_usec = (time_t)((NUM2DBL(timeout) - (double)waittime.tv_sec) * 1e6);
2340
2332
  }
2341
2333
  res = rb_wait_for_single_fd(fptr->fd, NUM2UINT(events), NIL_P(timeout) ? NULL : &waittime);
2342
2334
 
@@ -2347,21 +2339,12 @@ pg_rb_io_wait(VALUE io, VALUE events, VALUE timeout) {
2347
2339
  static void *
2348
2340
  wait_socket_readable( VALUE self, struct timeval *ptimeout, void *(*is_readable)(PGconn *))
2349
2341
  {
2350
- VALUE socket_io;
2351
2342
  VALUE ret;
2352
2343
  void *retval;
2353
2344
  struct timeval aborttime={0,0}, currtime, waittime;
2354
2345
  VALUE wait_timeout = Qnil;
2355
2346
  PGconn *conn = pg_get_pgconn(self);
2356
2347
 
2357
- socket_io = pgconn_socket_io(self);
2358
-
2359
- /* Check for connection errors (PQisBusy is true on connection errors) */
2360
- if ( PQconsumeInput(conn) == 0 ) {
2361
- pgconn_close_socket_io(self);
2362
- rb_raise( rb_eConnectionBad, "PQconsumeInput() %s", PQerrorMessage(conn) );
2363
- }
2364
-
2365
2348
  if ( ptimeout ) {
2366
2349
  gettimeofday(&currtime, NULL);
2367
2350
  timeradd(&currtime, ptimeout, &aborttime);
@@ -2376,6 +2359,7 @@ wait_socket_readable( VALUE self, struct timeval *ptimeout, void *(*is_readable)
2376
2359
 
2377
2360
  /* Is the given timeout valid? */
2378
2361
  if( !ptimeout || (waittime.tv_sec >= 0 && waittime.tv_usec >= 0) ){
2362
+ VALUE socket_io = pgconn_socket_io(self);
2379
2363
  /* Wait for the socket to become readable before checking again */
2380
2364
  ret = pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE), wait_timeout);
2381
2365
  } else {
@@ -2988,7 +2972,7 @@ get_result_readable(PGconn *conn)
2988
2972
  * If +true+ is returned, +conn.is_busy+ will return +false+
2989
2973
  * and +conn.get_result+ will not block.
2990
2974
  */
2991
- static VALUE
2975
+ VALUE
2992
2976
  pgconn_block( int argc, VALUE *argv, VALUE self ) {
2993
2977
  struct timeval timeout;
2994
2978
  struct timeval *ptimeout = NULL;
@@ -3076,7 +3060,8 @@ pgconn_async_get_last_result(VALUE self)
3076
3060
  for(;;) {
3077
3061
  int status;
3078
3062
 
3079
- pgconn_block( 0, NULL, self ); /* wait for input (without blocking) before reading the last result */
3063
+ /* wait for input (without blocking) before reading each result */
3064
+ wait_socket_readable(self, NULL, get_result_readable);
3080
3065
 
3081
3066
  cur = gvl_PQgetResult(conn);
3082
3067
  if (cur == NULL)
data/ext/pg_result.c CHANGED
@@ -1383,7 +1383,7 @@ pgresult_type_map_get(VALUE self)
1383
1383
 
1384
1384
 
1385
1385
  static void
1386
- yield_hash(VALUE self, int ntuples, int nfields)
1386
+ yield_hash(VALUE self, int ntuples, int nfields, void *data)
1387
1387
  {
1388
1388
  int tuple_num;
1389
1389
  t_pg_result *this = pgresult_get_this(self);
@@ -1397,7 +1397,7 @@ yield_hash(VALUE self, int ntuples, int nfields)
1397
1397
  }
1398
1398
 
1399
1399
  static void
1400
- yield_array(VALUE self, int ntuples, int nfields)
1400
+ yield_array(VALUE self, int ntuples, int nfields, void *data)
1401
1401
  {
1402
1402
  int row;
1403
1403
  t_pg_result *this = pgresult_get_this(self);
@@ -1417,7 +1417,7 @@ yield_array(VALUE self, int ntuples, int nfields)
1417
1417
  }
1418
1418
 
1419
1419
  static void
1420
- yield_tuple(VALUE self, int ntuples, int nfields)
1420
+ yield_tuple(VALUE self, int ntuples, int nfields, void *data)
1421
1421
  {
1422
1422
  int tuple_num;
1423
1423
  t_pg_result *this = pgresult_get_this(self);
@@ -1436,8 +1436,9 @@ yield_tuple(VALUE self, int ntuples, int nfields)
1436
1436
  }
1437
1437
  }
1438
1438
 
1439
- static VALUE
1440
- pgresult_stream_any(VALUE self, void (*yielder)(VALUE, int, int))
1439
+ /* Non-static, and data pointer for use by sequel_pg */
1440
+ VALUE
1441
+ pgresult_stream_any(VALUE self, void (*yielder)(VALUE, int, int, void*), void* data)
1441
1442
  {
1442
1443
  t_pg_result *this;
1443
1444
  int nfields;
@@ -1465,7 +1466,12 @@ pgresult_stream_any(VALUE self, void (*yielder)(VALUE, int, int))
1465
1466
  pg_result_check( self );
1466
1467
  }
1467
1468
 
1468
- yielder( self, ntuples, nfields );
1469
+ yielder( self, ntuples, nfields, data );
1470
+
1471
+ if( gvl_PQisBusy(pgconn) ){
1472
+ /* wait for input (without blocking) before reading each result */
1473
+ pgconn_block( 0, NULL, this->connection );
1474
+ }
1469
1475
 
1470
1476
  pgresult = gvl_PQgetResult(pgconn);
1471
1477
  if( pgresult == NULL )
@@ -1516,7 +1522,7 @@ pgresult_stream_any(VALUE self, void (*yielder)(VALUE, int, int))
1516
1522
  static VALUE
1517
1523
  pgresult_stream_each(VALUE self)
1518
1524
  {
1519
- return pgresult_stream_any(self, yield_hash);
1525
+ return pgresult_stream_any(self, yield_hash, NULL);
1520
1526
  }
1521
1527
 
1522
1528
  /*
@@ -1532,7 +1538,7 @@ pgresult_stream_each(VALUE self)
1532
1538
  static VALUE
1533
1539
  pgresult_stream_each_row(VALUE self)
1534
1540
  {
1535
- return pgresult_stream_any(self, yield_array);
1541
+ return pgresult_stream_any(self, yield_array, NULL);
1536
1542
  }
1537
1543
 
1538
1544
  /*
@@ -1549,7 +1555,7 @@ pgresult_stream_each_tuple(VALUE self)
1549
1555
  /* allocate VALUEs that are shared between all streamed tuples */
1550
1556
  ensure_init_for_tuple(self);
1551
1557
 
1552
- return pgresult_stream_any(self, yield_tuple);
1558
+ return pgresult_stream_any(self, yield_tuple, NULL);
1553
1559
  }
1554
1560
 
1555
1561
  /*
data/ext/pg_tuple.c CHANGED
@@ -471,10 +471,7 @@ pg_tuple_dump(VALUE self)
471
471
  values = rb_ary_new4(this->num_fields, &this->values[0]);
472
472
  a = rb_ary_new3(2, field_names, values);
473
473
 
474
- if (FL_TEST(self, FL_EXIVAR)) {
475
- rb_copy_generic_ivar(a, self);
476
- FL_SET(a, FL_EXIVAR);
477
- }
474
+ rb_copy_generic_ivar(a, self);
478
475
 
479
476
  return a;
480
477
  }
@@ -542,10 +539,7 @@ pg_tuple_load(VALUE self, VALUE a)
542
539
 
543
540
  RTYPEDDATA_DATA(self) = this;
544
541
 
545
- if (FL_TEST(a, FL_EXIVAR)) {
546
- rb_copy_generic_ivar(self, a);
547
- FL_SET(self, FL_EXIVAR);
548
- }
542
+ rb_copy_generic_ivar(self, a);
549
543
 
550
544
  return self;
551
545
  }
@@ -76,6 +76,7 @@ pg_tmas_fit_to_copy_get( VALUE self )
76
76
  static VALUE
77
77
  pg_tmas_typecast_copy_get( t_typemap *p_typemap, VALUE field_str, int fieldno, int format, int enc_idx )
78
78
  {
79
+ rb_str_modify(field_str);
79
80
  if( format == 0 ){
80
81
  PG_ENCODING_SET_NOCHECK( field_str, enc_idx );
81
82
  } else {
@@ -150,10 +150,12 @@ pg_tmbc_typecast_copy_get( t_typemap *p_typemap, VALUE field_str, int fieldno, i
150
150
 
151
151
  /* Is it a pure String conversion? Then we can directly send field_str to the user. */
152
152
  if( dec_func == pg_text_dec_string ){
153
+ rb_str_modify(field_str);
153
154
  PG_ENCODING_SET_NOCHECK( field_str, enc_idx );
154
155
  return field_str;
155
156
  }
156
157
  if( dec_func == pg_bin_dec_bytea ){
158
+ rb_str_modify(field_str);
157
159
  PG_ENCODING_SET_NOCHECK( field_str, rb_ascii8bit_encindex() );
158
160
  return field_str;
159
161
  }
data/lib/2.5/pg_ext.so CHANGED
Binary file
data/lib/2.6/pg_ext.so CHANGED
Binary file
data/lib/2.7/pg_ext.so CHANGED
Binary file
data/lib/3.0/pg_ext.so CHANGED
Binary file
data/lib/3.1/pg_ext.so CHANGED
Binary file
data/lib/pg/connection.rb CHANGED
@@ -105,7 +105,7 @@ class PG::Connection
105
105
  end
106
106
  # extract "host1,host2" from "host1:5432,host2:5432"
107
107
  iopts[:host] = uri_match['hostports'].split(',', -1).map do |hostport|
108
- hostmatch = HOST_AND_PORT.match(hostport)
108
+ hostmatch = /\A#{HOST_AND_PORT}\z/.match(hostport)
109
109
  hostmatch['IPv6address'] || hostmatch['IPv4address'] || hostmatch['reg-name']&.gsub(/%(\h\h)/){ $1.hex.chr }
110
110
  end.join(',')
111
111
  oopts = {}
@@ -241,6 +241,7 @@ class PG::Connection
241
241
  # ["more", "data", "to", "copy"]
242
242
 
243
243
  def copy_data( sql, coder=nil )
244
+ raise PG::NotInBlockingMode, "copy_data can not be used in nonblocking mode" if nonblocking?
244
245
  res = exec( sql )
245
246
 
246
247
  case res.result_status
@@ -312,7 +313,7 @@ class PG::Connection
312
313
  exec "BEGIN"
313
314
  res = yield(self)
314
315
  rescue Exception
315
- cancel if transaction_status != PG::PQTRANS_IDLE
316
+ cancel if transaction_status == PG::PQTRANS_ACTIVE
316
317
  block
317
318
  exec "ROLLBACK"
318
319
  raise
@@ -385,7 +386,7 @@ class PG::Connection
385
386
  # If the optional code block is given, it will be passed <i>result</i> as an argument,
386
387
  # and the PG::Result object will automatically be cleared when the block terminates.
387
388
  # In this instance, <code>conn.exec</code> returns the value of the block.
388
- def get_result(*args)
389
+ def get_result
389
390
  block
390
391
  sync_get_result
391
392
  end
@@ -611,9 +612,6 @@ class PG::Connection
611
612
  alias async_cancel cancel
612
613
 
613
614
  private def async_connect_or_reset(poll_meth)
614
- # Now grab a reference to the underlying socket so we know when the connection is established
615
- socket = socket_io
616
-
617
615
  # Track the progress of the connection, waiting for the socket to become readable/writable before polling it
618
616
  poll_status = PG::PGRES_POLLING_WRITING
619
617
  until poll_status == PG::PGRES_POLLING_OK ||
@@ -622,18 +620,22 @@ class PG::Connection
622
620
  # If the socket needs to read, wait 'til it becomes readable to poll again
623
621
  case poll_status
624
622
  when PG::PGRES_POLLING_READING
625
- socket.wait_readable
623
+ socket_io.wait_readable
626
624
 
627
625
  # ...and the same for when the socket needs to write
628
626
  when PG::PGRES_POLLING_WRITING
629
- socket.wait_writable
627
+ socket_io.wait_writable
630
628
  end
631
629
 
632
630
  # Check to see if it's finished or failed yet
633
631
  poll_status = send( poll_meth )
634
632
  end
635
633
 
636
- raise(PG::ConnectionBad, error_message) unless status == PG::CONNECTION_OK
634
+ unless status == PG::CONNECTION_OK
635
+ msg = error_message
636
+ finish
637
+ raise PG::ConnectionBad, msg
638
+ end
637
639
 
638
640
  # Set connection to nonblocking to handle all blocking states in ruby.
639
641
  # That way a fiber scheduler is able to handle IO requests.
data/lib/pg/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module PG
2
2
  # Library version
3
- VERSION = '1.3.0'
3
+ VERSION = '1.3.4'
4
4
  end
data/lib/pg.rb CHANGED
@@ -53,12 +53,14 @@ module PG
53
53
 
54
54
  class NotAllCopyDataRetrieved < PG::Error
55
55
  end
56
+ class NotInBlockingMode < PG::Error
57
+ end
56
58
 
57
- ### Get the PG library version. If +include_buildnum+ is +true+, include the build ID.
58
- def self::version_string( include_buildnum=false )
59
- vstring = "%s %s" % [ self.name, VERSION ]
60
- vstring << " (build %s)" % [ REVISION[/: ([[:xdigit:]]+)/, 1] || '0' ] if include_buildnum
61
- return vstring
59
+ # Get the PG library version.
60
+ #
61
+ # +include_buildnum+ is no longer used and any value passed will be ignored.
62
+ def self::version_string( include_buildnum=nil )
63
+ return "%s %s" % [ self.name, VERSION ]
62
64
  end
63
65
 
64
66
 
Binary file
File without changes
@@ -0,0 +1,46 @@
1
+ # This source code is borrowed from:
2
+ # https://github.com/oneclick/rubyinstaller2/blob/b3dcbf69f131e44c78ea3a1c5e0041c223f266ce/lib/ruby_installer/build/utils.rb#L104-L144
3
+
4
+ module TaskExtension
5
+ # Extend rake's file task to be defined only once and to check the expected file is indeed generated
6
+ #
7
+ # The same as #task, but for #file.
8
+ # In addition this file task raises an error, if the file that is expected to be generated is not present after the block was executed.
9
+ def file(name, *args, &block)
10
+ task_once(name, block) do
11
+ super(name, *args) do |ta|
12
+ block.call(ta).tap do
13
+ raise "file #{ta.name} is missing after task executed" unless File.exist?(ta.name)
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # Extend rake's task definition to be defined only once, even if called several times
20
+ #
21
+ # This allows to define common tasks next to specific tasks.
22
+ # It is expected that any variation of the task's block is reflected in the task name or namespace.
23
+ # If the task name is identical, the task block is executed only once, even if the file task definition is executed twice.
24
+ def task(name, *args, &block)
25
+ task_once(name, block) do
26
+ super
27
+ end
28
+ end
29
+
30
+ private def task_once(name, block)
31
+ name = name.keys.first if name.is_a?(Hash)
32
+ if block &&
33
+ Rake::Task.task_defined?(name) &&
34
+ Rake::Task[name].instance_variable_get('@task_block_location') == block.source_location
35
+ # task is already defined for this target and the same block
36
+ # So skip double definition of the same action
37
+ Rake::Task[name]
38
+ elsif block
39
+ yield.tap do
40
+ Rake::Task[name].instance_variable_set('@task_block_location', block.source_location)
41
+ end
42
+ else
43
+ yield
44
+ end
45
+ end
46
+ end
File without changes
data/sample/async_api.rb CHANGED
@@ -27,10 +27,6 @@ conn = PG::Connection.connect_start( :dbname => 'test' ) or
27
27
  abort "Connection failed: %s" % [ conn.error_message ] if
28
28
  conn.status == PG::CONNECTION_BAD
29
29
 
30
- # Now grab a reference to the underlying socket so we know when the
31
- # connection is established
32
- socket = conn.socket_io
33
-
34
30
  # Track the progress of the connection, waiting for the socket to become readable/writable
35
31
  # before polling it
36
32
  poll_status = PG::PGRES_POLLING_WRITING
@@ -41,13 +37,13 @@ until poll_status == PG::PGRES_POLLING_OK ||
41
37
  case poll_status
42
38
  when PG::PGRES_POLLING_READING
43
39
  output_progress " waiting for socket to become readable"
44
- select( [socket], nil, nil, TIMEOUT ) or
40
+ select( [conn.socket_io], nil, nil, TIMEOUT ) or
45
41
  raise "Asynchronous connection timed out!"
46
42
 
47
43
  # ...and the same for when the socket needs to write
48
44
  when PG::PGRES_POLLING_WRITING
49
45
  output_progress " waiting for socket to become writable"
50
- select( nil, [socket], nil, TIMEOUT ) or
46
+ select( nil, [conn.socket_io], nil, TIMEOUT ) or
51
47
  raise "Asynchronous connection timed out!"
52
48
  end
53
49
 
@@ -85,7 +81,7 @@ loop do
85
81
  # Buffer any incoming data on the socket until a full result is ready.
86
82
  conn.consume_input
87
83
  while conn.is_busy
88
- select( [socket], nil, nil, TIMEOUT ) or
84
+ select( [conn.socket_io], nil, nil, TIMEOUT ) or
89
85
  raise "Timeout waiting for query response."
90
86
  conn.consume_input
91
87
  end
File without changes
File without changes
data/sample/check_conn.rb CHANGED
File without changes
data/sample/copydata.rb CHANGED
File without changes
data/sample/copyfrom.rb CHANGED
File without changes
data/sample/copyto.rb CHANGED
File without changes
data/sample/cursor.rb CHANGED
File without changes
File without changes
data/sample/issue-119.rb CHANGED
File without changes
data/sample/losample.rb CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
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.4
5
5
  platform: x86-mingw32
6
6
  authors:
7
7
  - Michael Granger
@@ -11,30 +11,32 @@ bindir: bin
11
11
  cert_chain:
12
12
  - |
13
13
  -----BEGIN CERTIFICATE-----
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
14
+ MIIETTCCArWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
15
+ L0RDPWdyZWl6LXJlaW5zZG9yZi9EQz1kZTAeFw0yMjAyMTQxMzMwNTZaFw0yMzAy
16
+ MTQxMzMwNTZaMCgxJjAkBgNVBAMMHWxhcnMvREM9Z3JlaXotcmVpbnNkb3JmL0RD
17
+ PWRlMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAwum6Y1KznfpzXOT/
18
+ mZgJTBbxZuuZF49Fq3K0WA67YBzNlDv95qzSp7V/7Ek3NCcnT7G+2kSuhNo1FhdN
19
+ eSDO/moYebZNAcu3iqLsuzuULXPLuoU0GsMnVMqV9DZPh7cQHE5EBZ7hlzDBK7k/
20
+ 8nBMvR0mHo77kIkapHc26UzVq/G0nKLfDsIHXVylto3PjzOumjG6GhmFN4r3cP6e
21
+ SDfl1FSeRYVpt4kmQULz/zdSaOH3AjAq7PM2Z91iGwQvoUXMANH2v89OWjQO/NHe
22
+ JMNDFsmHK/6Ji4Kk48Z3TyscHQnipAID5GhS1oD21/WePdj7GhmbF5gBzkV5uepd
23
+ eJQPgWGwrQW/Z2oPjRuJrRofzWfrMWqbOahj9uth6WSxhNexUtbjk6P8emmXOJi5
24
+ chQPnWX+N3Gj+jjYxqTFdwT7Mj3pv1VHa+aNUbqSPpvJeDyxRIuo9hvzDaBHb/Cg
25
+ 9qRVcm8a96n4t7y2lrX1oookY6bkBaxWOMtWlqIprq8JZXM9AgMBAAGjgYEwfzAJ
26
+ BgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUOIdbSMr3VFrTCO9/cTM0
27
+ 0exHzBcwIgYDVR0RBBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwIgYDVR0S
28
+ BBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwDQYJKoZIhvcNAQELBQADggGB
29
+ AFWP7F/y3Oq3NgrqUOnjKOeDaBa7AqNhHS+PZg+C90lnJzMgOs4KKgZYxqSQVSab
30
+ SCEmzIO/StkXY4NpJ4fYLrHemf/fJy1wPyu+fNdp5SEEUwEo+2toRFlzTe4u4LdS
31
+ QC636nPPTMt8H3xz2wf/lUIUeo2Qc95Qt2BQM465ibbG9kmA3c7Sopx6yOabYOAl
32
+ KPRbOSEPiWYcF9Suuz8Gdf8jxEtPlnZiwRvnYJ+IHMq3XQCJWPpMzdDMbtlgHbXE
33
+ vq1zOTLMSYAS0UB3uionR4yo1hLz60odwkCm7qf0o2Ci/5OjtB0a89VuyqRU2vUJ
34
+ QH95WBjDJ6lCCW7J0mrMPnJQSUFTmufsU6jOChvPaCeAzW1YwrsP/YKnvwueG7ip
35
+ VOdW6RitjtFxhS7evRL0201+KUvLz12zZWWjOcujlQs64QprxOtiv/MiisKb1Ng+
36
+ oL1mUdzB8KrZL4/WbG5YNX6UTtJbIOu9qEFbBAy4/jtIkJX+dlNoFwd4GXQW1YNO
37
+ nA==
36
38
  -----END CERTIFICATE-----
37
- date: 2022-01-23 00:00:00.000000000 Z
39
+ date: 2022-03-10 00:00:00.000000000 Z
38
40
  dependencies: []
39
41
  description: Pg is the Ruby interface to the PostgreSQL RDBMS. It works with PostgreSQL
40
42
  9.3 and later.
@@ -71,6 +73,7 @@ files:
71
73
  - Rakefile
72
74
  - Rakefile.cross
73
75
  - certs/ged.pem
76
+ - certs/larskanis-2022.pem
74
77
  - ext/errorcodes.def
75
78
  - ext/errorcodes.rb
76
79
  - ext/errorcodes.txt
@@ -136,6 +139,7 @@ files:
136
139
  - misc/ruby-pg/Rakefile
137
140
  - misc/ruby-pg/lib/ruby/pg.rb
138
141
  - pg.gemspec
142
+ - rakelib/task_extension.rb
139
143
  - sample/array_insert.rb
140
144
  - sample/async_api.rb
141
145
  - sample/async_copyto.rb
metadata.gz.sig CHANGED
Binary file