pg 1.3.0-x64-mingw-ucrt → 1.3.4-x64-mingw-ucrt
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/.appveyor.yml +1 -1
- data/.github/workflows/binary-gems.yml +3 -3
- data/.github/workflows/source-gem.yml +5 -6
- data/History.rdoc +55 -1
- data/Rakefile.cross +3 -1
- data/certs/larskanis-2022.pem +26 -0
- data/ext/errorcodes.rb +0 -0
- data/ext/extconf.rb +13 -10
- data/ext/pg.h +1 -0
- data/ext/pg_connection.c +11 -26
- data/ext/pg_result.c +15 -9
- data/ext/pg_tuple.c +2 -8
- data/ext/pg_type_map_all_strings.c +1 -0
- data/ext/pg_type_map_by_column.c +2 -0
- data/lib/3.1/pg_ext.so +0 -0
- data/lib/pg/connection.rb +11 -9
- data/lib/pg/version.rb +1 -1
- data/lib/pg.rb +7 -5
- data/lib/x64-mingw-ucrt/libpq.dll +0 -0
- data/misc/openssl-pg-segfault.rb +0 -0
- data/rakelib/task_extension.rb +46 -0
- data/sample/array_insert.rb +0 -0
- data/sample/async_api.rb +3 -7
- data/sample/async_copyto.rb +0 -0
- data/sample/async_mixed.rb +0 -0
- data/sample/check_conn.rb +0 -0
- data/sample/copydata.rb +0 -0
- data/sample/copyfrom.rb +0 -0
- data/sample/copyto.rb +0 -0
- data/sample/cursor.rb +0 -0
- data/sample/disk_usage_report.rb +0 -0
- data/sample/issue-119.rb +0 -0
- data/sample/losample.rb +0 -0
- data/sample/minimal-testcase.rb +0 -0
- data/sample/notify_wait.rb +0 -0
- data/sample/pg_statistics.rb +0 -0
- data/sample/replication_monitor.rb +0 -0
- data/sample/test_binary_values.rb +0 -0
- data/sample/wal_shipper.rb +0 -0
- data/sample/warehouse_partitions.rb +0 -0
- data.tar.gz.sig +0 -0
- metadata +29 -25
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac325d3ce81fa0ce0f2fd03cd42ed77283da2cb8bb62c3d84e018ff71e384f68
|
4
|
+
data.tar.gz: a777b7b738921a3e022d29d843dec3e0dee48c152944687adb12652e515e2edf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1eb0261222d4fdd79ea35ae1c08bb1ab7bbdc0c247dd338b22eef5aca9bb62a86b7b203c75d3515d92513b86bb6949a1c9e6035df3009b56c9516b7febbd5c2d
|
7
|
+
data.tar.gz: 789053bd4aba6588628ed5f1f3c7ee87eadae9ad913d516f93f6e3d13a7ecfa232a16e57de4f77ad9a870a3414fcd46332f4e73104443dc850ef7e0bf64dc692
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/.appveyor.yml
CHANGED
@@ -45,10 +45,10 @@ jobs:
|
|
45
45
|
include:
|
46
46
|
- ruby: "3.1"
|
47
47
|
platform: "x64-mingw-ucrt"
|
48
|
-
PGVERSION: 14.
|
48
|
+
PGVERSION: 14.2-1-windows-x64
|
49
49
|
- ruby: "2.5"
|
50
50
|
platform: "x64-mingw32"
|
51
|
-
PGVERSION: 10.
|
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:
|
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.
|
34
|
+
PGVERSION: 14.2-1-windows-x64
|
35
35
|
PGVER: "14"
|
36
36
|
- os: windows
|
37
37
|
ruby: "2.5"
|
38
|
-
PGVERSION: 9.
|
39
|
-
PGVER: "9.
|
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.
|
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:
|
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.
|
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 =
|
41
|
-
libdir =
|
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/ ?
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
2252
|
-
|
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
|
-
|
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
|
-
|
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
|
1440
|
-
|
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
|
-
|
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
|
-
|
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 {
|
data/ext/pg_type_map_by_column.c
CHANGED
@@ -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/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
|
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
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
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
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
return
|
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
|
data/misc/openssl-pg-segfault.rb
CHANGED
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
|
data/sample/array_insert.rb
CHANGED
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( [
|
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, [
|
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( [
|
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
|
data/sample/async_copyto.rb
CHANGED
File without changes
|
data/sample/async_mixed.rb
CHANGED
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
|
data/sample/disk_usage_report.rb
CHANGED
File without changes
|
data/sample/issue-119.rb
CHANGED
File without changes
|
data/sample/losample.rb
CHANGED
File without changes
|
data/sample/minimal-testcase.rb
CHANGED
File without changes
|
data/sample/notify_wait.rb
CHANGED
File without changes
|
data/sample/pg_statistics.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
data/sample/wal_shipper.rb
CHANGED
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.
|
4
|
+
version: 1.3.4
|
5
5
|
platform: x64-mingw-ucrt
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -11,30 +11,32 @@ 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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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-
|
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
|
@@ -132,6 +135,7 @@ files:
|
|
132
135
|
- misc/ruby-pg/Rakefile
|
133
136
|
- misc/ruby-pg/lib/ruby/pg.rb
|
134
137
|
- pg.gemspec
|
138
|
+
- rakelib/task_extension.rb
|
135
139
|
- sample/array_insert.rb
|
136
140
|
- sample/async_api.rb
|
137
141
|
- sample/async_copyto.rb
|
@@ -169,7 +173,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
173
|
requirements:
|
170
174
|
- - ">="
|
171
175
|
- !ruby/object:Gem::Version
|
172
|
-
version: '
|
176
|
+
version: '2.5'
|
173
177
|
- - "<"
|
174
178
|
- !ruby/object:Gem::Version
|
175
179
|
version: 3.2.dev
|
metadata.gz.sig
CHANGED
Binary file
|