pg 0.21.0-x64-mingw32 → 1.0.0-x64-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.tar.gz.sig +0 -0
- data/ChangeLog +62 -82
- data/History.rdoc +28 -0
- data/Manifest.txt +0 -1
- data/README.rdoc +3 -4
- data/Rakefile +3 -4
- data/Rakefile.cross +16 -20
- data/ext/errorcodes.def +8 -0
- data/ext/errorcodes.txt +3 -1
- data/ext/extconf.rb +12 -32
- data/ext/gvl_wrappers.c +4 -0
- data/ext/gvl_wrappers.h +23 -39
- data/ext/pg.c +15 -48
- data/ext/pg.h +7 -77
- data/ext/pg_binary_decoder.c +1 -1
- data/ext/pg_binary_encoder.c +1 -1
- data/ext/pg_connection.c +91 -130
- data/ext/pg_result.c +5 -9
- data/ext/pg_text_decoder.c +1 -1
- data/ext/pg_text_encoder.c +1 -1
- data/ext/pg_type_map.c +1 -1
- data/ext/pg_type_map_all_strings.c +1 -1
- data/ext/pg_type_map_by_class.c +1 -1
- data/ext/pg_type_map_by_column.c +1 -1
- data/ext/pg_type_map_by_mri_type.c +1 -1
- data/ext/pg_type_map_by_oid.c +1 -1
- data/ext/pg_type_map_in_ruby.c +1 -1
- data/ext/util.c +1 -1
- data/lib/2.0/pg_ext.so +0 -0
- data/lib/2.1/pg_ext.so +0 -0
- data/lib/2.2/pg_ext.so +0 -0
- data/lib/2.3/pg_ext.so +0 -0
- data/lib/2.4/pg_ext.so +0 -0
- data/lib/2.5/pg_ext.so +0 -0
- data/lib/libpq.dll +0 -0
- data/lib/pg.rb +2 -6
- data/lib/pg/connection.rb +7 -2
- data/spec/helpers.rb +8 -12
- data/spec/pg/connection_spec.rb +228 -185
- data/spec/pg/result_spec.rb +3 -3
- data/spec/pg/type_spec.rb +1 -1
- data/spec/pg_spec.rb +1 -1
- metadata +36 -24
- metadata.gz.sig +0 -0
- data/lib/pg/deprecated_constants.rb +0 -21
data/ext/pg_binary_decoder.c
CHANGED
data/ext/pg_binary_encoder.c
CHANGED
data/ext/pg_connection.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* pg_connection.c - PG::Connection class extension
|
3
|
-
* $Id$
|
3
|
+
* $Id: pg_connection.c,v 1f0926bfa9a5 2018/01/04 18:14:32 lars $
|
4
4
|
*
|
5
5
|
*/
|
6
6
|
|
@@ -18,19 +18,8 @@ static PQnoticeReceiver default_notice_receiver = NULL;
|
|
18
18
|
static PQnoticeProcessor default_notice_processor = NULL;
|
19
19
|
|
20
20
|
static VALUE pgconn_finish( VALUE );
|
21
|
-
#ifdef M17N_SUPPORTED
|
22
21
|
static VALUE pgconn_set_default_encoding( VALUE self );
|
23
22
|
void pgconn_set_internal_encoding_index( VALUE );
|
24
|
-
#endif
|
25
|
-
|
26
|
-
#ifndef HAVE_RB_THREAD_FD_SELECT
|
27
|
-
#define rb_fdset_t fd_set
|
28
|
-
#define rb_fd_init(f)
|
29
|
-
#define rb_fd_zero(f) FD_ZERO(f)
|
30
|
-
#define rb_fd_set(n, f) FD_SET(n, f)
|
31
|
-
#define rb_fd_term(f)
|
32
|
-
#define rb_thread_fd_select rb_thread_select
|
33
|
-
#endif
|
34
23
|
|
35
24
|
/*
|
36
25
|
* Global functions
|
@@ -95,7 +84,7 @@ pgconn_close_socket_io( VALUE self )
|
|
95
84
|
VALUE socket_io = this->socket_io;
|
96
85
|
|
97
86
|
if ( RTEST(socket_io) ) {
|
98
|
-
#if defined(_WIN32)
|
87
|
+
#if defined(_WIN32)
|
99
88
|
int ruby_sd = NUM2INT(rb_funcall( socket_io, rb_intern("fileno"), 0 ));
|
100
89
|
if( rb_w32_unwrap_io_handle(ruby_sd) ){
|
101
90
|
rb_raise(rb_eConnectionBad, "Could not unwrap win32 socket handle");
|
@@ -291,9 +280,7 @@ pgconn_init(int argc, VALUE *argv, VALUE self)
|
|
291
280
|
rb_exc_raise(error);
|
292
281
|
}
|
293
282
|
|
294
|
-
#ifdef M17N_SUPPORTED
|
295
283
|
pgconn_set_default_encoding( self );
|
296
|
-
#endif
|
297
284
|
|
298
285
|
if (rb_block_given_p()) {
|
299
286
|
return rb_ensure(rb_yield, self, pgconn_finish, self);
|
@@ -349,7 +336,6 @@ pgconn_s_connect_start( int argc, VALUE *argv, VALUE klass )
|
|
349
336
|
return rb_conn;
|
350
337
|
}
|
351
338
|
|
352
|
-
#ifdef HAVE_PQPING
|
353
339
|
/*
|
354
340
|
* call-seq:
|
355
341
|
* PG::Connection.ping(connection_hash) -> Integer
|
@@ -367,6 +353,8 @@ pgconn_s_connect_start( int argc, VALUE *argv, VALUE klass )
|
|
367
353
|
* could not establish connection
|
368
354
|
* [+PQPING_NO_ATTEMPT+]
|
369
355
|
* connection not attempted (bad params)
|
356
|
+
*
|
357
|
+
* Available since PostgreSQL-9.1
|
370
358
|
*/
|
371
359
|
static VALUE
|
372
360
|
pgconn_s_ping( int argc, VALUE *argv, VALUE klass )
|
@@ -379,7 +367,6 @@ pgconn_s_ping( int argc, VALUE *argv, VALUE klass )
|
|
379
367
|
|
380
368
|
return INT2FIX((int)ping);
|
381
369
|
}
|
382
|
-
#endif
|
383
370
|
|
384
371
|
|
385
372
|
/*
|
@@ -418,16 +405,65 @@ pgconn_s_conndefaults(VALUE self)
|
|
418
405
|
}
|
419
406
|
|
420
407
|
|
408
|
+
#ifdef HAVE_PQENCRYPTPASSWORDCONN
|
421
409
|
/*
|
422
410
|
* call-seq:
|
423
|
-
*
|
411
|
+
* conn.encrypt_password( password, username, algorithm=nil ) -> String
|
412
|
+
*
|
413
|
+
* This function is intended to be used by client applications that wish to send commands like <tt>ALTER USER joe PASSWORD 'pwd'</tt>.
|
414
|
+
* It is good practice not to send the original cleartext password in such a command, because it might be exposed in command logs, activity displays, and so on.
|
415
|
+
* Instead, use this function to convert the password to encrypted form before it is sent.
|
424
416
|
*
|
425
|
-
*
|
426
|
-
*
|
427
|
-
*
|
428
|
-
*
|
417
|
+
* The +password+ and +username+ arguments are the cleartext password, and the SQL name of the user it is for.
|
418
|
+
* +algorithm+ specifies the encryption algorithm to use to encrypt the password.
|
419
|
+
* Currently supported algorithms are +md5+ and +scram-sha-256+ (+on+ and +off+ are also accepted as aliases for +md5+, for compatibility with older server versions).
|
420
|
+
* Note that support for +scram-sha-256+ was introduced in PostgreSQL version 10, and will not work correctly with older server versions.
|
421
|
+
* If algorithm is omitted or +nil+, this function will query the server for the current value of the +password_encryption+ setting.
|
422
|
+
* That can block, and will fail if the current transaction is aborted, or if the connection is busy executing another query.
|
423
|
+
* If you wish to use the default algorithm for the server but want to avoid blocking, query +password_encryption+ yourself before calling #encrypt_password, and pass that value as the algorithm.
|
429
424
|
*
|
430
425
|
* Return value is the encrypted password.
|
426
|
+
* The caller can assume the string doesn't contain any special characters that would require escaping.
|
427
|
+
*
|
428
|
+
* Available since PostgreSQL-10
|
429
|
+
*/
|
430
|
+
static VALUE
|
431
|
+
pgconn_encrypt_password(int argc, VALUE *argv, VALUE self)
|
432
|
+
{
|
433
|
+
char *encrypted = NULL;
|
434
|
+
VALUE rval = Qnil;
|
435
|
+
VALUE password, username, algorithm;
|
436
|
+
PGconn *conn = pg_get_pgconn(self);
|
437
|
+
|
438
|
+
rb_scan_args( argc, argv, "21", &password, &username, &algorithm );
|
439
|
+
|
440
|
+
Check_Type(password, T_STRING);
|
441
|
+
Check_Type(username, T_STRING);
|
442
|
+
|
443
|
+
encrypted = gvl_PQencryptPasswordConn(conn, StringValueCStr(password), StringValueCStr(username), RTEST(algorithm) ? StringValueCStr(algorithm) : NULL);
|
444
|
+
if ( encrypted ) {
|
445
|
+
rval = rb_str_new2( encrypted );
|
446
|
+
PQfreemem( encrypted );
|
447
|
+
|
448
|
+
OBJ_INFECT( rval, password );
|
449
|
+
OBJ_INFECT( rval, username );
|
450
|
+
OBJ_INFECT( rval, algorithm );
|
451
|
+
} else {
|
452
|
+
rb_raise(rb_ePGerror, "%s", PQerrorMessage(conn));
|
453
|
+
}
|
454
|
+
|
455
|
+
return rval;
|
456
|
+
}
|
457
|
+
#endif
|
458
|
+
|
459
|
+
|
460
|
+
/*
|
461
|
+
* call-seq:
|
462
|
+
* PG::Connection.encrypt_password( password, username ) -> String
|
463
|
+
*
|
464
|
+
* This is an older, deprecated version of #encrypt_password.
|
465
|
+
* The difference is that this function always uses +md5+ as the encryption algorithm.
|
466
|
+
*
|
431
467
|
*/
|
432
468
|
static VALUE
|
433
469
|
pgconn_s_encrypt_password(VALUE self, VALUE password, VALUE username)
|
@@ -613,7 +649,7 @@ pgconn_user(VALUE self)
|
|
613
649
|
* call-seq:
|
614
650
|
* conn.pass()
|
615
651
|
*
|
616
|
-
* Returns the authenticated
|
652
|
+
* Returns the authenticated password.
|
617
653
|
*/
|
618
654
|
static VALUE
|
619
655
|
pgconn_pass(VALUE self)
|
@@ -686,6 +722,7 @@ pgconn_options(VALUE self)
|
|
686
722
|
*
|
687
723
|
* Returns the connection options used by a live connection.
|
688
724
|
*
|
725
|
+
* Available since PostgreSQL-9.3
|
689
726
|
*/
|
690
727
|
static VALUE
|
691
728
|
pgconn_conninfo( VALUE self )
|
@@ -807,6 +844,8 @@ pgconn_error_message(VALUE self)
|
|
807
844
|
* call-seq:
|
808
845
|
* conn.socket() -> Integer
|
809
846
|
*
|
847
|
+
* This method is deprecated. Please use the more portable method #socket_io .
|
848
|
+
*
|
810
849
|
* Returns the socket's file descriptor for this connection.
|
811
850
|
* <tt>IO.for_fd()</tt> can be used to build a proper IO object to the socket.
|
812
851
|
* If you do so, you will likely also want to set <tt>autoclose=false</tt>
|
@@ -815,7 +854,7 @@ pgconn_error_message(VALUE self)
|
|
815
854
|
* creates an IO that's associated with the connection object itself,
|
816
855
|
* and so won't go out of scope until the connection does.
|
817
856
|
*
|
818
|
-
* *Note:* On Windows the file descriptor is not
|
857
|
+
* *Note:* On Windows the file descriptor is not usable,
|
819
858
|
* since it can not be used to build a Ruby IO object.
|
820
859
|
*/
|
821
860
|
static VALUE
|
@@ -827,22 +866,17 @@ pgconn_socket(VALUE self)
|
|
827
866
|
return INT2NUM(sd);
|
828
867
|
}
|
829
868
|
|
830
|
-
|
831
|
-
#if !defined(_WIN32) || defined(HAVE_RB_W32_WRAP_IO_HANDLE)
|
832
|
-
|
833
869
|
/*
|
834
870
|
* call-seq:
|
835
871
|
* conn.socket_io() -> IO
|
836
872
|
*
|
837
|
-
* Fetch a
|
873
|
+
* Fetch a memorized IO object created from the Connection's underlying socket.
|
838
874
|
* This object can be used for IO.select to wait for events while running
|
839
875
|
* asynchronous API calls.
|
840
876
|
*
|
841
877
|
* Using this instead of #socket avoids the problem of the underlying connection
|
842
878
|
* being closed by Ruby when an IO created using <tt>IO.for_fd(conn.socket)</tt>
|
843
|
-
* goes out of scope.
|
844
|
-
*
|
845
|
-
* This method can also be used on Windows but requires Ruby-2.0+.
|
879
|
+
* goes out of scope. In contrast to #socket, it also works on Windows.
|
846
880
|
*/
|
847
881
|
static VALUE
|
848
882
|
pgconn_socket_io(VALUE self)
|
@@ -876,8 +910,6 @@ pgconn_socket_io(VALUE self)
|
|
876
910
|
return socket_io;
|
877
911
|
}
|
878
912
|
|
879
|
-
#endif
|
880
|
-
|
881
913
|
/*
|
882
914
|
* call-seq:
|
883
915
|
* conn.backend_pid() -> Integer
|
@@ -1254,7 +1286,7 @@ pgconn_query_assign_typemap( VALUE self, struct query_params_data *paramsData )
|
|
1254
1286
|
* for binary.
|
1255
1287
|
*
|
1256
1288
|
* type_map can be a PG::TypeMap derivation (such as PG::BasicTypeMapForQueries).
|
1257
|
-
* This will type cast the params
|
1289
|
+
* This will type cast the params from various Ruby types before transmission
|
1258
1290
|
* based on the encoders defined by the type map. When a type encoder is used
|
1259
1291
|
* the format and oid of a given bind parameter are retrieved from the encoder
|
1260
1292
|
* instead out of the hash form described above.
|
@@ -1390,7 +1422,7 @@ pgconn_prepare(int argc, VALUE *argv, VALUE self)
|
|
1390
1422
|
* for binary.
|
1391
1423
|
*
|
1392
1424
|
* type_map can be a PG::TypeMap derivation (such as PG::BasicTypeMapForQueries).
|
1393
|
-
* This will type cast the params
|
1425
|
+
* This will type cast the params from various Ruby types before transmission
|
1394
1426
|
* based on the encoders defined by the type map. When a type encoder is used
|
1395
1427
|
* the format and oid of a given bind parameter are retrieved from the encoder
|
1396
1428
|
* instead out of the hash form described above.
|
@@ -1646,12 +1678,13 @@ pgconn_s_unescape_bytea(VALUE self, VALUE str)
|
|
1646
1678
|
return ret;
|
1647
1679
|
}
|
1648
1680
|
|
1649
|
-
#ifdef HAVE_PQESCAPELITERAL
|
1650
1681
|
/*
|
1651
1682
|
* call-seq:
|
1652
1683
|
* conn.escape_literal( str ) -> String
|
1653
1684
|
*
|
1654
1685
|
* Escape an arbitrary String +str+ as a literal.
|
1686
|
+
*
|
1687
|
+
* Available since PostgreSQL-9.0
|
1655
1688
|
*/
|
1656
1689
|
static VALUE
|
1657
1690
|
pgconn_escape_literal(VALUE self, VALUE string)
|
@@ -1682,9 +1715,7 @@ pgconn_escape_literal(VALUE self, VALUE string)
|
|
1682
1715
|
|
1683
1716
|
return result;
|
1684
1717
|
}
|
1685
|
-
#endif
|
1686
1718
|
|
1687
|
-
#ifdef HAVE_PQESCAPEIDENTIFIER
|
1688
1719
|
/*
|
1689
1720
|
* call-seq:
|
1690
1721
|
* conn.escape_identifier( str ) -> String
|
@@ -1694,6 +1725,8 @@ pgconn_escape_literal(VALUE self, VALUE string)
|
|
1694
1725
|
* This method does the same as #quote_ident with a String argument,
|
1695
1726
|
* but it doesn't support an Array argument and it makes use of libpq
|
1696
1727
|
* to process the string.
|
1728
|
+
*
|
1729
|
+
* Available since PostgreSQL-9.0
|
1697
1730
|
*/
|
1698
1731
|
static VALUE
|
1699
1732
|
pgconn_escape_identifier(VALUE self, VALUE string)
|
@@ -1724,9 +1757,7 @@ pgconn_escape_identifier(VALUE self, VALUE string)
|
|
1724
1757
|
|
1725
1758
|
return result;
|
1726
1759
|
}
|
1727
|
-
#endif
|
1728
1760
|
|
1729
|
-
#ifdef HAVE_PQSETSINGLEROWMODE
|
1730
1761
|
/*
|
1731
1762
|
* call-seq:
|
1732
1763
|
* conn.set_single_row_mode -> self
|
@@ -1763,6 +1794,7 @@ pgconn_escape_identifier(VALUE self, VALUE string)
|
|
1763
1794
|
* end
|
1764
1795
|
* end
|
1765
1796
|
*
|
1797
|
+
* Available since PostgreSQL-9.2
|
1766
1798
|
*/
|
1767
1799
|
static VALUE
|
1768
1800
|
pgconn_set_single_row_mode(VALUE self)
|
@@ -1779,7 +1811,6 @@ pgconn_set_single_row_mode(VALUE self)
|
|
1779
1811
|
|
1780
1812
|
return self;
|
1781
1813
|
}
|
1782
|
-
#endif
|
1783
1814
|
|
1784
1815
|
/*
|
1785
1816
|
* call-seq:
|
@@ -1813,7 +1844,7 @@ pgconn_set_single_row_mode(VALUE self)
|
|
1813
1844
|
* for binary.
|
1814
1845
|
*
|
1815
1846
|
* type_map can be a PG::TypeMap derivation (such as PG::BasicTypeMapForQueries).
|
1816
|
-
* This will type cast the params
|
1847
|
+
* This will type cast the params from various Ruby types before transmission
|
1817
1848
|
* based on the encoders defined by the type map. When a type encoder is used
|
1818
1849
|
* the format and oid of a given bind parameter are retrieved from the encoder
|
1819
1850
|
* instead out of the hash form described above.
|
@@ -1953,7 +1984,7 @@ pgconn_send_prepare(int argc, VALUE *argv, VALUE self)
|
|
1953
1984
|
* for binary.
|
1954
1985
|
*
|
1955
1986
|
* type_map can be a PG::TypeMap derivation (such as PG::BasicTypeMapForQueries).
|
1956
|
-
* This will type cast the params
|
1987
|
+
* This will type cast the params from various Ruby types before transmission
|
1957
1988
|
* based on the encoders defined by the type map. When a type encoder is used
|
1958
1989
|
* the format and oid of a given bind parameter are retrieved from the encoder
|
1959
1990
|
* instead out of the hash form described above.
|
@@ -2203,7 +2234,6 @@ pgconn_flush(self)
|
|
2203
2234
|
static VALUE
|
2204
2235
|
pgconn_cancel(VALUE self)
|
2205
2236
|
{
|
2206
|
-
#ifdef HAVE_PQGETCANCEL
|
2207
2237
|
char errbuf[256];
|
2208
2238
|
PGcancel *cancel;
|
2209
2239
|
VALUE retval;
|
@@ -2221,9 +2251,6 @@ pgconn_cancel(VALUE self)
|
|
2221
2251
|
|
2222
2252
|
PQfreeCancel(cancel);
|
2223
2253
|
return retval;
|
2224
|
-
#else
|
2225
|
-
rb_notimplement();
|
2226
|
-
#endif
|
2227
2254
|
}
|
2228
2255
|
|
2229
2256
|
|
@@ -2267,45 +2294,8 @@ pgconn_notifies(VALUE self)
|
|
2267
2294
|
return hash;
|
2268
2295
|
}
|
2269
2296
|
|
2270
|
-
/* Win32 + Ruby 1.8 */
|
2271
|
-
#if !defined( HAVE_RUBY_VM_H ) && defined( _WIN32 )
|
2272
|
-
|
2273
|
-
/*
|
2274
|
-
* Duplicate the sockets from libpq and create temporary CRT FDs
|
2275
|
-
*/
|
2276
|
-
void create_crt_fd(fd_set *os_set, fd_set *crt_set)
|
2277
|
-
{
|
2278
|
-
int i;
|
2279
|
-
crt_set->fd_count = os_set->fd_count;
|
2280
|
-
for (i = 0; i < os_set->fd_count; i++) {
|
2281
|
-
WSAPROTOCOL_INFO wsa_pi;
|
2282
|
-
/* dupicate the SOCKET */
|
2283
|
-
int r = WSADuplicateSocket(os_set->fd_array[i], GetCurrentProcessId(), &wsa_pi);
|
2284
|
-
SOCKET s = WSASocket(wsa_pi.iAddressFamily, wsa_pi.iSocketType, wsa_pi.iProtocol, &wsa_pi, 0, 0);
|
2285
|
-
/* create the CRT fd so ruby can get back to the SOCKET */
|
2286
|
-
int fd = _open_osfhandle(s, O_RDWR|O_BINARY);
|
2287
|
-
os_set->fd_array[i] = s;
|
2288
|
-
crt_set->fd_array[i] = fd;
|
2289
|
-
}
|
2290
|
-
}
|
2291
|
-
|
2292
|
-
/*
|
2293
|
-
* Clean up the CRT FDs from create_crt_fd()
|
2294
|
-
*/
|
2295
|
-
void cleanup_crt_fd(fd_set *os_set, fd_set *crt_set)
|
2296
|
-
{
|
2297
|
-
int i;
|
2298
|
-
for (i = 0; i < os_set->fd_count; i++) {
|
2299
|
-
/* cleanup the CRT fd */
|
2300
|
-
_close(crt_set->fd_array[i]);
|
2301
|
-
/* cleanup the duplicated SOCKET */
|
2302
|
-
closesocket(os_set->fd_array[i]);
|
2303
|
-
}
|
2304
|
-
}
|
2305
|
-
#endif
|
2306
|
-
|
2307
2297
|
/* Win32 + Ruby 1.9+ */
|
2308
|
-
#if defined(
|
2298
|
+
#if defined( _WIN32 )
|
2309
2299
|
/*
|
2310
2300
|
* On Windows, use platform-specific strategies to wait for the socket
|
2311
2301
|
* instead of rb_thread_select().
|
@@ -2393,7 +2383,7 @@ wait_socket_readable( PGconn *conn, struct timeval *ptimeout, void *(*is_readabl
|
|
2393
2383
|
|
2394
2384
|
#else
|
2395
2385
|
|
2396
|
-
/* non Win32
|
2386
|
+
/* non Win32 */
|
2397
2387
|
|
2398
2388
|
static void *
|
2399
2389
|
wait_socket_readable( PGconn *conn, struct timeval *ptimeout, void *(*is_readable)(PGconn *))
|
@@ -2403,9 +2393,6 @@ wait_socket_readable( PGconn *conn, struct timeval *ptimeout, void *(*is_readabl
|
|
2403
2393
|
void *retval;
|
2404
2394
|
rb_fdset_t sd_rset;
|
2405
2395
|
struct timeval aborttime={0,0}, currtime, waittime;
|
2406
|
-
#ifdef _WIN32
|
2407
|
-
rb_fdset_t crt_sd_rset;
|
2408
|
-
#endif
|
2409
2396
|
|
2410
2397
|
if ( sd < 0 )
|
2411
2398
|
rb_raise(rb_eConnectionBad, "PQsocket() can't get socket descriptor");
|
@@ -2425,14 +2412,6 @@ wait_socket_readable( PGconn *conn, struct timeval *ptimeout, void *(*is_readabl
|
|
2425
2412
|
rb_fd_zero( &sd_rset );
|
2426
2413
|
rb_fd_set( sd, &sd_rset );
|
2427
2414
|
|
2428
|
-
#ifdef _WIN32
|
2429
|
-
/* Ruby's FD_SET is modified on win32 to convert a file descriptor
|
2430
|
-
* to osfhandle, but we already get a osfhandle from PQsocket().
|
2431
|
-
* Therefore it's overwritten here. */
|
2432
|
-
sd_rset.fd_array[0] = sd;
|
2433
|
-
create_crt_fd(&sd_rset, &crt_sd_rset);
|
2434
|
-
#endif
|
2435
|
-
|
2436
2415
|
if ( ptimeout ) {
|
2437
2416
|
gettimeofday(&currtime, NULL);
|
2438
2417
|
timersub(&aborttime, &currtime, &waittime);
|
@@ -2446,11 +2425,6 @@ wait_socket_readable( PGconn *conn, struct timeval *ptimeout, void *(*is_readabl
|
|
2446
2425
|
ret = 0;
|
2447
2426
|
}
|
2448
2427
|
|
2449
|
-
|
2450
|
-
#ifdef _WIN32
|
2451
|
-
cleanup_crt_fd(&sd_rset, &crt_sd_rset);
|
2452
|
-
#endif
|
2453
|
-
|
2454
2428
|
if ( ret < 0 ){
|
2455
2429
|
rb_fd_term( &sd_rset );
|
2456
2430
|
rb_sys_fail( "rb_thread_select()" );
|
@@ -2528,12 +2502,10 @@ pgconn_wait_for_notify(int argc, VALUE *argv, VALUE self)
|
|
2528
2502
|
relname = rb_tainted_str_new2( pnotification->relname );
|
2529
2503
|
PG_ENCODING_SET_NOCHECK( relname, ENCODING_GET(self) );
|
2530
2504
|
be_pid = INT2NUM( pnotification->be_pid );
|
2531
|
-
#ifdef HAVE_ST_NOTIFY_EXTRA
|
2532
2505
|
if ( *pnotification->extra ) {
|
2533
2506
|
extra = rb_tainted_str_new2( pnotification->extra );
|
2534
2507
|
PG_ENCODING_SET_NOCHECK( extra, ENCODING_GET(self) );
|
2535
2508
|
}
|
2536
|
-
#endif
|
2537
2509
|
PQfreemem( pnotification );
|
2538
2510
|
|
2539
2511
|
if ( rb_block_given_p() )
|
@@ -2552,9 +2524,10 @@ pgconn_wait_for_notify(int argc, VALUE *argv, VALUE self)
|
|
2552
2524
|
* not sent (false is only possible if the connection
|
2553
2525
|
* is in nonblocking mode, and this command would block).
|
2554
2526
|
*
|
2555
|
-
*
|
2556
|
-
* This encodes the
|
2557
|
-
*
|
2527
|
+
* _encoder_ can be a PG::Coder derivation (typically PG::TextEncoder::CopyRow).
|
2528
|
+
* This encodes the data fields given as _buffer_ from an Array of Strings to
|
2529
|
+
* PostgreSQL's COPY text format inclusive proper escaping. Optionally
|
2530
|
+
* the encoder can type cast the fields from various Ruby types in one step,
|
2558
2531
|
* if PG::TextEncoder::CopyRow#type_map is set accordingly.
|
2559
2532
|
*
|
2560
2533
|
* Raises an exception if an error occurs.
|
@@ -2665,8 +2638,9 @@ pgconn_put_copy_end(int argc, VALUE *argv, VALUE self)
|
|
2665
2638
|
* if the copy is done, or +false+ if the call would
|
2666
2639
|
* block (only possible if _async_ is true).
|
2667
2640
|
*
|
2668
|
-
*
|
2669
|
-
* This decodes the received data fields
|
2641
|
+
* _decoder_ can be a PG::Coder derivation (typically PG::TextDecoder::CopyRow).
|
2642
|
+
* This decodes the received data fields from PostgreSQL's COPY text format to an
|
2643
|
+
* Array of Strings. Optionally
|
2670
2644
|
* the decoder can type cast the fields to various Ruby types in one step,
|
2671
2645
|
* if PG::TextDecoder::CopyRow#type_map is set accordingly.
|
2672
2646
|
*
|
@@ -2968,11 +2942,9 @@ pgconn_set_client_encoding(VALUE self, VALUE str)
|
|
2968
2942
|
Check_Type(str, T_STRING);
|
2969
2943
|
|
2970
2944
|
if ( (gvl_PQsetClientEncoding(conn, StringValueCStr(str))) == -1 ) {
|
2971
|
-
rb_raise(rb_ePGerror, "
|
2945
|
+
rb_raise(rb_ePGerror, "%s", PQerrorMessage(conn));
|
2972
2946
|
}
|
2973
|
-
#ifdef M17N_SUPPORTED
|
2974
2947
|
pgconn_set_internal_encoding_index( self );
|
2975
|
-
#endif
|
2976
2948
|
|
2977
2949
|
return Qnil;
|
2978
2950
|
}
|
@@ -3198,14 +3170,13 @@ pgconn_async_exec(int argc, VALUE *argv, VALUE self)
|
|
3198
3170
|
|
3199
3171
|
|
3200
3172
|
#ifdef HAVE_PQSSLATTRIBUTE
|
3201
|
-
/* Since PostgreSQL-9.5: */
|
3202
|
-
|
3203
3173
|
/*
|
3204
3174
|
* call-seq:
|
3205
3175
|
* conn.ssl_in_use? -> Boolean
|
3206
3176
|
*
|
3207
3177
|
* Returns +true+ if the connection uses SSL, +false+ if not.
|
3208
3178
|
*
|
3179
|
+
* Available since PostgreSQL-9.5
|
3209
3180
|
*/
|
3210
3181
|
static VALUE
|
3211
3182
|
pgconn_ssl_in_use(VALUE self)
|
@@ -3238,6 +3209,8 @@ pgconn_ssl_in_use(VALUE self)
|
|
3238
3209
|
*
|
3239
3210
|
*
|
3240
3211
|
* See also #ssl_attribute_names and http://www.postgresql.org/docs/current/interactive/libpq-status.html#LIBPQ-PQSSLATTRIBUTE
|
3212
|
+
*
|
3213
|
+
* Available since PostgreSQL-9.5
|
3241
3214
|
*/
|
3242
3215
|
static VALUE
|
3243
3216
|
pgconn_ssl_attribute(VALUE self, VALUE attribute_name)
|
@@ -3256,6 +3229,7 @@ pgconn_ssl_attribute(VALUE self, VALUE attribute_name)
|
|
3256
3229
|
*
|
3257
3230
|
* See also #ssl_attribute
|
3258
3231
|
*
|
3232
|
+
* Available since PostgreSQL-9.5
|
3259
3233
|
*/
|
3260
3234
|
static VALUE
|
3261
3235
|
pgconn_ssl_attribute_names(VALUE self)
|
@@ -3566,8 +3540,6 @@ pgconn_lounlink(VALUE self, VALUE in_oid)
|
|
3566
3540
|
}
|
3567
3541
|
|
3568
3542
|
|
3569
|
-
#ifdef M17N_SUPPORTED
|
3570
|
-
|
3571
3543
|
void
|
3572
3544
|
pgconn_set_internal_encoding_index( VALUE self )
|
3573
3545
|
{
|
@@ -3729,8 +3701,6 @@ pgconn_set_default_encoding( VALUE self )
|
|
3729
3701
|
}
|
3730
3702
|
|
3731
3703
|
|
3732
|
-
#endif /* M17N_SUPPORTED */
|
3733
|
-
|
3734
3704
|
/*
|
3735
3705
|
* call-seq:
|
3736
3706
|
* res.type_map_for_queries = typemap
|
@@ -3939,9 +3909,7 @@ init_pg_connection()
|
|
3939
3909
|
rb_define_singleton_method(rb_cPGconn, "quote_ident", pgconn_s_quote_ident, 1);
|
3940
3910
|
rb_define_singleton_method(rb_cPGconn, "connect_start", pgconn_s_connect_start, -1);
|
3941
3911
|
rb_define_singleton_method(rb_cPGconn, "conndefaults", pgconn_s_conndefaults, 0);
|
3942
|
-
#ifdef HAVE_PQPING
|
3943
3912
|
rb_define_singleton_method(rb_cPGconn, "ping", pgconn_s_ping, -1);
|
3944
|
-
#endif
|
3945
3913
|
|
3946
3914
|
/****** PG::Connection INSTANCE METHODS: Connection Control ******/
|
3947
3915
|
rb_define_method(rb_cPGconn, "initialize", pgconn_init, -1);
|
@@ -3971,9 +3939,7 @@ init_pg_connection()
|
|
3971
3939
|
rb_define_method(rb_cPGconn, "server_version", pgconn_server_version, 0);
|
3972
3940
|
rb_define_method(rb_cPGconn, "error_message", pgconn_error_message, 0);
|
3973
3941
|
rb_define_method(rb_cPGconn, "socket", pgconn_socket, 0);
|
3974
|
-
#if !defined(_WIN32) || defined(HAVE_RB_W32_WRAP_IO_HANDLE)
|
3975
3942
|
rb_define_method(rb_cPGconn, "socket_io", pgconn_socket_io, 0);
|
3976
|
-
#endif
|
3977
3943
|
rb_define_method(rb_cPGconn, "backend_pid", pgconn_backend_pid, 0);
|
3978
3944
|
rb_define_method(rb_cPGconn, "connection_needs_password", pgconn_connection_needs_password, 0);
|
3979
3945
|
rb_define_method(rb_cPGconn, "connection_used_password", pgconn_connection_used_password, 0);
|
@@ -3990,17 +3956,11 @@ init_pg_connection()
|
|
3990
3956
|
rb_define_method(rb_cPGconn, "make_empty_pgresult", pgconn_make_empty_pgresult, 1);
|
3991
3957
|
rb_define_method(rb_cPGconn, "escape_string", pgconn_s_escape, 1);
|
3992
3958
|
rb_define_alias(rb_cPGconn, "escape", "escape_string");
|
3993
|
-
#ifdef HAVE_PQESCAPELITERAL
|
3994
3959
|
rb_define_method(rb_cPGconn, "escape_literal", pgconn_escape_literal, 1);
|
3995
|
-
#endif
|
3996
|
-
#ifdef HAVE_PQESCAPEIDENTIFIER
|
3997
3960
|
rb_define_method(rb_cPGconn, "escape_identifier", pgconn_escape_identifier, 1);
|
3998
|
-
#endif
|
3999
3961
|
rb_define_method(rb_cPGconn, "escape_bytea", pgconn_s_escape_bytea, 1);
|
4000
3962
|
rb_define_method(rb_cPGconn, "unescape_bytea", pgconn_s_unescape_bytea, 1);
|
4001
|
-
#ifdef HAVE_PQSETSINGLEROWMODE
|
4002
3963
|
rb_define_method(rb_cPGconn, "set_single_row_mode", pgconn_set_single_row_mode, 0);
|
4003
|
-
#endif
|
4004
3964
|
|
4005
3965
|
/****** PG::Connection INSTANCE METHODS: Asynchronous Command Processing ******/
|
4006
3966
|
rb_define_method(rb_cPGconn, "send_query", pgconn_send_query, -1);
|
@@ -4048,6 +4008,9 @@ init_pg_connection()
|
|
4048
4008
|
rb_define_method(rb_cPGconn, "async_exec", pgconn_async_exec, -1);
|
4049
4009
|
rb_define_alias(rb_cPGconn, "async_query", "async_exec");
|
4050
4010
|
rb_define_method(rb_cPGconn, "get_last_result", pgconn_get_last_result, 0);
|
4011
|
+
#ifdef HAVE_PQENCRYPTPASSWORDCONN
|
4012
|
+
rb_define_method(rb_cPGconn, "encrypt_password", pgconn_encrypt_password, -1);
|
4013
|
+
#endif
|
4051
4014
|
|
4052
4015
|
#ifdef HAVE_PQSSLATTRIBUTE
|
4053
4016
|
rb_define_method(rb_cPGconn, "ssl_in_use?", pgconn_ssl_in_use, 0);
|
@@ -4083,12 +4046,10 @@ init_pg_connection()
|
|
4083
4046
|
rb_define_method(rb_cPGconn, "lo_unlink", pgconn_lounlink, 1);
|
4084
4047
|
rb_define_alias(rb_cPGconn, "lounlink", "lo_unlink");
|
4085
4048
|
|
4086
|
-
#ifdef M17N_SUPPORTED
|
4087
4049
|
rb_define_method(rb_cPGconn, "internal_encoding", pgconn_internal_encoding, 0);
|
4088
4050
|
rb_define_method(rb_cPGconn, "internal_encoding=", pgconn_internal_encoding_set, 1);
|
4089
4051
|
rb_define_method(rb_cPGconn, "external_encoding", pgconn_external_encoding, 0);
|
4090
4052
|
rb_define_method(rb_cPGconn, "set_default_encoding", pgconn_set_default_encoding, 0);
|
4091
|
-
#endif /* M17N_SUPPORTED */
|
4092
4053
|
|
4093
4054
|
rb_define_method(rb_cPGconn, "type_map_for_queries=", pgconn_type_map_for_queries_set, 1);
|
4094
4055
|
rb_define_method(rb_cPGconn, "type_map_for_queries", pgconn_type_map_for_queries_get, 0);
|