pg 1.4.5-x64-mingw-ucrt → 1.4.6-x64-mingw-ucrt
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.appveyor.yml +14 -8
- data/.github/workflows/binary-gems.yml +41 -10
- data/.github/workflows/source-gem.yml +18 -12
- data/.gitignore +8 -2
- data/.travis.yml +2 -2
- data/{History.rdoc → History.md} +168 -153
- data/README.ja.md +266 -0
- data/README.md +272 -0
- data/Rakefile +12 -3
- data/Rakefile.cross +7 -11
- data/certs/larskanis-2023.pem +24 -0
- data/ext/pg_connection.c +106 -26
- data/lib/3.1/pg_ext.so +0 -0
- data/lib/3.2/pg_ext.so +0 -0
- data/lib/pg/connection.rb +20 -19
- data/lib/pg/exceptions.rb +7 -0
- data/lib/pg/version.rb +1 -1
- data/lib/pg.rb +0 -6
- data/lib/x64-mingw-ucrt/libpq.dll +0 -0
- data/pg.gemspec +4 -2
- data/rakelib/task_extension.rb +1 -1
- data/translation/.po4a-version +7 -0
- data/translation/po/all.pot +875 -0
- data/translation/po/ja.po +868 -0
- data/translation/po4a.cfg +9 -0
- data.tar.gz.sig +1 -2
- metadata +89 -31
- metadata.gz.sig +0 -0
- data/README.ja.rdoc +0 -13
- data/README.rdoc +0 -233
data/ext/pg_connection.c
CHANGED
@@ -2446,8 +2446,9 @@ pgconn_async_flush(VALUE self)
|
|
2446
2446
|
VALUE socket_io = pgconn_socket_io(self);
|
2447
2447
|
events = RB_NUM2INT(pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE | PG_RUBY_IO_WRITABLE), Qnil));
|
2448
2448
|
|
2449
|
-
if (events & PG_RUBY_IO_READABLE)
|
2449
|
+
if (events & PG_RUBY_IO_READABLE){
|
2450
2450
|
pgconn_consume_input(self);
|
2451
|
+
}
|
2451
2452
|
}
|
2452
2453
|
return Qtrue;
|
2453
2454
|
}
|
@@ -3126,8 +3127,14 @@ pgconn_async_get_last_result(VALUE self)
|
|
3126
3127
|
* conn.discard_results()
|
3127
3128
|
*
|
3128
3129
|
* Silently discard any prior query result that application didn't eat.
|
3129
|
-
* This is
|
3130
|
-
*
|
3130
|
+
* This is internally used prior to Connection#exec and sibling methods.
|
3131
|
+
* It doesn't raise an exception on connection errors, but returns +false+ instead.
|
3132
|
+
*
|
3133
|
+
* Returns:
|
3134
|
+
* * +nil+ when the connection is already idle
|
3135
|
+
* * +true+ when some results have been discarded
|
3136
|
+
* * +false+ when a failure occured and the connection was closed
|
3137
|
+
*
|
3131
3138
|
*/
|
3132
3139
|
static VALUE
|
3133
3140
|
pgconn_discard_results(VALUE self)
|
@@ -3135,8 +3142,12 @@ pgconn_discard_results(VALUE self)
|
|
3135
3142
|
PGconn *conn = pg_get_pgconn(self);
|
3136
3143
|
VALUE socket_io;
|
3137
3144
|
|
3138
|
-
|
3139
|
-
|
3145
|
+
switch( PQtransactionStatus(conn) ) {
|
3146
|
+
case PQTRANS_IDLE:
|
3147
|
+
case PQTRANS_INTRANS:
|
3148
|
+
case PQTRANS_INERROR:
|
3149
|
+
return Qnil;
|
3150
|
+
default:;
|
3140
3151
|
}
|
3141
3152
|
|
3142
3153
|
socket_io = pgconn_socket_io(self);
|
@@ -3149,10 +3160,21 @@ pgconn_discard_results(VALUE self)
|
|
3149
3160
|
* To avoid this call pg_rb_io_wait() and PQconsumeInput() without rb_raise().
|
3150
3161
|
*/
|
3151
3162
|
while( gvl_PQisBusy(conn) ){
|
3152
|
-
|
3153
|
-
|
3154
|
-
|
3155
|
-
|
3163
|
+
int events;
|
3164
|
+
|
3165
|
+
switch( PQflush(conn) ) {
|
3166
|
+
case 1:
|
3167
|
+
events = RB_NUM2INT(pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE | PG_RUBY_IO_WRITABLE), Qnil));
|
3168
|
+
if (events & PG_RUBY_IO_READABLE){
|
3169
|
+
if ( PQconsumeInput(conn) == 0 ) goto error;
|
3170
|
+
}
|
3171
|
+
break;
|
3172
|
+
case 0:
|
3173
|
+
pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE), Qnil);
|
3174
|
+
if ( PQconsumeInput(conn) == 0 ) goto error;
|
3175
|
+
break;
|
3176
|
+
default:
|
3177
|
+
goto error;
|
3156
3178
|
}
|
3157
3179
|
}
|
3158
3180
|
|
@@ -3162,7 +3184,9 @@ pgconn_discard_results(VALUE self)
|
|
3162
3184
|
status = PQresultStatus(cur);
|
3163
3185
|
PQclear(cur);
|
3164
3186
|
if (status == PGRES_COPY_IN){
|
3165
|
-
gvl_PQputCopyEnd(conn, "COPY terminated by new
|
3187
|
+
while( gvl_PQputCopyEnd(conn, "COPY terminated by new query or discard_results") == 0 ){
|
3188
|
+
pgconn_async_flush(self);
|
3189
|
+
}
|
3166
3190
|
}
|
3167
3191
|
if (status == PGRES_COPY_OUT){
|
3168
3192
|
for(;;) {
|
@@ -3171,10 +3195,7 @@ pgconn_discard_results(VALUE self)
|
|
3171
3195
|
if( st == 0 ) {
|
3172
3196
|
/* would block -> wait for readable data */
|
3173
3197
|
pg_rb_io_wait(socket_io, RB_INT2NUM(PG_RUBY_IO_READABLE), Qnil);
|
3174
|
-
if ( PQconsumeInput(conn) == 0 )
|
3175
|
-
pgconn_close_socket_io(self);
|
3176
|
-
return Qfalse;
|
3177
|
-
}
|
3198
|
+
if ( PQconsumeInput(conn) == 0 ) goto error;
|
3178
3199
|
} else if( st > 0 ) {
|
3179
3200
|
/* some data retrieved -> discard it */
|
3180
3201
|
PQfreemem(buffer);
|
@@ -3187,6 +3208,10 @@ pgconn_discard_results(VALUE self)
|
|
3187
3208
|
}
|
3188
3209
|
|
3189
3210
|
return Qtrue;
|
3211
|
+
|
3212
|
+
error:
|
3213
|
+
pgconn_close_socket_io(self);
|
3214
|
+
return Qfalse;
|
3190
3215
|
}
|
3191
3216
|
|
3192
3217
|
/*
|
@@ -3643,6 +3668,14 @@ pgconn_send_flush_request(VALUE self)
|
|
3643
3668
|
* LARGE OBJECT SUPPORT
|
3644
3669
|
**************************************************************************/
|
3645
3670
|
|
3671
|
+
#define BLOCKING_BEGIN(conn) do { \
|
3672
|
+
int old_nonblocking = PQisnonblocking(conn); \
|
3673
|
+
PQsetnonblocking(conn, 0);
|
3674
|
+
|
3675
|
+
#define BLOCKING_END(th) \
|
3676
|
+
PQsetnonblocking(conn, old_nonblocking); \
|
3677
|
+
} while(0);
|
3678
|
+
|
3646
3679
|
/*
|
3647
3680
|
* call-seq:
|
3648
3681
|
* conn.lo_creat( [mode] ) -> Integer
|
@@ -3663,7 +3696,10 @@ pgconn_locreat(int argc, VALUE *argv, VALUE self)
|
|
3663
3696
|
else
|
3664
3697
|
mode = NUM2INT(nmode);
|
3665
3698
|
|
3666
|
-
|
3699
|
+
BLOCKING_BEGIN(conn)
|
3700
|
+
lo_oid = lo_creat(conn, mode);
|
3701
|
+
BLOCKING_END(conn)
|
3702
|
+
|
3667
3703
|
if (lo_oid == 0)
|
3668
3704
|
pg_raise_conn_error( rb_ePGerror, self, "lo_creat failed");
|
3669
3705
|
|
@@ -3708,7 +3744,10 @@ pgconn_loimport(VALUE self, VALUE filename)
|
|
3708
3744
|
|
3709
3745
|
Check_Type(filename, T_STRING);
|
3710
3746
|
|
3711
|
-
|
3747
|
+
BLOCKING_BEGIN(conn)
|
3748
|
+
lo_oid = lo_import(conn, StringValueCStr(filename));
|
3749
|
+
BLOCKING_END(conn)
|
3750
|
+
|
3712
3751
|
if (lo_oid == 0) {
|
3713
3752
|
pg_raise_conn_error( rb_ePGerror, self, "%s", PQerrorMessage(conn));
|
3714
3753
|
}
|
@@ -3726,11 +3765,16 @@ pgconn_loexport(VALUE self, VALUE lo_oid, VALUE filename)
|
|
3726
3765
|
{
|
3727
3766
|
PGconn *conn = pg_get_pgconn(self);
|
3728
3767
|
Oid oid;
|
3768
|
+
int ret;
|
3729
3769
|
Check_Type(filename, T_STRING);
|
3730
3770
|
|
3731
3771
|
oid = NUM2UINT(lo_oid);
|
3732
3772
|
|
3733
|
-
|
3773
|
+
BLOCKING_BEGIN(conn)
|
3774
|
+
ret = lo_export(conn, oid, StringValueCStr(filename));
|
3775
|
+
BLOCKING_END(conn)
|
3776
|
+
|
3777
|
+
if (ret < 0) {
|
3734
3778
|
pg_raise_conn_error( rb_ePGerror, self, "%s", PQerrorMessage(conn));
|
3735
3779
|
}
|
3736
3780
|
return Qnil;
|
@@ -3761,7 +3805,11 @@ pgconn_loopen(int argc, VALUE *argv, VALUE self)
|
|
3761
3805
|
else
|
3762
3806
|
mode = NUM2INT(nmode);
|
3763
3807
|
|
3764
|
-
|
3808
|
+
BLOCKING_BEGIN(conn)
|
3809
|
+
fd = lo_open(conn, lo_oid, mode);
|
3810
|
+
BLOCKING_END(conn)
|
3811
|
+
|
3812
|
+
if(fd < 0) {
|
3765
3813
|
pg_raise_conn_error( rb_ePGerror, self, "can't open large object: %s", PQerrorMessage(conn));
|
3766
3814
|
}
|
3767
3815
|
return INT2FIX(fd);
|
@@ -3786,8 +3834,12 @@ pgconn_lowrite(VALUE self, VALUE in_lo_desc, VALUE buffer)
|
|
3786
3834
|
if( RSTRING_LEN(buffer) < 0) {
|
3787
3835
|
pg_raise_conn_error( rb_ePGerror, self, "write buffer zero string");
|
3788
3836
|
}
|
3789
|
-
|
3790
|
-
|
3837
|
+
BLOCKING_BEGIN(conn)
|
3838
|
+
n = lo_write(conn, fd, StringValuePtr(buffer),
|
3839
|
+
RSTRING_LEN(buffer));
|
3840
|
+
BLOCKING_END(conn)
|
3841
|
+
|
3842
|
+
if(n < 0) {
|
3791
3843
|
pg_raise_conn_error( rb_ePGerror, self, "lo_write failed: %s", PQerrorMessage(conn));
|
3792
3844
|
}
|
3793
3845
|
|
@@ -3815,7 +3867,12 @@ pgconn_loread(VALUE self, VALUE in_lo_desc, VALUE in_len)
|
|
3815
3867
|
pg_raise_conn_error( rb_ePGerror, self, "negative length %d given", len);
|
3816
3868
|
|
3817
3869
|
buffer = ALLOC_N(char, len);
|
3818
|
-
|
3870
|
+
|
3871
|
+
BLOCKING_BEGIN(conn)
|
3872
|
+
ret = lo_read(conn, lo_desc, buffer, len);
|
3873
|
+
BLOCKING_END(conn)
|
3874
|
+
|
3875
|
+
if(ret < 0)
|
3819
3876
|
pg_raise_conn_error( rb_ePGerror, self, "lo_read failed");
|
3820
3877
|
|
3821
3878
|
if(ret == 0) {
|
@@ -3845,7 +3902,11 @@ pgconn_lolseek(VALUE self, VALUE in_lo_desc, VALUE offset, VALUE whence)
|
|
3845
3902
|
int lo_desc = NUM2INT(in_lo_desc);
|
3846
3903
|
int ret;
|
3847
3904
|
|
3848
|
-
|
3905
|
+
BLOCKING_BEGIN(conn)
|
3906
|
+
ret = lo_lseek(conn, lo_desc, NUM2INT(offset), NUM2INT(whence));
|
3907
|
+
BLOCKING_END(conn)
|
3908
|
+
|
3909
|
+
if(ret < 0) {
|
3849
3910
|
pg_raise_conn_error( rb_ePGerror, self, "lo_lseek failed");
|
3850
3911
|
}
|
3851
3912
|
|
@@ -3865,7 +3926,11 @@ pgconn_lotell(VALUE self, VALUE in_lo_desc)
|
|
3865
3926
|
PGconn *conn = pg_get_pgconn(self);
|
3866
3927
|
int lo_desc = NUM2INT(in_lo_desc);
|
3867
3928
|
|
3868
|
-
|
3929
|
+
BLOCKING_BEGIN(conn)
|
3930
|
+
position = lo_tell(conn, lo_desc);
|
3931
|
+
BLOCKING_END(conn)
|
3932
|
+
|
3933
|
+
if(position < 0)
|
3869
3934
|
pg_raise_conn_error( rb_ePGerror, self, "lo_tell failed");
|
3870
3935
|
|
3871
3936
|
return INT2FIX(position);
|
@@ -3883,8 +3948,13 @@ pgconn_lotruncate(VALUE self, VALUE in_lo_desc, VALUE in_len)
|
|
3883
3948
|
PGconn *conn = pg_get_pgconn(self);
|
3884
3949
|
int lo_desc = NUM2INT(in_lo_desc);
|
3885
3950
|
size_t len = NUM2INT(in_len);
|
3951
|
+
int ret;
|
3952
|
+
|
3953
|
+
BLOCKING_BEGIN(conn)
|
3954
|
+
ret = lo_truncate(conn,lo_desc,len);
|
3955
|
+
BLOCKING_END(conn)
|
3886
3956
|
|
3887
|
-
if(
|
3957
|
+
if(ret < 0)
|
3888
3958
|
pg_raise_conn_error( rb_ePGerror, self, "lo_truncate failed");
|
3889
3959
|
|
3890
3960
|
return Qnil;
|
@@ -3901,8 +3971,13 @@ pgconn_loclose(VALUE self, VALUE in_lo_desc)
|
|
3901
3971
|
{
|
3902
3972
|
PGconn *conn = pg_get_pgconn(self);
|
3903
3973
|
int lo_desc = NUM2INT(in_lo_desc);
|
3974
|
+
int ret;
|
3975
|
+
|
3976
|
+
BLOCKING_BEGIN(conn)
|
3977
|
+
ret = lo_close(conn,lo_desc);
|
3978
|
+
BLOCKING_END(conn)
|
3904
3979
|
|
3905
|
-
if(
|
3980
|
+
if(ret < 0)
|
3906
3981
|
pg_raise_conn_error( rb_ePGerror, self, "lo_close failed");
|
3907
3982
|
|
3908
3983
|
return Qnil;
|
@@ -3919,8 +3994,13 @@ pgconn_lounlink(VALUE self, VALUE in_oid)
|
|
3919
3994
|
{
|
3920
3995
|
PGconn *conn = pg_get_pgconn(self);
|
3921
3996
|
Oid oid = NUM2UINT(in_oid);
|
3997
|
+
int ret;
|
3998
|
+
|
3999
|
+
BLOCKING_BEGIN(conn)
|
4000
|
+
ret = lo_unlink(conn,oid);
|
4001
|
+
BLOCKING_END(conn)
|
3922
4002
|
|
3923
|
-
if(
|
4003
|
+
if(ret < 0)
|
3924
4004
|
pg_raise_conn_error( rb_ePGerror, self, "lo_unlink failed");
|
3925
4005
|
|
3926
4006
|
return Qnil;
|
data/lib/3.1/pg_ext.so
CHANGED
Binary file
|
data/lib/3.2/pg_ext.so
ADDED
Binary file
|
data/lib/pg/connection.rb
CHANGED
@@ -196,11 +196,19 @@ class PG::Connection
|
|
196
196
|
yield res
|
197
197
|
rescue Exception => err
|
198
198
|
errmsg = "%s while copy data: %s" % [ err.class.name, err.message ]
|
199
|
-
|
200
|
-
|
201
|
-
|
199
|
+
begin
|
200
|
+
put_copy_end( errmsg )
|
201
|
+
rescue PG::Error
|
202
|
+
# Ignore error in cleanup to avoid losing original exception
|
203
|
+
end
|
204
|
+
discard_results
|
205
|
+
raise err
|
202
206
|
else
|
203
|
-
|
207
|
+
begin
|
208
|
+
put_copy_end
|
209
|
+
rescue PG::Error => err
|
210
|
+
raise PG::LostCopyState.new("#{err} (probably by executing another SQL query while running a COPY command)", connection: self)
|
211
|
+
end
|
204
212
|
get_last_result
|
205
213
|
ensure
|
206
214
|
self.encoder_for_put_copy_data = old_coder if coder
|
@@ -213,24 +221,17 @@ class PG::Connection
|
|
213
221
|
self.decoder_for_get_copy_data = coder
|
214
222
|
end
|
215
223
|
yield res
|
216
|
-
rescue Exception
|
224
|
+
rescue Exception
|
217
225
|
cancel
|
218
|
-
|
219
|
-
|
220
|
-
end
|
221
|
-
rescue PG::Error
|
222
|
-
# Ignore error in cleanup to avoid losing original exception
|
223
|
-
end
|
224
|
-
while get_result
|
225
|
-
end
|
226
|
-
raise err
|
226
|
+
discard_results
|
227
|
+
raise
|
227
228
|
else
|
228
229
|
res = get_last_result
|
229
|
-
if !res
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
230
|
+
if !res
|
231
|
+
discard_results
|
232
|
+
raise PG::LostCopyState.new("Lost COPY state (probably by executing another SQL query while running a COPY command)", connection: self)
|
233
|
+
elsif res.result_status != PGRES_COMMAND_OK
|
234
|
+
discard_results
|
234
235
|
raise PG::NotAllCopyDataRetrieved.new("Not all COPY data retrieved", connection: self)
|
235
236
|
end
|
236
237
|
res
|
data/lib/pg/exceptions.rb
CHANGED
data/lib/pg/version.rb
CHANGED
data/lib/pg.rb
CHANGED
Binary file
|
data/pg.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
|
18
18
|
spec.metadata["homepage_uri"] = spec.homepage
|
19
19
|
spec.metadata["source_code_uri"] = "https://github.com/ged/ruby-pg"
|
20
|
-
spec.metadata["changelog_uri"] = "https://github.com/ged/ruby-pg/blob/master/History.
|
20
|
+
spec.metadata["changelog_uri"] = "https://github.com/ged/ruby-pg/blob/master/History.md"
|
21
21
|
spec.metadata["documentation_uri"] = "http://deveiate.org/code/pg"
|
22
22
|
|
23
23
|
# Specify which files should be added to the gem when it is released.
|
@@ -28,5 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.extensions = ["ext/extconf.rb"]
|
29
29
|
spec.require_paths = ["lib"]
|
30
30
|
spec.cert_chain = ["certs/ged.pem"]
|
31
|
-
spec.rdoc_options = ["--main", "README.
|
31
|
+
spec.rdoc_options = ["--main", "README.md",
|
32
|
+
"--title", "PG: The Ruby PostgreSQL Driver"]
|
33
|
+
spec.extra_rdoc_files = `git ls-files -z *.rdoc *.md lib/*.rb lib/*/*.rb ext/*.c ext/*.h`.split("\x0")
|
32
34
|
end
|
data/rakelib/task_extension.rb
CHANGED
@@ -0,0 +1,7 @@
|
|
1
|
+
po4a version 0.69.
|
2
|
+
Written by Martin Quinson and Denis Barbier.
|
3
|
+
|
4
|
+
Copyright © 2002-2022 Software in the Public Interest, Inc.
|
5
|
+
This is free software; see source code for copying
|
6
|
+
conditions. There is NO warranty; not even for
|
7
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|