pg 1.3.0.rc2-x86-mingw32 → 1.3.2-x86-mingw32
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 -2
- data/.github/workflows/source-gem.yml +3 -3
- data/History.rdoc +36 -3
- data/Rakefile.cross +1 -1
- data/certs/ged.pem +12 -12
- data/certs/larskanis-2022.pem +26 -0
- data/ext/extconf.rb +10 -6
- data/ext/pg_connection.c +122 -15
- data/ext/pg_record_coder.c +1 -1
- data/ext/pg_type_map_all_strings.c +1 -0
- data/ext/pg_type_map_by_column.c +2 -0
- data/lib/2.5/pg_ext.so +0 -0
- data/lib/2.6/pg_ext.so +0 -0
- data/lib/2.7/pg_ext.so +0 -0
- data/lib/3.0/pg_ext.so +0 -0
- data/lib/3.1/pg_ext.so +0 -0
- data/lib/pg/connection.rb +12 -4
- data/lib/pg/version.rb +1 -1
- data/lib/pg.rb +9 -7
- data/lib/x86-mingw32/libpq.dll +0 -0
- data.tar.gz.sig +0 -0
- metadata +27 -26
- 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: 3b2d524251b3c5c9dc707282858b33d6a58af1343e665022b215a44779416ff9
|
4
|
+
data.tar.gz: 76ca33a83b6eb375fa8929c5043685db3a67cbdf90bb944e70be2b9a81e56fe6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85993b177e54786984bbe8ab450dabb187526511ecc9667514692bbb037f562a31b3366931aa5a9c6f46630975c380de23a0413214c46dd19e16d4ff21cd326a
|
7
|
+
data.tar.gz: 1ec89aad7c3823abf649501dd9ad66748bdff8826a04163d5ce9c74b60999be747acdd60aa9a334cdad20f484d210544594f2ed4dcfee549d754a5bd4b622ba0
|
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:
|
@@ -79,6 +79,7 @@ jobs:
|
|
79
79
|
echo "PGUSER=$env:USERNAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
80
80
|
echo "PGPASSWORD=" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
81
81
|
|
82
|
+
- run: gem update --system
|
82
83
|
- run: bundle install
|
83
84
|
- run: gem install --local pg-*${{ matrix.platform }}.gem --verbose
|
84
85
|
- name: Run specs
|
@@ -31,7 +31,7 @@ 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"
|
@@ -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
|
@@ -110,10 +110,10 @@ jobs:
|
|
110
110
|
unzip postgresql-$PGVERSION-binaries.zip && \
|
111
111
|
echo `pwd`/pgsql/bin >> $GITHUB_PATH
|
112
112
|
|
113
|
+
- run: gem update --system
|
113
114
|
- run: bundle install
|
114
115
|
|
115
116
|
- run: gem install --local *.gem --verbose
|
116
|
-
continue-on-error: ${{ matrix.ruby == 'truffleruby-head' }}
|
117
117
|
|
118
118
|
- name: Run specs
|
119
119
|
continue-on-error: ${{ matrix.ruby == 'truffleruby-head' }}
|
data/History.rdoc
CHANGED
@@ -1,4 +1,33 @@
|
|
1
|
-
== v1.3.
|
1
|
+
== v1.3.2 [2022-02-14] Lars Kanis <lars@greiz-reinsdorf.de>
|
2
|
+
|
3
|
+
Bugfixes:
|
4
|
+
|
5
|
+
- Cancel only active query after failing transaction. #430
|
6
|
+
This avoids an incompatibility with pgbouncer since pg-1.3.0.
|
7
|
+
- Fix String objects with non-applied encoding when using COPY or record decoders. #427
|
8
|
+
- Update Windows fat binary gem to PostgreSQL-14.2.
|
9
|
+
|
10
|
+
Enhancements:
|
11
|
+
|
12
|
+
- Improve extconf.rb checks to reduces the number of compiler calls.
|
13
|
+
- Add a check for PGRES_PIPELINE_SYNC, to make sure the library version and the header files are PostgreSQL-14+. #429
|
14
|
+
|
15
|
+
|
16
|
+
== v1.3.1 [2022-02-01] Michael Granger <ged@FaerieMUD.org>
|
17
|
+
|
18
|
+
Bugfixes:
|
19
|
+
|
20
|
+
- Fix wrong handling of socket writability on Windows introduced in #417.
|
21
|
+
This caused starvation in conn.put_copy_data.
|
22
|
+
- Fix error in PG.version_string(true). #419
|
23
|
+
- Fix a regression in pg 1.3.0 where Ruby 2.x busy-looping any fractional seconds for every wait. #420
|
24
|
+
|
25
|
+
Enhancements:
|
26
|
+
|
27
|
+
- Raise an error when conn.copy_data is used in nonblocking mode.
|
28
|
+
|
29
|
+
|
30
|
+
== v1.3.0 [2022-01-20] Michael Granger <ged@FaerieMUD.org>
|
2
31
|
|
3
32
|
Install Enhancements:
|
4
33
|
- Print some install help if libpq wasn't found. #396
|
@@ -27,6 +56,8 @@ API Enhancements:
|
|
27
56
|
- Make discard_results scheduler friendly
|
28
57
|
- Do all socket waiting through the conn.socket_io object.
|
29
58
|
- Avoid PG.connect blocking while address resolution by automatically providing the +hostaddr+ parameter.
|
59
|
+
- On Windows Fiber.scheduler support requires Ruby-3.1+.
|
60
|
+
It is also only partly usable since may ruby IO methods are not yet scheduler aware on Windows.
|
30
61
|
- Add support for pipeline mode of PostgreSQL-14. #401
|
31
62
|
- Allow specification of multiple hosts in PostgreSQL URI. #387
|
32
63
|
- Add new method conn.backend_key - used to implement our own cancel method.
|
@@ -46,8 +77,9 @@ Other Enhancements:
|
|
46
77
|
- Add PG::CONNECTION_* constants for conn.status of newer PostgreSQL versions.
|
47
78
|
- Add better support for logical replication. #339
|
48
79
|
- Change conn.socket_io to read+write mode and to a BasicSocket object instead of IO.
|
49
|
-
- Use rb_io_wait() and the conn.socket_io object if available
|
50
|
-
Fall back to rb_wait_for_single_fd() on ruby < 3.0
|
80
|
+
- Use rb_io_wait() and the conn.socket_io object if available for better compatibility to Fiber.scheduler .
|
81
|
+
Fall back to rb_wait_for_single_fd() on ruby < 3.0.
|
82
|
+
- On Windows use a specialized wait function as a workaround for very poor performance of rb_io_wait(). #416
|
51
83
|
|
52
84
|
Bugfixes:
|
53
85
|
- Release GVL while calling PQping which is a blocking method, but it didn't release GVL so far.
|
@@ -62,6 +94,7 @@ Deprecated:
|
|
62
94
|
Removed:
|
63
95
|
- Remove support of ruby-2.2, 2.3 and 2.4. Minimum is ruby-2.5 now.
|
64
96
|
- Remove support for PostgreSQL-9.2. Minimum is PostgreSQL-9.3 now.
|
97
|
+
- Remove constant PG::REVISION, which was broken since pg-1.1.4.
|
65
98
|
|
66
99
|
Repository:
|
67
100
|
- Replace Hoe by Bundler for gem packaging
|
data/Rakefile.cross
CHANGED
@@ -30,7 +30,7 @@ class CrossLibrary < OpenStruct
|
|
30
30
|
|
31
31
|
# Cross-compilation constants
|
32
32
|
self.openssl_version = ENV['OPENSSL_VERSION'] || '1.1.1m'
|
33
|
-
self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '14.
|
33
|
+
self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '14.2'
|
34
34
|
|
35
35
|
# Check if symlinks work in the current working directory.
|
36
36
|
# This fails, if rake-compiler-dock is running on a Windows box.
|
data/certs/ged.pem
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
MIID+
|
3
|
-
|
4
|
-
|
2
|
+
MIID+DCCAmCgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
|
3
|
+
REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMjAxMDcyMzU4MTRaFw0yMzAxMDcyMzU4
|
4
|
+
MTRaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
|
5
5
|
hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
|
6
6
|
L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
|
7
7
|
M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
|
@@ -12,13 +12,13 @@ dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
|
|
12
12
|
ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
|
13
13
|
N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
|
14
14
|
VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
15
|
+
9w0BAQsFAAOCAYEASrm1AbEoxACZ9WXJH3R5axV3U0CA4xaETlL2YT+2nOfVBMQ9
|
16
|
+
0ZlkPx6j4ghKJgAIi1TMfDM2JyPJsppQh8tiNccDjWc62UZRY/dq26cMqf/lcI+a
|
17
|
+
6YBuEYvzZfearwVs8tHnXtwYV3WSCoCOQaB+nq2lA1O+nkKNl41WOsVbNama5jx3
|
18
|
+
8cQtVSEEmZy6jIDJ8c5TmBJ7BQUDEUEWA/A3V42Xyctoj7DvUXWE0lP+X6ypAVSr
|
19
|
+
lFh3TS64D7NTvxkmg7natUoCvobl6kGl4yMaqE4YRTlfuzhpf91TSOntClqrAOsS
|
20
|
+
K1s56WndQj3IoBocdY9mQhDZLtLHofSkymoP8btBlj5SsN24TiF0VMSZlctSCYZg
|
21
|
+
GKyHim/MMlIfGOWsgfioq5jzwmql7W4CDubbb8Lkg70v+hN2E/MnNVAcNE3gyaGc
|
22
|
+
P5YP5BAbNW+gvd3QHRiWTTuhgHrdDnGdXg93N2M5KHn1ug8BtPLQwlcFwEpKnlLn
|
23
|
+
btEP+7EplFuoiMfd
|
24
24
|
-----END CERTIFICATE-----
|
@@ -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/extconf.rb
CHANGED
@@ -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
|
@@ -155,6 +158,7 @@ have_func 'rb_io_wait' # since ruby-3.0
|
|
155
158
|
# unistd.h confilicts with ruby/win32.h when cross compiling for win32 and ruby 1.9.1
|
156
159
|
have_header 'unistd.h'
|
157
160
|
have_header 'inttypes.h'
|
161
|
+
have_header('ruby/fiber/scheduler.h') if RUBY_PLATFORM=~/mingw|mswin/
|
158
162
|
|
159
163
|
checking_for "C99 variable length arrays" do
|
160
164
|
$defs.push( "-DHAVE_VARIABLE_LENGTH_ARRAYS" ) if try_compile('void test_vla(int l){ int vla[l]; }')
|
data/ext/pg_connection.c
CHANGED
@@ -968,8 +968,8 @@ static VALUE pgconn_sync_exec_params( int, VALUE *, VALUE );
|
|
968
968
|
* However #async_exec has two advantages:
|
969
969
|
*
|
970
970
|
* 1. #async_exec can be aborted by signals (like Ctrl-C), while #exec blocks signal processing until the query is answered.
|
971
|
-
* 2. Ruby VM gets notified about IO blocked operations.
|
972
|
-
*
|
971
|
+
* 2. Ruby VM gets notified about IO blocked operations and can pass them through <tt>Fiber.scheduler</tt>.
|
972
|
+
* So only <tt>async_*</tt> methods are compatible to event based schedulers like the async gem.
|
973
973
|
*/
|
974
974
|
static VALUE
|
975
975
|
pgconn_sync_exec(int argc, VALUE *argv, VALUE self)
|
@@ -2207,18 +2207,124 @@ pgconn_notifies(VALUE self)
|
|
2207
2207
|
return hash;
|
2208
2208
|
}
|
2209
2209
|
|
2210
|
+
#if defined(_WIN32)
|
2211
|
+
|
2212
|
+
/* We use a specialized implementation of rb_io_wait() on Windows.
|
2213
|
+
* This is because rb_io_wait() and rb_wait_for_single_fd() are very slow on Windows.
|
2214
|
+
*/
|
2215
|
+
|
2216
|
+
#if defined(HAVE_RUBY_FIBER_SCHEDULER_H)
|
2217
|
+
#include <ruby/fiber/scheduler.h>
|
2218
|
+
#endif
|
2219
|
+
|
2220
|
+
typedef enum {
|
2221
|
+
PG_RUBY_IO_READABLE = RB_WAITFD_IN,
|
2222
|
+
PG_RUBY_IO_WRITABLE = RB_WAITFD_OUT,
|
2223
|
+
PG_RUBY_IO_PRIORITY = RB_WAITFD_PRI,
|
2224
|
+
} pg_rb_io_event_t;
|
2225
|
+
|
2226
|
+
int rb_w32_wait_events( HANDLE *events, int num, DWORD timeout );
|
2227
|
+
|
2228
|
+
static VALUE
|
2229
|
+
pg_rb_thread_io_wait(VALUE io, VALUE events, VALUE timeout) {
|
2230
|
+
rb_io_t *fptr;
|
2231
|
+
struct timeval ptimeout;
|
2232
|
+
|
2233
|
+
struct timeval aborttime={0,0}, currtime, waittime;
|
2234
|
+
DWORD timeout_milisec = INFINITE;
|
2235
|
+
HANDLE hEvent = WSACreateEvent();
|
2236
|
+
|
2237
|
+
long rb_events = NUM2UINT(events);
|
2238
|
+
long w32_events = 0;
|
2239
|
+
DWORD wait_ret;
|
2240
|
+
|
2241
|
+
GetOpenFile((io), fptr);
|
2242
|
+
if( !NIL_P(timeout) ){
|
2243
|
+
ptimeout.tv_sec = (time_t)(NUM2DBL(timeout));
|
2244
|
+
ptimeout.tv_usec = (time_t)((NUM2DBL(timeout) - (double)ptimeout.tv_sec) * 1e6);
|
2245
|
+
|
2246
|
+
gettimeofday(&currtime, NULL);
|
2247
|
+
timeradd(&currtime, &ptimeout, &aborttime);
|
2248
|
+
}
|
2249
|
+
|
2250
|
+
if(rb_events & PG_RUBY_IO_READABLE) w32_events |= FD_READ | FD_ACCEPT | FD_CLOSE;
|
2251
|
+
if(rb_events & PG_RUBY_IO_WRITABLE) w32_events |= FD_WRITE | FD_CONNECT;
|
2252
|
+
if(rb_events & PG_RUBY_IO_PRIORITY) w32_events |= FD_OOB;
|
2253
|
+
|
2254
|
+
for(;;) {
|
2255
|
+
if ( WSAEventSelect(_get_osfhandle(fptr->fd), hEvent, w32_events) == SOCKET_ERROR ) {
|
2256
|
+
WSACloseEvent( hEvent );
|
2257
|
+
rb_raise( rb_eConnectionBad, "WSAEventSelect socket error: %d", WSAGetLastError() );
|
2258
|
+
}
|
2259
|
+
|
2260
|
+
if ( !NIL_P(timeout) ) {
|
2261
|
+
gettimeofday(&currtime, NULL);
|
2262
|
+
timersub(&aborttime, &currtime, &waittime);
|
2263
|
+
timeout_milisec = (DWORD)( waittime.tv_sec * 1e3 + waittime.tv_usec / 1e3 );
|
2264
|
+
}
|
2265
|
+
|
2266
|
+
if( NIL_P(timeout) || (waittime.tv_sec >= 0 && waittime.tv_usec >= 0) ){
|
2267
|
+
/* Wait for the socket to become readable before checking again */
|
2268
|
+
wait_ret = rb_w32_wait_events( &hEvent, 1, timeout_milisec );
|
2269
|
+
} else {
|
2270
|
+
wait_ret = WAIT_TIMEOUT;
|
2271
|
+
}
|
2272
|
+
|
2273
|
+
if ( wait_ret == WAIT_TIMEOUT ) {
|
2274
|
+
WSACloseEvent( hEvent );
|
2275
|
+
return UINT2NUM(0);
|
2276
|
+
} else if ( wait_ret == WAIT_OBJECT_0 ) {
|
2277
|
+
WSACloseEvent( hEvent );
|
2278
|
+
/* The event we were waiting for. */
|
2279
|
+
return UINT2NUM(rb_events);
|
2280
|
+
} else if ( wait_ret == WAIT_OBJECT_0 + 1) {
|
2281
|
+
/* This indicates interruption from timer thread, GC, exception
|
2282
|
+
* from other threads etc... */
|
2283
|
+
rb_thread_check_ints();
|
2284
|
+
} else if ( wait_ret == WAIT_FAILED ) {
|
2285
|
+
WSACloseEvent( hEvent );
|
2286
|
+
rb_raise( rb_eConnectionBad, "Wait on socket error (WaitForMultipleObjects): %lu", GetLastError() );
|
2287
|
+
} else {
|
2288
|
+
WSACloseEvent( hEvent );
|
2289
|
+
rb_raise( rb_eConnectionBad, "Wait on socket abandoned (WaitForMultipleObjects)" );
|
2290
|
+
}
|
2291
|
+
}
|
2292
|
+
}
|
2293
|
+
|
2294
|
+
static VALUE
|
2295
|
+
pg_rb_io_wait(VALUE io, VALUE events, VALUE timeout) {
|
2296
|
+
#if defined(HAVE_RUBY_FIBER_SCHEDULER_H)
|
2297
|
+
/* We don't support Fiber.scheduler on Windows ruby-3.0 because there is no fast way to check whether a scheduler is active.
|
2298
|
+
* Fortunatelly ruby-3.1 offers a C-API for it.
|
2299
|
+
*/
|
2300
|
+
VALUE scheduler = rb_fiber_scheduler_current();
|
2301
|
+
|
2302
|
+
if (!NIL_P(scheduler)) {
|
2303
|
+
return rb_io_wait(io, events, timeout);
|
2304
|
+
}
|
2305
|
+
#endif
|
2306
|
+
return pg_rb_thread_io_wait(io, events, timeout);
|
2307
|
+
}
|
2308
|
+
|
2309
|
+
#elif defined(HAVE_RB_IO_WAIT)
|
2310
|
+
|
2311
|
+
/* Use our own function and constants names, to avoid conflicts with truffleruby-head on its road to ruby-3.0 compatibility. */
|
2312
|
+
#define pg_rb_io_wait rb_io_wait
|
2313
|
+
#define PG_RUBY_IO_READABLE RUBY_IO_READABLE
|
2314
|
+
#define PG_RUBY_IO_WRITABLE RUBY_IO_WRITABLE
|
2315
|
+
#define PG_RUBY_IO_PRIORITY RUBY_IO_PRIORITY
|
2210
2316
|
|
2211
|
-
#
|
2317
|
+
#else
|
2212
2318
|
/* For compat with ruby < 3.0 */
|
2213
2319
|
|
2214
2320
|
typedef enum {
|
2215
|
-
|
2216
|
-
|
2217
|
-
|
2218
|
-
}
|
2321
|
+
PG_RUBY_IO_READABLE = RB_WAITFD_IN,
|
2322
|
+
PG_RUBY_IO_WRITABLE = RB_WAITFD_OUT,
|
2323
|
+
PG_RUBY_IO_PRIORITY = RB_WAITFD_PRI,
|
2324
|
+
} pg_rb_io_event_t;
|
2219
2325
|
|
2220
2326
|
static VALUE
|
2221
|
-
|
2327
|
+
pg_rb_io_wait(VALUE io, VALUE events, VALUE timeout) {
|
2222
2328
|
rb_io_t *fptr;
|
2223
2329
|
struct timeval waittime;
|
2224
2330
|
int res;
|
@@ -2226,7 +2332,7 @@ rb_io_wait(VALUE io, VALUE events, VALUE timeout) {
|
|
2226
2332
|
GetOpenFile((io), fptr);
|
2227
2333
|
if( !NIL_P(timeout) ){
|
2228
2334
|
waittime.tv_sec = (time_t)(NUM2DBL(timeout));
|
2229
|
-
waittime.tv_usec = (time_t)(NUM2DBL(timeout) - (double)waittime.tv_sec);
|
2335
|
+
waittime.tv_usec = (time_t)((NUM2DBL(timeout) - (double)waittime.tv_sec) * 1e6);
|
2230
2336
|
}
|
2231
2337
|
res = rb_wait_for_single_fd(fptr->fd, NUM2UINT(events), NIL_P(timeout) ? NULL : &waittime);
|
2232
2338
|
|
@@ -2267,7 +2373,7 @@ wait_socket_readable( VALUE self, struct timeval *ptimeout, void *(*is_readable)
|
|
2267
2373
|
/* Is the given timeout valid? */
|
2268
2374
|
if( !ptimeout || (waittime.tv_sec >= 0 && waittime.tv_usec >= 0) ){
|
2269
2375
|
/* Wait for the socket to become readable before checking again */
|
2270
|
-
ret =
|
2376
|
+
ret = pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE), wait_timeout);
|
2271
2377
|
} else {
|
2272
2378
|
ret = Qfalse;
|
2273
2379
|
}
|
@@ -2304,9 +2410,9 @@ pgconn_async_flush(VALUE self)
|
|
2304
2410
|
/* wait for the socket to become read- or write-ready */
|
2305
2411
|
int events;
|
2306
2412
|
VALUE socket_io = pgconn_socket_io(self);
|
2307
|
-
events = RB_NUM2INT(
|
2413
|
+
events = RB_NUM2INT(pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE | PG_RUBY_IO_WRITABLE), Qnil));
|
2308
2414
|
|
2309
|
-
if (events &
|
2415
|
+
if (events & PG_RUBY_IO_READABLE)
|
2310
2416
|
pgconn_consume_input(self);
|
2311
2417
|
}
|
2312
2418
|
return Qtrue;
|
@@ -3013,10 +3119,10 @@ pgconn_discard_results(VALUE self)
|
|
3013
3119
|
int status;
|
3014
3120
|
|
3015
3121
|
/* pgconn_block() raises an exception in case of errors.
|
3016
|
-
* To avoid this call
|
3122
|
+
* To avoid this call pg_rb_io_wait() and PQconsumeInput() without rb_raise().
|
3017
3123
|
*/
|
3018
3124
|
while( gvl_PQisBusy(conn) ){
|
3019
|
-
|
3125
|
+
pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE), Qnil);
|
3020
3126
|
if ( PQconsumeInput(conn) == 0 ) {
|
3021
3127
|
pgconn_close_socket_io(self);
|
3022
3128
|
return Qfalse;
|
@@ -3037,7 +3143,7 @@ pgconn_discard_results(VALUE self)
|
|
3037
3143
|
int st = gvl_PQgetCopyData(conn, &buffer, 1);
|
3038
3144
|
if( st == 0 ) {
|
3039
3145
|
/* would block -> wait for readable data */
|
3040
|
-
|
3146
|
+
pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE), Qnil);
|
3041
3147
|
if ( PQconsumeInput(conn) == 0 ) {
|
3042
3148
|
pgconn_close_socket_io(self);
|
3043
3149
|
return Qfalse;
|
@@ -3076,6 +3182,7 @@ pgconn_discard_results(VALUE self)
|
|
3076
3182
|
* #exec is an alias for #async_exec which is almost identical to #sync_exec .
|
3077
3183
|
* #sync_exec is implemented on the simpler synchronous command processing API of libpq, whereas
|
3078
3184
|
* #async_exec is implemented on the asynchronous API and on ruby's IO mechanisms.
|
3185
|
+
* Only #async_exec is compatible to <tt>Fiber.scheduler</tt> based asynchronous IO processing introduced in ruby-3.0.
|
3079
3186
|
* Both methods ensure that other threads can process while waiting for the server to
|
3080
3187
|
* complete the request, but #sync_exec blocks all signals to be processed until the query is finished.
|
3081
3188
|
* This is most notably visible by a delayed reaction to Control+C.
|
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.
|
@@ -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/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
@@ -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.
|
@@ -234,6 +241,7 @@ class PG::Connection
|
|
234
241
|
# ["more", "data", "to", "copy"]
|
235
242
|
|
236
243
|
def copy_data( sql, coder=nil )
|
244
|
+
raise PG::NotInBlockingMode, "copy_data can not be used in nonblocking mode" if nonblocking?
|
237
245
|
res = exec( sql )
|
238
246
|
|
239
247
|
case res.result_status
|
@@ -305,7 +313,7 @@ class PG::Connection
|
|
305
313
|
exec "BEGIN"
|
306
314
|
res = yield(self)
|
307
315
|
rescue Exception
|
308
|
-
cancel if transaction_status
|
316
|
+
cancel if transaction_status == PG::PQTRANS_ACTIVE
|
309
317
|
block
|
310
318
|
exec "ROLLBACK"
|
311
319
|
raise
|
@@ -378,7 +386,7 @@ class PG::Connection
|
|
378
386
|
# If the optional code block is given, it will be passed <i>result</i> as an argument,
|
379
387
|
# and the PG::Result object will automatically be cleared when the block terminates.
|
380
388
|
# In this instance, <code>conn.exec</code> returns the value of the block.
|
381
|
-
def get_result
|
389
|
+
def get_result
|
382
390
|
block
|
383
391
|
sync_get_result
|
384
392
|
end
|
@@ -690,7 +698,7 @@ class PG::Connection
|
|
690
698
|
#
|
691
699
|
# Raises a PG::Error if the connection fails.
|
692
700
|
def new(*args, **kwargs)
|
693
|
-
conn =
|
701
|
+
conn = self.connect_start(*args, **kwargs ) or
|
694
702
|
raise(PG::Error, "Unable to create a new connection")
|
695
703
|
|
696
704
|
raise(PG::ConnectionBad, conn.error_message) if conn.status == PG::CONNECTION_BAD
|
data/lib/pg/version.rb
CHANGED
data/lib/pg.rb
CHANGED
@@ -53,18 +53,20 @@ 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
|
|
65
67
|
### Convenience alias for PG::Connection.new.
|
66
|
-
def self::connect( *args )
|
67
|
-
return PG::Connection.new( *args )
|
68
|
+
def self::connect( *args, **kwargs )
|
69
|
+
return PG::Connection.new( *args, **kwargs )
|
68
70
|
end
|
69
71
|
|
70
72
|
|
data/lib/x86-mingw32/libpq.dll
CHANGED
Binary file
|
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.2
|
5
5
|
platform: x86-mingw32
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -12,31 +12,31 @@ cert_chain:
|
|
12
12
|
- |
|
13
13
|
-----BEGIN CERTIFICATE-----
|
14
14
|
MIIETTCCArWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1sYXJz
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
28
|
BBswGYEXbGFyc0BncmVpei1yZWluc2RvcmYuZGUwDQYJKoZIhvcNAQELBQADggGB
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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==
|
38
38
|
-----END CERTIFICATE-----
|
39
|
-
date: 2022-
|
39
|
+
date: 2022-02-14 00:00:00.000000000 Z
|
40
40
|
dependencies: []
|
41
41
|
description: Pg is the Ruby interface to the PostgreSQL RDBMS. It works with PostgreSQL
|
42
42
|
9.3 and later.
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- Rakefile
|
74
74
|
- Rakefile.cross
|
75
75
|
- certs/ged.pem
|
76
|
+
- certs/larskanis-2022.pem
|
76
77
|
- ext/errorcodes.def
|
77
78
|
- ext/errorcodes.rb
|
78
79
|
- ext/errorcodes.txt
|
@@ -181,9 +182,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
182
|
version: 3.2.dev
|
182
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
184
|
requirements:
|
184
|
-
- - "
|
185
|
+
- - ">="
|
185
186
|
- !ruby/object:Gem::Version
|
186
|
-
version:
|
187
|
+
version: '0'
|
187
188
|
requirements: []
|
188
189
|
rubygems_version: 3.3.4
|
189
190
|
signing_key:
|
metadata.gz.sig
CHANGED
Binary file
|