pg 1.1.0.pre20180730171000 → 1.1.4
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.tar.gz.sig +0 -0
- data/ChangeLog +6595 -0
- data/History.rdoc +24 -6
- data/Manifest.txt +70 -2
- data/Rakefile +2 -3
- data/Rakefile.cross +3 -3
- data/ext/errorcodes.def +4 -0
- data/ext/errorcodes.txt +2 -1
- data/ext/pg.c +9 -4
- data/ext/pg.h +18 -6
- data/ext/pg_binary_decoder.c +10 -6
- data/ext/pg_binary_encoder.c +1 -1
- data/ext/pg_connection.c +31 -29
- data/ext/pg_result.c +2 -0
- data/ext/pg_text_decoder.c +1 -1
- data/ext/pg_text_encoder.c +6 -7
- data/ext/pg_tuple.c +4 -3
- 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/pg.rb +2 -2
- data/spec/helpers.rb +8 -8
- data/spec/pg/basic_type_mapping_spec.rb +5 -5
- data/spec/pg/connection_spec.rb +131 -17
- data/spec/pg/tuple_spec.rb +16 -2
- data/spec/pg/type_spec.rb +6 -0
- metadata +38 -79
- metadata.gz.sig +0 -0
- data/.gems +0 -6
- data/.hgignore +0 -21
- data/.hgsigs +0 -29
- data/.hgtags +0 -36
- data/.hoerc +0 -2
- data/.irbrc +0 -23
- data/.pryrc +0 -23
- data/.tm_properties +0 -21
- data/.travis.yml +0 -41
- data/Gemfile +0 -2
- data/appveyor.yml +0 -50
- data/certs/ged.pem +0 -26
- data/misc/openssl-pg-segfault.rb +0 -31
- data/misc/postgres/History.txt +0 -9
- data/misc/postgres/Manifest.txt +0 -5
- data/misc/postgres/README.txt +0 -21
- data/misc/postgres/Rakefile +0 -21
- data/misc/postgres/lib/postgres.rb +0 -16
- data/misc/ruby-pg/History.txt +0 -9
- data/misc/ruby-pg/Manifest.txt +0 -5
- data/misc/ruby-pg/README.txt +0 -21
- data/misc/ruby-pg/Rakefile +0 -21
- data/misc/ruby-pg/lib/ruby/pg.rb +0 -16
- data/pg.gemspec +0 -61
- data/sample/array_insert.rb +0 -20
- data/sample/async_api.rb +0 -106
- data/sample/async_copyto.rb +0 -39
- data/sample/async_mixed.rb +0 -56
- data/sample/check_conn.rb +0 -21
- data/sample/copydata.rb +0 -71
- data/sample/copyfrom.rb +0 -81
- data/sample/copyto.rb +0 -19
- data/sample/cursor.rb +0 -21
- data/sample/disk_usage_report.rb +0 -177
- data/sample/issue-119.rb +0 -94
- data/sample/losample.rb +0 -69
- data/sample/minimal-testcase.rb +0 -17
- data/sample/notify_wait.rb +0 -72
- data/sample/pg_statistics.rb +0 -285
- data/sample/replication_monitor.rb +0 -222
- data/sample/test_binary_values.rb +0 -33
- data/sample/wal_shipper.rb +0 -434
- data/sample/warehouse_partitions.rb +0 -311
data/History.rdoc
CHANGED
@@ -1,12 +1,29 @@
|
|
1
|
-
==
|
1
|
+
== v1.1.4 [2019-01-08] Michael Granger <ged@FaerieMUD.org>
|
2
2
|
|
3
|
-
|
4
|
-
-
|
3
|
+
- Fix PG::BinaryDecoder::Timestamp on 32 bit systems. # 284
|
4
|
+
- Add new error-codes of PostgreSQL-11.
|
5
|
+
- Add ruby-2.6 support for Windows fat binary gems and remove ruby-2.0 and 2.1.
|
5
6
|
|
6
7
|
|
7
|
-
== v1.1.
|
8
|
+
== v1.1.3 [2018-09-06] Michael Granger <ged@FaerieMUD.org>
|
8
9
|
|
9
|
-
|
10
|
+
- Revert opimization that was sometimes causing EBADF in rb_wait_for_single_fd().
|
11
|
+
|
12
|
+
|
13
|
+
== v1.1.2 [2018-08-28] Michael Granger <ged@FaerieMUD.org>
|
14
|
+
|
15
|
+
- Don't generate aliases for JOHAB encoding.
|
16
|
+
This avoids linking to deprecated/private function rb_enc(db)_alias().
|
17
|
+
|
18
|
+
|
19
|
+
== v1.1.1 [2018-08-27] Michael Granger <ged@FaerieMUD.org>
|
20
|
+
|
21
|
+
- Reduce deprecation warnings to only one message per deprecation.
|
22
|
+
|
23
|
+
|
24
|
+
== v1.1.0 [2018-08-24] Michael Granger <ged@FaerieMUD.org>
|
25
|
+
|
26
|
+
Deprecated (disable warnings per PG_SKIP_DEPRECATION_WARNING=1):
|
10
27
|
- Forwarding conn.exec to conn.exec_params is deprecated.
|
11
28
|
- Forwarding conn.exec_params to conn.exec is deprecated.
|
12
29
|
- Forwarding conn.async_exec to conn.async_exec_params.
|
@@ -20,10 +37,11 @@ PG::Connection enhancements:
|
|
20
37
|
They are identical to their syncronous counterpart, but make use of PostgreSQL's async API.
|
21
38
|
- Replace `rb_thread_fd_select()` by faster `rb_wait_for_single_fd()` in `conn.block` and `conn.async_exec` .
|
22
39
|
- Add PG::Connection#discard_results .
|
40
|
+
- Raise an ArgumentError for strings containing zero bytes by #escape, #escape_literal, #escape_identifier, #quote_ident and PG::TextEncoder::Identifier. These methods previously truncated strings.
|
23
41
|
|
24
42
|
Result retrieval enhancements:
|
25
43
|
- Add PG::Result#tuple_values to retrieve all field values of a row as array.
|
26
|
-
- Add PG::Tuple, PG::Result#
|
44
|
+
- Add PG::Tuple, PG::Result#tuple and PG::Result#stream_each_tuple .
|
27
45
|
PG::Tuple offers a way to lazy cast result values.
|
28
46
|
- Estimate PG::Result size allocated by libpq and notify the garbage collector about it when running on Ruby-2.4 or newer.
|
29
47
|
- Make the estimated PG::Result size available to ObjectSpace.memsize_of(result) .
|
data/Manifest.txt
CHANGED
@@ -1,4 +1,72 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
.gemtest
|
2
|
+
BSDL
|
3
|
+
ChangeLog
|
4
|
+
Contributors.rdoc
|
5
|
+
History.rdoc
|
6
|
+
LICENSE
|
7
|
+
Manifest.txt
|
8
|
+
POSTGRES
|
9
|
+
README-OS_X.rdoc
|
10
|
+
README-Windows.rdoc
|
11
|
+
README.ja.rdoc
|
3
12
|
README.rdoc
|
13
|
+
Rakefile
|
14
|
+
Rakefile.cross
|
15
|
+
ext/errorcodes.def
|
16
|
+
ext/errorcodes.rb
|
17
|
+
ext/errorcodes.txt
|
18
|
+
ext/extconf.rb
|
19
|
+
ext/gvl_wrappers.c
|
20
|
+
ext/gvl_wrappers.h
|
21
|
+
ext/pg.c
|
22
|
+
ext/pg.h
|
23
|
+
ext/pg_binary_decoder.c
|
24
|
+
ext/pg_binary_encoder.c
|
25
|
+
ext/pg_coder.c
|
26
|
+
ext/pg_connection.c
|
27
|
+
ext/pg_copy_coder.c
|
28
|
+
ext/pg_errors.c
|
29
|
+
ext/pg_result.c
|
30
|
+
ext/pg_text_decoder.c
|
31
|
+
ext/pg_text_encoder.c
|
32
|
+
ext/pg_tuple.c
|
33
|
+
ext/pg_type_map.c
|
34
|
+
ext/pg_type_map_all_strings.c
|
35
|
+
ext/pg_type_map_by_class.c
|
36
|
+
ext/pg_type_map_by_column.c
|
37
|
+
ext/pg_type_map_by_mri_type.c
|
38
|
+
ext/pg_type_map_by_oid.c
|
39
|
+
ext/pg_type_map_in_ruby.c
|
40
|
+
ext/util.c
|
41
|
+
ext/util.h
|
42
|
+
ext/vc/pg.sln
|
43
|
+
ext/vc/pg_18/pg.vcproj
|
44
|
+
ext/vc/pg_19/pg_19.vcproj
|
4
45
|
lib/pg.rb
|
46
|
+
lib/pg/basic_type_mapping.rb
|
47
|
+
lib/pg/binary_decoder.rb
|
48
|
+
lib/pg/coder.rb
|
49
|
+
lib/pg/connection.rb
|
50
|
+
lib/pg/constants.rb
|
51
|
+
lib/pg/exceptions.rb
|
52
|
+
lib/pg/result.rb
|
53
|
+
lib/pg/text_decoder.rb
|
54
|
+
lib/pg/text_encoder.rb
|
55
|
+
lib/pg/tuple.rb
|
56
|
+
lib/pg/type_map_by_column.rb
|
57
|
+
spec/data/expected_trace.out
|
58
|
+
spec/data/random_binary_data
|
59
|
+
spec/helpers.rb
|
60
|
+
spec/pg/basic_type_mapping_spec.rb
|
61
|
+
spec/pg/connection_spec.rb
|
62
|
+
spec/pg/connection_sync_spec.rb
|
63
|
+
spec/pg/result_spec.rb
|
64
|
+
spec/pg/tuple_spec.rb
|
65
|
+
spec/pg/type_map_by_class_spec.rb
|
66
|
+
spec/pg/type_map_by_column_spec.rb
|
67
|
+
spec/pg/type_map_by_mri_type_spec.rb
|
68
|
+
spec/pg/type_map_by_oid_spec.rb
|
69
|
+
spec/pg/type_map_in_ruby_spec.rb
|
70
|
+
spec/pg/type_map_spec.rb
|
71
|
+
spec/pg/type_spec.rb
|
72
|
+
spec/pg_spec.rb
|
data/Rakefile
CHANGED
@@ -55,14 +55,13 @@ $hoespec = Hoe.spec 'pg' do
|
|
55
55
|
self.extra_rdoc_files = Rake::FileList[ '*.rdoc' ]
|
56
56
|
self.extra_rdoc_files.include( 'POSTGRES', 'LICENSE' )
|
57
57
|
self.extra_rdoc_files.include( 'ext/*.c' )
|
58
|
-
self.spec_extras[:files] = `hg manifest || git ls-files`.split
|
59
58
|
self.license 'BSD-3-Clause'
|
60
59
|
|
61
60
|
self.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
62
61
|
self.developer 'Lars Kanis', 'lars@greiz-reinsdorf.de'
|
63
62
|
|
64
63
|
self.dependency 'rake-compiler', '~> 1.0', :developer
|
65
|
-
self.dependency 'rake-compiler-dock', ['~> 0.
|
64
|
+
self.dependency 'rake-compiler-dock', ['~> 0.7.0'], :developer
|
66
65
|
self.dependency 'hoe-deveiate', '~> 0.9', :developer
|
67
66
|
self.dependency 'hoe-bundler', '~> 1.0', :developer
|
68
67
|
self.dependency 'rspec', '~> 3.5', :developer
|
@@ -185,7 +184,7 @@ end
|
|
185
184
|
|
186
185
|
desc "Update list of server error codes"
|
187
186
|
task :update_error_codes do
|
188
|
-
URL_ERRORCODES_TXT = "http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/utils/errcodes.txt;hb=refs/tags/
|
187
|
+
URL_ERRORCODES_TXT = "http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/utils/errcodes.txt;hb=refs/tags/REL_11_1"
|
189
188
|
|
190
189
|
ERRORCODES_TXT = "ext/errorcodes.txt"
|
191
190
|
sh "wget #{URL_ERRORCODES_TXT.inspect} -O #{ERRORCODES_TXT.inspect} || curl #{URL_ERRORCODES_TXT.inspect} -o #{ERRORCODES_TXT.inspect}"
|
data/Rakefile.cross
CHANGED
@@ -29,8 +29,8 @@ class CrossLibrary < OpenStruct
|
|
29
29
|
self.host_platform = toolchain
|
30
30
|
|
31
31
|
# Cross-compilation constants
|
32
|
-
self.openssl_version = ENV['OPENSSL_VERSION'] || '1.1.
|
33
|
-
self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '
|
32
|
+
self.openssl_version = ENV['OPENSSL_VERSION'] || '1.1.1a'
|
33
|
+
self.postgresql_version = ENV['POSTGRESQL_VERSION'] || '11.1'
|
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.
|
@@ -293,6 +293,6 @@ task 'gem:windows' => ['ChangeLog'] do
|
|
293
293
|
mkdir ~/.gem &&
|
294
294
|
(cp build/gem/gem-*.pem ~/.gem/ || true) &&
|
295
295
|
bundle install --local &&
|
296
|
-
rake cross native gem
|
296
|
+
rake cross native gem MAKE="make -j`nproc`"
|
297
297
|
EOT
|
298
298
|
end
|
data/ext/errorcodes.def
CHANGED
@@ -186,6 +186,10 @@
|
|
186
186
|
VALUE klass = define_error_class( "InvalidParameterValue", "22" );
|
187
187
|
register_error_class( "22023", klass );
|
188
188
|
}
|
189
|
+
{
|
190
|
+
VALUE klass = define_error_class( "InvalidPrecedingOrFollowingSize", "22" );
|
191
|
+
register_error_class( "22013", klass );
|
192
|
+
}
|
189
193
|
{
|
190
194
|
VALUE klass = define_error_class( "InvalidRegularExpression", "22" );
|
191
195
|
register_error_class( "2201B", klass );
|
data/ext/errorcodes.txt
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# errcodes.txt
|
3
3
|
# PostgreSQL error codes
|
4
4
|
#
|
5
|
-
# Copyright (c) 2003-
|
5
|
+
# Copyright (c) 2003-2018, PostgreSQL Global Development Group
|
6
6
|
#
|
7
7
|
# This list serves as the basis for generating source files containing error
|
8
8
|
# codes. It is kept in a common format to make sure all these source files have
|
@@ -177,6 +177,7 @@ Section: Class 22 - Data Exception
|
|
177
177
|
22P06 E ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER nonstandard_use_of_escape_character
|
178
178
|
22010 E ERRCODE_INVALID_INDICATOR_PARAMETER_VALUE invalid_indicator_parameter_value
|
179
179
|
22023 E ERRCODE_INVALID_PARAMETER_VALUE invalid_parameter_value
|
180
|
+
22013 E ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE invalid_preceding_or_following_size
|
180
181
|
2201B E ERRCODE_INVALID_REGULAR_EXPRESSION invalid_regular_expression
|
181
182
|
2201W E ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE invalid_row_count_in_limit_clause
|
182
183
|
2201X E ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE invalid_row_count_in_result_offset_clause
|
data/ext/pg.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* pg.c - Toplevel extension
|
3
|
-
* $Id$
|
3
|
+
* $Id: pg.c,v 2d334508484a 2018/08/27 11:33:43 lars $
|
4
4
|
*
|
5
5
|
* Author/s:
|
6
6
|
*
|
@@ -48,6 +48,7 @@
|
|
48
48
|
|
49
49
|
#include "pg.h"
|
50
50
|
|
51
|
+
int pg_skip_deprecation_warning;
|
51
52
|
VALUE rb_mPG;
|
52
53
|
VALUE rb_mPGconstants;
|
53
54
|
|
@@ -142,9 +143,6 @@ pg_find_or_create_johab(void)
|
|
142
143
|
}
|
143
144
|
|
144
145
|
enc_index = rb_define_dummy_encoding(aliases[0]);
|
145
|
-
for (i = 1; i < sizeof(aliases)/sizeof(aliases[0]); ++i) {
|
146
|
-
rb_enc_alias(aliases[i], aliases[0]);
|
147
|
-
}
|
148
146
|
return rb_enc_from_index(enc_index);
|
149
147
|
}
|
150
148
|
|
@@ -381,6 +379,13 @@ pg_s_init_ssl(VALUE self, VALUE do_ssl)
|
|
381
379
|
void
|
382
380
|
Init_pg_ext()
|
383
381
|
{
|
382
|
+
if( RTEST(rb_eval_string("ENV['PG_SKIP_DEPRECATION_WARNING']")) ){
|
383
|
+
/* Set all bits to disable all deprecation warnings. */
|
384
|
+
pg_skip_deprecation_warning = 0xFFFF;
|
385
|
+
} else {
|
386
|
+
pg_skip_deprecation_warning = 0;
|
387
|
+
}
|
388
|
+
|
384
389
|
rb_mPG = rb_define_module( "PG" );
|
385
390
|
rb_mPGconstants = rb_define_module_under( rb_mPG, "Constants" );
|
386
391
|
|
data/ext/pg.h
CHANGED
@@ -21,9 +21,6 @@
|
|
21
21
|
#include "ruby/st.h"
|
22
22
|
#include "ruby/encoding.h"
|
23
23
|
|
24
|
-
/* exported by ruby-1.9.3+ but not declared */
|
25
|
-
extern int rb_enc_alias(const char *, const char *);
|
26
|
-
|
27
24
|
#define PG_ENCODING_SET_NOCHECK(obj,i) \
|
28
25
|
do { \
|
29
26
|
if ((i) < ENCODING_INLINE_MAX) \
|
@@ -104,11 +101,13 @@ typedef struct {
|
|
104
101
|
/* Kind of PG::Coder object for casting COPY rows to ruby values */
|
105
102
|
VALUE decoder_for_get_copy_data;
|
106
103
|
|
107
|
-
/* The connection socket, used for rb_wait_for_single_fd() */
|
108
|
-
int socket;
|
109
|
-
|
110
104
|
/* enable/disable guessing size of PGresult's allocated memory */
|
111
105
|
int guess_result_memsize;
|
106
|
+
|
107
|
+
#if defined(_WIN32)
|
108
|
+
/* File descriptor to be used for rb_w32_unwrap_io_handle() */
|
109
|
+
int ruby_sd;
|
110
|
+
#endif
|
112
111
|
} t_pg_connection;
|
113
112
|
|
114
113
|
typedef struct pg_coder t_pg_coder;
|
@@ -217,6 +216,7 @@ typedef struct {
|
|
217
216
|
* Globals
|
218
217
|
**************************************************************************/
|
219
218
|
|
219
|
+
extern int pg_skip_deprecation_warning;
|
220
220
|
extern VALUE rb_mPG;
|
221
221
|
extern VALUE rb_ePGerror;
|
222
222
|
extern VALUE rb_eServerError;
|
@@ -350,4 +350,16 @@ rb_encoding *pg_conn_enc_get _(( PGconn * ));
|
|
350
350
|
void notice_receiver_proxy(void *arg, const PGresult *result);
|
351
351
|
void notice_processor_proxy(void *arg, const char *message);
|
352
352
|
|
353
|
+
/* reports if `-W' specified and PG_SKIP_DEPRECATION_WARNING environment variable isn't set
|
354
|
+
*
|
355
|
+
* message_id identifies the warning, so that it's reported only once.
|
356
|
+
*/
|
357
|
+
#define pg_deprecated(message_id, format_args) \
|
358
|
+
do { \
|
359
|
+
if( !(pg_skip_deprecation_warning & (1 << message_id)) ){ \
|
360
|
+
pg_skip_deprecation_warning |= 1 << message_id; \
|
361
|
+
rb_warning format_args; \
|
362
|
+
} \
|
363
|
+
} while(0);
|
364
|
+
|
353
365
|
#endif /* end __pg_h */
|
data/ext/pg_binary_decoder.c
CHANGED
@@ -154,7 +154,8 @@ static VALUE
|
|
154
154
|
pg_bin_dec_timestamp(t_pg_coder *conv, const char *val, int len, int tuple, int field, int enc_idx)
|
155
155
|
{
|
156
156
|
int64_t timestamp;
|
157
|
-
|
157
|
+
int64_t sec;
|
158
|
+
int64_t nsec;
|
158
159
|
VALUE t;
|
159
160
|
|
160
161
|
if( len != sizeof(timestamp) ){
|
@@ -171,14 +172,17 @@ pg_bin_dec_timestamp(t_pg_coder *conv, const char *val, int len, int tuple, int
|
|
171
172
|
default:
|
172
173
|
/* PostgreSQL's timestamp is based on year 2000 and Ruby's time is based on 1970.
|
173
174
|
* Adjust the 30 years difference. */
|
174
|
-
|
175
|
-
|
175
|
+
sec = (timestamp / 1000000) + 10957L * 24L * 3600L;
|
176
|
+
nsec = (timestamp % 1000000) * 1000;
|
176
177
|
|
177
|
-
#if (RUBY_API_VERSION_MAJOR > 2 || (RUBY_API_VERSION_MAJOR == 2 && RUBY_API_VERSION_MINOR >= 3)) && defined(NEGATIVE_TIME_T)
|
178
|
+
#if (RUBY_API_VERSION_MAJOR > 2 || (RUBY_API_VERSION_MAJOR == 2 && RUBY_API_VERSION_MINOR >= 3)) && defined(NEGATIVE_TIME_T) && defined(SIZEOF_TIME_T) && SIZEOF_TIME_T >= 8
|
178
179
|
/* Fast path for time conversion */
|
179
|
-
|
180
|
+
{
|
181
|
+
struct timespec ts = {sec, nsec};
|
182
|
+
t = rb_time_timespec_new(&ts, conv->flags & PG_CODER_TIMESTAMP_APP_LOCAL ? INT_MAX : INT_MAX-1);
|
183
|
+
}
|
180
184
|
#else
|
181
|
-
t = rb_funcall(rb_cTime, rb_intern("at"), 2, LL2NUM(
|
185
|
+
t = rb_funcall(rb_cTime, rb_intern("at"), 2, LL2NUM(sec), LL2NUM(nsec / 1000));
|
182
186
|
if( !(conv->flags & PG_CODER_TIMESTAMP_APP_LOCAL) ) {
|
183
187
|
t = rb_funcall(t, rb_intern("utc"), 0);
|
184
188
|
}
|
data/ext/pg_binary_encoder.c
CHANGED
data/ext/pg_connection.c
CHANGED
@@ -85,8 +85,7 @@ pgconn_close_socket_io( VALUE self )
|
|
85
85
|
|
86
86
|
if ( RTEST(socket_io) ) {
|
87
87
|
#if defined(_WIN32)
|
88
|
-
|
89
|
-
if( rb_w32_unwrap_io_handle(ruby_sd) ){
|
88
|
+
if( rb_w32_unwrap_io_handle(this->ruby_sd) ){
|
90
89
|
rb_raise(rb_eConnectionBad, "Could not unwrap win32 socket handle");
|
91
90
|
}
|
92
91
|
#endif
|
@@ -165,6 +164,10 @@ pgconn_gc_mark( t_pg_connection *this )
|
|
165
164
|
static void
|
166
165
|
pgconn_gc_free( t_pg_connection *this )
|
167
166
|
{
|
167
|
+
#if defined(_WIN32)
|
168
|
+
if ( RTEST(this->socket_io) )
|
169
|
+
rb_w32_unwrap_io_handle( this->ruby_sd );
|
170
|
+
#endif
|
168
171
|
if (this->pgconn != NULL)
|
169
172
|
PQfinish( this->pgconn );
|
170
173
|
|
@@ -198,7 +201,6 @@ pgconn_s_allocate( VALUE klass )
|
|
198
201
|
this->decoder_for_get_copy_data = Qnil;
|
199
202
|
this->trace_stream = Qnil;
|
200
203
|
this->external_encoding = Qnil;
|
201
|
-
this->socket = -1;
|
202
204
|
this->guess_result_memsize = 1;
|
203
205
|
|
204
206
|
return self;
|
@@ -272,6 +274,7 @@ pgconn_init(int argc, VALUE *argv, VALUE self)
|
|
272
274
|
this = pg_get_connection( self );
|
273
275
|
conninfo = rb_funcall2( rb_cPGconn, rb_intern("parse_connect_args"), argc, argv );
|
274
276
|
this->pgconn = gvl_PQconnectdb(StringValueCStr(conninfo));
|
277
|
+
|
275
278
|
if(this->pgconn == NULL)
|
276
279
|
rb_raise(rb_ePGerror, "PQconnectdb() unable to allocate structure");
|
277
280
|
|
@@ -281,10 +284,6 @@ pgconn_init(int argc, VALUE *argv, VALUE self)
|
|
281
284
|
rb_exc_raise(error);
|
282
285
|
}
|
283
286
|
|
284
|
-
this->socket = PQsocket( this->pgconn );
|
285
|
-
if ( this->socket < 0 )
|
286
|
-
rb_raise(rb_eConnectionBad, "PQsocket() can't get socket descriptor");
|
287
|
-
|
288
287
|
pgconn_set_default_encoding( self );
|
289
288
|
|
290
289
|
if (rb_block_given_p()) {
|
@@ -335,10 +334,6 @@ pgconn_s_connect_start( int argc, VALUE *argv, VALUE klass )
|
|
335
334
|
rb_exc_raise(error);
|
336
335
|
}
|
337
336
|
|
338
|
-
this->socket = PQsocket( this->pgconn );
|
339
|
-
if ( this->socket < 0 )
|
340
|
-
rb_raise(rb_eConnectionBad, "PQsocket() can't get socket descriptor");
|
341
|
-
|
342
337
|
if ( rb_block_given_p() ) {
|
343
338
|
return rb_ensure( rb_yield, rb_conn, pgconn_finish, rb_conn );
|
344
339
|
}
|
@@ -902,6 +897,7 @@ pgconn_socket_io(VALUE self)
|
|
902
897
|
|
903
898
|
#ifdef _WIN32
|
904
899
|
ruby_sd = rb_w32_wrap_io_handle((HANDLE)(intptr_t)sd, O_RDWR|O_BINARY|O_NOINHERIT);
|
900
|
+
this->ruby_sd = ruby_sd;
|
905
901
|
#else
|
906
902
|
ruby_sd = sd;
|
907
903
|
#endif
|
@@ -969,7 +965,7 @@ static VALUE pgconn_exec_params( int, VALUE *, VALUE );
|
|
969
965
|
* conn.exec(sql) {|pg_result| block }
|
970
966
|
*
|
971
967
|
* Sends SQL query request specified by _sql_ to PostgreSQL.
|
972
|
-
*
|
968
|
+
* On success, it returns a PG::Result instance with all result rows and columns.
|
973
969
|
* On failure, it raises a PG::Error.
|
974
970
|
*
|
975
971
|
* For backward compatibility, if you pass more than one parameter to this method,
|
@@ -1006,7 +1002,7 @@ pgconn_exec(int argc, VALUE *argv, VALUE self)
|
|
1006
1002
|
}
|
1007
1003
|
return rb_pgresult;
|
1008
1004
|
}
|
1009
|
-
|
1005
|
+
pg_deprecated(0, ("forwarding exec to exec_params is deprecated"));
|
1010
1006
|
|
1011
1007
|
/* Otherwise, just call #exec_params instead for backward-compatibility */
|
1012
1008
|
return pgconn_exec_params( argc, argv, self );
|
@@ -1321,7 +1317,7 @@ pgconn_exec_params( int argc, VALUE *argv, VALUE self )
|
|
1321
1317
|
* is passed to #exec
|
1322
1318
|
*/
|
1323
1319
|
if ( NIL_P(paramsData.params) ) {
|
1324
|
-
|
1320
|
+
pg_deprecated(1, ("forwarding exec_params to exec is deprecated"));
|
1325
1321
|
return pgconn_exec( 1, argv, self );
|
1326
1322
|
}
|
1327
1323
|
pgconn_query_assign_typemap( self, ¶msData );
|
@@ -1587,7 +1583,7 @@ pgconn_s_escape(VALUE self, VALUE string)
|
|
1587
1583
|
int enc_idx;
|
1588
1584
|
int singleton = !rb_obj_is_kind_of(self, rb_cPGconn);
|
1589
1585
|
|
1590
|
-
|
1586
|
+
StringValueCStr(string);
|
1591
1587
|
enc_idx = ENCODING_GET( singleton ? string : self );
|
1592
1588
|
if( ENCODING_GET(string) != enc_idx ){
|
1593
1589
|
string = rb_str_export_to_enc(string, rb_enc_from_index(enc_idx));
|
@@ -1703,7 +1699,7 @@ pgconn_escape_literal(VALUE self, VALUE string)
|
|
1703
1699
|
VALUE result = Qnil;
|
1704
1700
|
int enc_idx = ENCODING_GET(self);
|
1705
1701
|
|
1706
|
-
|
1702
|
+
StringValueCStr(string);
|
1707
1703
|
if( ENCODING_GET(string) != enc_idx ){
|
1708
1704
|
string = rb_str_export_to_enc(string, rb_enc_from_index(enc_idx));
|
1709
1705
|
}
|
@@ -1745,7 +1741,7 @@ pgconn_escape_identifier(VALUE self, VALUE string)
|
|
1745
1741
|
VALUE result = Qnil;
|
1746
1742
|
int enc_idx = ENCODING_GET(self);
|
1747
1743
|
|
1748
|
-
|
1744
|
+
StringValueCStr(string);
|
1749
1745
|
if( ENCODING_GET(string) != enc_idx ){
|
1750
1746
|
string = rb_str_export_to_enc(string, rb_enc_from_index(enc_idx));
|
1751
1747
|
}
|
@@ -1851,7 +1847,7 @@ pgconn_send_query(int argc, VALUE *argv, VALUE self)
|
|
1851
1847
|
return Qnil;
|
1852
1848
|
}
|
1853
1849
|
|
1854
|
-
|
1850
|
+
pg_deprecated(2, ("forwarding async_exec to async_exec_params and send_query to send_query_params is deprecated"));
|
1855
1851
|
|
1856
1852
|
/* If called with parameters, and optionally result_format,
|
1857
1853
|
* use PQsendQueryParams
|
@@ -2337,15 +2333,18 @@ pgconn_notifies(VALUE self)
|
|
2337
2333
|
int rb_w32_wait_events( HANDLE *events, int num, DWORD timeout );
|
2338
2334
|
|
2339
2335
|
static void *
|
2340
|
-
wait_socket_readable(
|
2336
|
+
wait_socket_readable( PGconn *conn, struct timeval *ptimeout, void *(*is_readable)(PGconn *) )
|
2341
2337
|
{
|
2342
|
-
|
2338
|
+
int sd = PQsocket( conn );
|
2343
2339
|
void *retval;
|
2344
2340
|
struct timeval aborttime={0,0}, currtime, waittime;
|
2345
2341
|
DWORD timeout_milisec = INFINITE;
|
2346
2342
|
DWORD wait_ret;
|
2347
2343
|
WSAEVENT hEvent;
|
2348
2344
|
|
2345
|
+
if ( sd < 0 )
|
2346
|
+
rb_raise(rb_eConnectionBad, "PQsocket() can't get socket descriptor");
|
2347
|
+
|
2349
2348
|
hEvent = WSACreateEvent();
|
2350
2349
|
|
2351
2350
|
/* Check for connection errors (PQisBusy is true on connection errors) */
|
@@ -2360,7 +2359,7 @@ wait_socket_readable( t_pg_connection *this, struct timeval *ptimeout, void *(*i
|
|
2360
2359
|
}
|
2361
2360
|
|
2362
2361
|
while ( !(retval=is_readable(conn)) ) {
|
2363
|
-
if ( WSAEventSelect(
|
2362
|
+
if ( WSAEventSelect(sd, hEvent, FD_READ|FD_CLOSE) == SOCKET_ERROR ) {
|
2364
2363
|
WSACloseEvent( hEvent );
|
2365
2364
|
rb_raise( rb_eConnectionBad, "WSAEventSelect socket error: %d", WSAGetLastError() );
|
2366
2365
|
}
|
@@ -2412,13 +2411,16 @@ wait_socket_readable( t_pg_connection *this, struct timeval *ptimeout, void *(*i
|
|
2412
2411
|
/* non Win32 */
|
2413
2412
|
|
2414
2413
|
static void *
|
2415
|
-
wait_socket_readable(
|
2414
|
+
wait_socket_readable( PGconn *conn, struct timeval *ptimeout, void *(*is_readable)(PGconn *))
|
2416
2415
|
{
|
2417
|
-
|
2416
|
+
int sd = PQsocket( conn );
|
2418
2417
|
int ret;
|
2419
2418
|
void *retval;
|
2420
2419
|
struct timeval aborttime={0,0}, currtime, waittime;
|
2421
2420
|
|
2421
|
+
if ( sd < 0 )
|
2422
|
+
rb_raise(rb_eConnectionBad, "PQsocket() can't get socket descriptor");
|
2423
|
+
|
2422
2424
|
/* Check for connection errors (PQisBusy is true on connection errors) */
|
2423
2425
|
if ( PQconsumeInput(conn) == 0 )
|
2424
2426
|
rb_raise( rb_eConnectionBad, "PQconsumeInput() %s", PQerrorMessage(conn) );
|
@@ -2437,7 +2439,7 @@ wait_socket_readable( t_pg_connection *this, struct timeval *ptimeout, void *(*i
|
|
2437
2439
|
/* Is the given timeout valid? */
|
2438
2440
|
if( !ptimeout || (waittime.tv_sec >= 0 && waittime.tv_usec >= 0) ){
|
2439
2441
|
/* Wait for the socket to become readable before checking again */
|
2440
|
-
ret = rb_wait_for_single_fd(
|
2442
|
+
ret = rb_wait_for_single_fd( sd, RB_WAITFD_IN, ptimeout ? &waittime : NULL );
|
2441
2443
|
} else {
|
2442
2444
|
ret = 0;
|
2443
2445
|
}
|
@@ -2484,7 +2486,7 @@ notify_readable(PGconn *conn)
|
|
2484
2486
|
static VALUE
|
2485
2487
|
pgconn_wait_for_notify(int argc, VALUE *argv, VALUE self)
|
2486
2488
|
{
|
2487
|
-
|
2489
|
+
PGconn *conn = pg_get_pgconn( self );
|
2488
2490
|
PGnotify *pnotification;
|
2489
2491
|
struct timeval timeout;
|
2490
2492
|
struct timeval *ptimeout = NULL;
|
@@ -2500,7 +2502,7 @@ pgconn_wait_for_notify(int argc, VALUE *argv, VALUE self)
|
|
2500
2502
|
ptimeout = &timeout;
|
2501
2503
|
}
|
2502
2504
|
|
2503
|
-
pnotification = (PGnotify*) wait_socket_readable(
|
2505
|
+
pnotification = (PGnotify*) wait_socket_readable( conn, ptimeout, notify_readable);
|
2504
2506
|
|
2505
2507
|
/* Return nil if the select timed out */
|
2506
2508
|
if ( !pnotification ) return Qnil;
|
@@ -3078,7 +3080,7 @@ get_result_readable(PGconn *conn)
|
|
3078
3080
|
*/
|
3079
3081
|
static VALUE
|
3080
3082
|
pgconn_block( int argc, VALUE *argv, VALUE self ) {
|
3081
|
-
|
3083
|
+
PGconn *conn = pg_get_pgconn( self );
|
3082
3084
|
|
3083
3085
|
struct timeval timeout;
|
3084
3086
|
struct timeval *ptimeout = NULL;
|
@@ -3093,7 +3095,7 @@ pgconn_block( int argc, VALUE *argv, VALUE self ) {
|
|
3093
3095
|
ptimeout = &timeout;
|
3094
3096
|
}
|
3095
3097
|
|
3096
|
-
ret = wait_socket_readable(
|
3098
|
+
ret = wait_socket_readable( conn, ptimeout, get_result_readable);
|
3097
3099
|
|
3098
3100
|
if( !ret )
|
3099
3101
|
return Qfalse;
|
@@ -3223,7 +3225,7 @@ pgconn_async_exec_params(int argc, VALUE *argv, VALUE self)
|
|
3223
3225
|
pgconn_discard_results( self );
|
3224
3226
|
/* If called with no or nil parameters, use PQsendQuery for compatibility */
|
3225
3227
|
if ( argc == 1 || (argc >= 2 && argc <= 4 && NIL_P(argv[1]) )) {
|
3226
|
-
|
3228
|
+
pg_deprecated(3, ("forwarding async_exec_params to async_exec is deprecated"));
|
3227
3229
|
pgconn_send_query( argc, argv, self );
|
3228
3230
|
} else {
|
3229
3231
|
pgconn_send_query_params( argc, argv, self );
|