pg 0.18.1-x64-mingw32 → 0.18.2-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog +368 -316
- data/History.rdoc +16 -0
- data/README.rdoc +1 -1
- data/Rakefile.cross +5 -0
- data/ext/extconf.rb +4 -1
- data/ext/pg.c +2 -2
- data/ext/pg.h +10 -0
- data/ext/pg_connection.c +11 -39
- data/ext/pg_result.c +3 -3
- data/ext/pg_text_decoder.c +6 -9
- data/ext/pg_text_encoder.c +36 -39
- data/ext/pg_type_map_by_mri_type.c +1 -1
- data/ext/pg_type_map_in_ruby.c +3 -6
- data/ext/util.c +1 -1
- data/ext/util.h +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/pg.rb +1 -1
- data/lib/pg/connection.rb +37 -27
- data/lib/pg/text_decoder.rb +2 -2
- data/lib/x64-mingw32/libpq.dll +0 -0
- data/spec/pg/connection_spec.rb +82 -6
- data/spec/pg/type_spec.rb +53 -30
- metadata +15 -64
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -2
data/History.rdoc
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
== v0.18.2 [2015-05-14] Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
Enhancements:
|
4
|
+
|
5
|
+
- Allow URI connection string (thanks to Chris Bandy)
|
6
|
+
|
7
|
+
Bugfixes:
|
8
|
+
|
9
|
+
- Speedups and fixes for PG::TextDecoder::Identifier and quoting behavior
|
10
|
+
- Revert addition of PG::Connection#hostaddr [#202].
|
11
|
+
- Fix decoding of fractional timezones and timestamps [#203]
|
12
|
+
- Fixes for non-C99 compilers
|
13
|
+
- Avoid possible symbol name clash when linking againt static libpq.
|
14
|
+
|
15
|
+
|
1
16
|
== v0.18.1 [2015-01-05] Michael Granger <ged@FaerieMUD.org>
|
2
17
|
|
3
18
|
Correct the minimum compatible Ruby version to 1.9.3. #199
|
@@ -19,6 +34,7 @@ Enhancements:
|
|
19
34
|
- Add Enumerator variant to PG::Result#each and #each_row.
|
20
35
|
- Add PG::Connection#conninfo and #hostaddr.
|
21
36
|
- Add PG.init_openssl and PG.init_ssl methods.
|
37
|
+
- Add PG::Result.inspect
|
22
38
|
- Force zero termination for all text strings that are given to libpq.
|
23
39
|
It raises an ArgumentError if the string contains a null byte.
|
24
40
|
- Update Windows cross build to PostgreSQL 9.3.
|
data/README.rdoc
CHANGED
data/Rakefile.cross
CHANGED
@@ -217,6 +217,11 @@ class CrossLibrary < OpenStruct
|
|
217
217
|
|
218
218
|
# make libpq.dll
|
219
219
|
task postgresql_lib => [ postgresql_global_makefile ] do |t|
|
220
|
+
# Work around missing dependency to libcommon in PostgreSQL-9.4.0
|
221
|
+
chdir( static_postgresql_srcdir + "common" ) do
|
222
|
+
sh 'make', "-j#{NUM_CPUS}"
|
223
|
+
end
|
224
|
+
|
220
225
|
chdir( postgresql_lib.dirname ) do
|
221
226
|
sh 'make',
|
222
227
|
"-j#{NUM_CPUS}",
|
data/ext/extconf.rb
CHANGED
@@ -73,7 +73,6 @@ have_func 'PQlibVersion'
|
|
73
73
|
have_func 'PQping'
|
74
74
|
have_func 'PQsetSingleRowMode'
|
75
75
|
have_func 'PQconninfo'
|
76
|
-
have_func 'PQhostaddr'
|
77
76
|
|
78
77
|
have_func 'rb_encdb_alias'
|
79
78
|
have_func 'rb_enc_alias'
|
@@ -95,6 +94,10 @@ $defs.push( "-DHAVE_ST_NOTIFY_EXTRA" ) if
|
|
95
94
|
have_header 'unistd.h'
|
96
95
|
have_header 'ruby/st.h' or have_header 'st.h' or abort "pg currently requires the ruby/st.h header"
|
97
96
|
|
97
|
+
checking_for "C99 variable length arrays" do
|
98
|
+
$defs.push( "-DHAVE_VARIABLE_LENGTH_ARRAYS" ) if try_compile('void test_vla(int l){ int vla[l]; }')
|
99
|
+
end
|
100
|
+
|
98
101
|
create_header()
|
99
102
|
create_makefile( "pg_ext" )
|
100
103
|
|
data/ext/pg.c
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
* See Contributors.rdoc for the many additional fine people that have contributed
|
16
16
|
* to this library over the years.
|
17
17
|
*
|
18
|
-
* Copyright (c) 1997-
|
18
|
+
* Copyright (c) 1997-2015 by the authors.
|
19
19
|
*
|
20
20
|
* You may redistribute this software under the same terms as Ruby itself; see
|
21
21
|
* http://www.ruby-lang.org/en/LICENSE.txt or the LICENSE file in the source
|
@@ -252,7 +252,7 @@ pg_get_rb_encoding_as_pg_encoding( rb_encoding *enc )
|
|
252
252
|
* char *current_out, *end_capa;
|
253
253
|
* PG_RB_STR_NEW( string, current_out, end_capa );
|
254
254
|
* while( data_is_going_to_be_processed ){
|
255
|
-
* PG_RB_STR_ENSURE_CAPA( string, 2 current_out, end_capa );
|
255
|
+
* PG_RB_STR_ENSURE_CAPA( string, 2, current_out, end_capa );
|
256
256
|
* *current_out++ = databyte1;
|
257
257
|
* *current_out++ = databyte2;
|
258
258
|
* }
|
data/ext/pg.h
CHANGED
@@ -133,6 +133,15 @@
|
|
133
133
|
typedef long suseconds_t;
|
134
134
|
#endif
|
135
135
|
|
136
|
+
#if defined(HAVE_VARIABLE_LENGTH_ARRAYS)
|
137
|
+
#define PG_VARIABLE_LENGTH_ARRAY(type, name, len, maxlen) type name[(len)];
|
138
|
+
#else
|
139
|
+
#define PG_VARIABLE_LENGTH_ARRAY(type, name, len, maxlen) \
|
140
|
+
type name[(maxlen)] = {(len)>(maxlen) ? (rb_raise(rb_eArgError, "Number of " #name " (%d) exceeds allowed maximum of " #maxlen, (len) ), (type)1) : (type)0};
|
141
|
+
|
142
|
+
#define PG_MAX_COLUMNS 4000
|
143
|
+
#endif
|
144
|
+
|
136
145
|
/* The data behind each PG::Connection object */
|
137
146
|
typedef struct {
|
138
147
|
PGconn *pgconn;
|
@@ -313,6 +322,7 @@ VALUE lookup_error_class _(( const char * ));
|
|
313
322
|
VALUE pg_bin_dec_bytea _(( t_pg_coder*, char *, int, int, int, int ));
|
314
323
|
VALUE pg_text_dec_string _(( t_pg_coder*, char *, int, int, int, int ));
|
315
324
|
int pg_coder_enc_to_s _(( t_pg_coder*, VALUE, char *, VALUE *));
|
325
|
+
int pg_text_enc_identifier _(( t_pg_coder*, VALUE, char *, VALUE *));
|
316
326
|
t_pg_coder_enc_func pg_coder_enc_func _(( t_pg_coder* ));
|
317
327
|
t_pg_coder_dec_func pg_coder_dec_func _(( t_pg_coder*, int ));
|
318
328
|
void pg_define_coder _(( const char *, void *, VALUE, VALUE ));
|
data/ext/pg_connection.c
CHANGED
@@ -627,22 +627,6 @@ pgconn_host(VALUE self)
|
|
627
627
|
return rb_tainted_str_new2(host);
|
628
628
|
}
|
629
629
|
|
630
|
-
#ifdef HAVE_PQHOSTADDR
|
631
|
-
/*
|
632
|
-
* call-seq:
|
633
|
-
* conn.hostaddr()
|
634
|
-
*
|
635
|
-
* Returns the server numeric IP address of the connection.
|
636
|
-
*/
|
637
|
-
static VALUE
|
638
|
-
pgconn_hostaddr(VALUE self)
|
639
|
-
{
|
640
|
-
char *hostaddr = PQhostaddr(pg_get_pgconn(self));
|
641
|
-
if (!hostaddr) return Qnil;
|
642
|
-
return rb_tainted_str_new2(hostaddr);
|
643
|
-
}
|
644
|
-
#endif
|
645
|
-
|
646
630
|
/*
|
647
631
|
* call-seq:
|
648
632
|
* conn.port()
|
@@ -3013,7 +2997,9 @@ pgconn_transaction(VALUE self)
|
|
3013
2997
|
/*
|
3014
2998
|
* call-seq:
|
3015
2999
|
* PG::Connection.quote_ident( str ) -> String
|
3000
|
+
* PG::Connection.quote_ident( array ) -> String
|
3016
3001
|
* conn.quote_ident( str ) -> String
|
3002
|
+
* conn.quote_ident( array ) -> String
|
3017
3003
|
*
|
3018
3004
|
* Returns a string that is safe for inclusion in a SQL query as an
|
3019
3005
|
* identifier. Note: this is not a quote function for values, but for
|
@@ -3030,31 +3016,20 @@ pgconn_transaction(VALUE self)
|
|
3030
3016
|
* Similarly, this function also protects against special characters,
|
3031
3017
|
* and other things that might allow SQL injection if the identifier
|
3032
3018
|
* comes from an untrusted source.
|
3019
|
+
*
|
3020
|
+
* If the parameter is an Array, then all it's values are separately quoted
|
3021
|
+
* and then joined by a "." character. This can be used for identifiers in
|
3022
|
+
* the form "schema"."table"."column" .
|
3023
|
+
*
|
3024
|
+
* This method is functional identical to the encoder PG::TextEncoder::Identifier .
|
3025
|
+
*
|
3033
3026
|
*/
|
3034
3027
|
static VALUE
|
3035
3028
|
pgconn_s_quote_ident(VALUE self, VALUE in_str)
|
3036
3029
|
{
|
3037
3030
|
VALUE ret;
|
3038
|
-
|
3039
|
-
|
3040
|
-
* double-quotes. */
|
3041
|
-
char buffer[NAMEDATALEN*2+2];
|
3042
|
-
unsigned int i=0,j=0;
|
3043
|
-
unsigned int str_len = RSTRING_LENINT(in_str);
|
3044
|
-
|
3045
|
-
if(str_len >= NAMEDATALEN) {
|
3046
|
-
rb_raise(rb_eArgError,
|
3047
|
-
"Input string is longer than NAMEDATALEN-1 (%d)",
|
3048
|
-
NAMEDATALEN-1);
|
3049
|
-
}
|
3050
|
-
buffer[j++] = '"';
|
3051
|
-
for(i = 0; i < str_len && str[i]; i++) {
|
3052
|
-
if(str[i] == '"')
|
3053
|
-
buffer[j++] = '"';
|
3054
|
-
buffer[j++] = str[i];
|
3055
|
-
}
|
3056
|
-
buffer[j++] = '"';
|
3057
|
-
ret = rb_str_new(buffer,j);
|
3031
|
+
pg_text_enc_identifier(NULL, in_str, NULL, &ret);
|
3032
|
+
|
3058
3033
|
OBJ_INFECT(ret, in_str);
|
3059
3034
|
PG_ENCODING_SET_NOCHECK(ret, ENCODING_GET( rb_obj_class(self) == rb_cPGconn ? self : in_str ));
|
3060
3035
|
|
@@ -3835,9 +3810,6 @@ init_pg_connection()
|
|
3835
3810
|
rb_define_method(rb_cPGconn, "user", pgconn_user, 0);
|
3836
3811
|
rb_define_method(rb_cPGconn, "pass", pgconn_pass, 0);
|
3837
3812
|
rb_define_method(rb_cPGconn, "host", pgconn_host, 0);
|
3838
|
-
#ifdef HAVE_PQHOSTADDR
|
3839
|
-
rb_define_method(rb_cPGconn, "hostaddr", pgconn_hostaddr, 0);
|
3840
|
-
#endif
|
3841
3813
|
rb_define_method(rb_cPGconn, "port", pgconn_port, 0);
|
3842
3814
|
rb_define_method(rb_cPGconn, "tty", pgconn_tty, 0);
|
3843
3815
|
#ifdef HAVE_PQCONNINFO
|
data/ext/pg_result.c
CHANGED
@@ -863,7 +863,7 @@ pgresult_each_row(VALUE self)
|
|
863
863
|
num_fields = PQnfields(this->pgresult);
|
864
864
|
|
865
865
|
for ( row = 0; row < num_rows; row++ ) {
|
866
|
-
VALUE row_values
|
866
|
+
PG_VARIABLE_LENGTH_ARRAY(VALUE, row_values, num_fields, PG_MAX_COLUMNS)
|
867
867
|
|
868
868
|
/* populate the row */
|
869
869
|
for ( field = 0; field < num_fields; field++ ) {
|
@@ -892,7 +892,7 @@ pgresult_values(VALUE self)
|
|
892
892
|
VALUE results = rb_ary_new2( num_rows );
|
893
893
|
|
894
894
|
for ( row = 0; row < num_rows; row++ ) {
|
895
|
-
VALUE row_values
|
895
|
+
PG_VARIABLE_LENGTH_ARRAY(VALUE, row_values, num_fields, PG_MAX_COLUMNS)
|
896
896
|
|
897
897
|
/* populate the row */
|
898
898
|
for ( field = 0; field < num_fields; field++ ) {
|
@@ -1176,7 +1176,7 @@ pgresult_stream_each_row(VALUE self)
|
|
1176
1176
|
}
|
1177
1177
|
|
1178
1178
|
for ( row = 0; row < ntuples; row++ ) {
|
1179
|
-
VALUE row_values
|
1179
|
+
PG_VARIABLE_LENGTH_ARRAY(VALUE, row_values, nfields, PG_MAX_COLUMNS)
|
1180
1180
|
int field;
|
1181
1181
|
|
1182
1182
|
/* populate the row */
|
data/ext/pg_text_decoder.c
CHANGED
@@ -293,7 +293,7 @@ pg_text_dec_array(t_pg_coder *conv, char *val, int len, int tuple, int field, in
|
|
293
293
|
}
|
294
294
|
|
295
295
|
/*
|
296
|
-
* Document-class: PG::TextDecoder::Identifier < PG::
|
296
|
+
* Document-class: PG::TextDecoder::Identifier < PG::SimpleDecoder
|
297
297
|
*
|
298
298
|
* This is the decoder class for PostgreSQL identifiers.
|
299
299
|
*
|
@@ -305,16 +305,13 @@ pg_text_dec_array(t_pg_coder *conv, char *val, int len, int tuple, int field, in
|
|
305
305
|
static VALUE
|
306
306
|
pg_text_dec_identifier(t_pg_coder *conv, char *val, int len, int tuple, int field, int enc_idx)
|
307
307
|
{
|
308
|
-
t_pg_composite_coder *this = (t_pg_composite_coder *)conv;
|
309
|
-
t_pg_coder_dec_func dec_func = pg_coder_dec_func(this->elem, 0);
|
310
|
-
|
311
308
|
/* Return value: array */
|
312
309
|
VALUE array;
|
313
310
|
VALUE elem;
|
314
311
|
int word_index = 0;
|
315
312
|
int index;
|
316
313
|
/* Use a buffer of the same length, as that will be the worst case */
|
317
|
-
char word
|
314
|
+
PG_VARIABLE_LENGTH_ARRAY(char, word, len + 1, NAMEDATALEN)
|
318
315
|
|
319
316
|
/* The current character in the input string. */
|
320
317
|
char c;
|
@@ -331,7 +328,7 @@ pg_text_dec_identifier(t_pg_coder *conv, char *val, int len, int tuple, int fiel
|
|
331
328
|
if(c == '.' && openQuote < 2 ) {
|
332
329
|
word[word_index] = 0;
|
333
330
|
|
334
|
-
elem =
|
331
|
+
elem = pg_text_dec_string(conv, word, word_index, tuple, field, enc_idx);
|
335
332
|
rb_ary_push(array, elem);
|
336
333
|
|
337
334
|
openQuote = 0;
|
@@ -353,7 +350,7 @@ pg_text_dec_identifier(t_pg_coder *conv, char *val, int len, int tuple, int fiel
|
|
353
350
|
}
|
354
351
|
|
355
352
|
word[word_index] = 0;
|
356
|
-
elem =
|
353
|
+
elem = pg_text_dec_string(conv, word, word_index, tuple, field, enc_idx);
|
357
354
|
rb_ary_push(array, elem);
|
358
355
|
|
359
356
|
return array;
|
@@ -412,11 +409,11 @@ init_pg_text_decoder()
|
|
412
409
|
pg_define_coder( "String", pg_text_dec_string, rb_cPG_SimpleDecoder, rb_mPG_TextDecoder );
|
413
410
|
/* dummy = rb_define_class_under( rb_mPG_TextDecoder, "Bytea", rb_cPG_SimpleDecoder ); */
|
414
411
|
pg_define_coder( "Bytea", pg_text_dec_bytea, rb_cPG_SimpleDecoder, rb_mPG_TextDecoder );
|
412
|
+
/* dummy = rb_define_class_under( rb_mPG_TextDecoder, "Identifier", rb_cPG_SimpleDecoder ); */
|
413
|
+
pg_define_coder( "Identifier", pg_text_dec_identifier, rb_cPG_SimpleDecoder, rb_mPG_TextDecoder );
|
415
414
|
|
416
415
|
/* dummy = rb_define_class_under( rb_mPG_TextDecoder, "Array", rb_cPG_CompositeDecoder ); */
|
417
416
|
pg_define_coder( "Array", pg_text_dec_array, rb_cPG_CompositeDecoder, rb_mPG_TextDecoder );
|
418
|
-
/* dummy = rb_define_class_under( rb_mPG_TextDecoder, "Identifier", rb_cPG_CompositeDecoder ); */
|
419
|
-
pg_define_coder( "Identifier", pg_text_dec_identifier, rb_cPG_CompositeDecoder, rb_mPG_TextDecoder );
|
420
417
|
/* dummy = rb_define_class_under( rb_mPG_TextDecoder, "FromBase64", rb_cPG_CompositeDecoder ); */
|
421
418
|
pg_define_coder( "FromBase64", pg_text_dec_from_base64, rb_cPG_CompositeDecoder, rb_mPG_TextDecoder );
|
422
419
|
}
|
data/ext/pg_text_encoder.c
CHANGED
@@ -299,7 +299,7 @@ quote_array_buffer( void *_this, char *p_in, int strlen, char *p_out ){
|
|
299
299
|
/* count data plus backslashes; detect chars needing quotes */
|
300
300
|
if (strlen == 0)
|
301
301
|
needquote = 1; /* force quotes for empty string */
|
302
|
-
else if (strlen == 4 &&
|
302
|
+
else if (strlen == 4 && rbpg_strncasecmp(p_in, "NULL", strlen) == 0)
|
303
303
|
needquote = 1; /* force quotes for literal NULL */
|
304
304
|
else
|
305
305
|
needquote = 0;
|
@@ -455,39 +455,34 @@ pg_text_enc_array(t_pg_coder *conv, VALUE value, char *out, VALUE *intermediate)
|
|
455
455
|
}
|
456
456
|
}
|
457
457
|
|
458
|
-
static
|
459
|
-
|
458
|
+
static char *
|
459
|
+
quote_identifier( VALUE value, VALUE out_string, char *current_out ){
|
460
|
+
char *p_in = RSTRING_PTR(value);
|
460
461
|
char *ptr1;
|
461
|
-
|
462
|
-
|
462
|
+
size_t strlen = RSTRING_LEN(value);
|
463
|
+
char *end_capa = current_out;
|
463
464
|
|
464
|
-
|
465
|
+
PG_RB_STR_ENSURE_CAPA( out_string, strlen + 2, current_out, end_capa );
|
466
|
+
*current_out++ = '"';
|
465
467
|
for(ptr1 = p_in; ptr1 != p_in + strlen; ptr1++) {
|
466
|
-
|
467
|
-
|
468
|
+
char c = *ptr1;
|
469
|
+
if (c == '"'){
|
470
|
+
strlen++;
|
471
|
+
PG_RB_STR_ENSURE_CAPA( out_string, p_in - ptr1 + strlen + 1, current_out, end_capa );
|
472
|
+
*current_out++ = '"';
|
473
|
+
} else if (c == 0){
|
474
|
+
break;
|
468
475
|
}
|
476
|
+
*current_out++ = c;
|
469
477
|
}
|
478
|
+
PG_RB_STR_ENSURE_CAPA( out_string, 1, current_out, end_capa );
|
479
|
+
*current_out++ = '"';
|
470
480
|
|
471
|
-
|
472
|
-
ptr2 = p_out + strlen + backslashs + 2;
|
473
|
-
/* Write end quote */
|
474
|
-
*--ptr2 = '"';
|
475
|
-
|
476
|
-
/* Then store the escaped string on the final position, walking
|
477
|
-
* right to left, until all backslashs are placed. */
|
478
|
-
while( ptr1 != p_in ) {
|
479
|
-
*--ptr2 = *--ptr1;
|
480
|
-
if(*ptr2 == '"'){
|
481
|
-
*--ptr2 = '"';
|
482
|
-
}
|
483
|
-
}
|
484
|
-
/* Write start quote */
|
485
|
-
*p_out = '"';
|
486
|
-
return strlen + backslashs + 2;
|
481
|
+
return current_out;
|
487
482
|
}
|
488
483
|
|
489
484
|
static char *
|
490
|
-
pg_text_enc_array_identifier(
|
485
|
+
pg_text_enc_array_identifier(VALUE value, VALUE string, char *out)
|
491
486
|
{
|
492
487
|
int i;
|
493
488
|
int nr_elems;
|
@@ -498,7 +493,7 @@ pg_text_enc_array_identifier(t_pg_composite_coder *this, VALUE value, VALUE stri
|
|
498
493
|
for( i=0; i<nr_elems; i++){
|
499
494
|
VALUE entry = rb_ary_entry(value, i);
|
500
495
|
|
501
|
-
out =
|
496
|
+
out = quote_identifier(entry, string, out);
|
502
497
|
if( i < nr_elems-1 ){
|
503
498
|
out = pg_rb_str_ensure_capa( string, 1, out, NULL );
|
504
499
|
*out++ = '.';
|
@@ -508,27 +503,29 @@ pg_text_enc_array_identifier(t_pg_composite_coder *this, VALUE value, VALUE stri
|
|
508
503
|
}
|
509
504
|
|
510
505
|
/*
|
511
|
-
* Document-class: PG::TextEncoder::Identifier < PG::
|
506
|
+
* Document-class: PG::TextEncoder::Identifier < PG::SimpleEncoder
|
512
507
|
*
|
513
508
|
* This is the encoder class for PostgreSQL identifiers.
|
514
509
|
*
|
515
510
|
* An Array value can be used for "schema.table.column" type identifiers:
|
516
511
|
* PG::TextEncoder::Identifier.new.encode(['schema', 'table', 'column'])
|
517
|
-
* => "schema"."table"."column"
|
512
|
+
* => '"schema"."table"."column"'
|
518
513
|
*
|
514
|
+
* This encoder can also be used per PG::Connection#quote_ident .
|
519
515
|
*/
|
520
|
-
|
521
|
-
pg_text_enc_identifier(t_pg_coder *
|
516
|
+
int
|
517
|
+
pg_text_enc_identifier(t_pg_coder *this, VALUE value, char *out, VALUE *intermediate)
|
522
518
|
{
|
523
|
-
|
524
|
-
|
525
|
-
*intermediate = rb_str_new(NULL, 0);
|
526
|
-
out = RSTRING_PTR(*intermediate);
|
527
|
-
|
519
|
+
UNUSED( this );
|
528
520
|
if( TYPE(value) == T_ARRAY){
|
529
|
-
|
521
|
+
*intermediate = rb_str_new(NULL, 0);
|
522
|
+
out = RSTRING_PTR(*intermediate);
|
523
|
+
out = pg_text_enc_array_identifier(value, *intermediate, out);
|
530
524
|
} else {
|
531
|
-
|
525
|
+
StringValue(value);
|
526
|
+
*intermediate = rb_str_new(NULL, RSTRING_LEN(value) + 2);
|
527
|
+
out = RSTRING_PTR(*intermediate);
|
528
|
+
out = quote_identifier(value, *intermediate, out);
|
532
529
|
}
|
533
530
|
rb_str_set_len( *intermediate, out - RSTRING_PTR(*intermediate) );
|
534
531
|
return -1;
|
@@ -651,11 +648,11 @@ init_pg_text_encoder()
|
|
651
648
|
pg_define_coder( "String", pg_coder_enc_to_s, rb_cPG_SimpleEncoder, rb_mPG_TextEncoder );
|
652
649
|
/* dummy = rb_define_class_under( rb_mPG_TextEncoder, "Bytea", rb_cPG_SimpleEncoder ); */
|
653
650
|
pg_define_coder( "Bytea", pg_text_enc_bytea, rb_cPG_SimpleEncoder, rb_mPG_TextEncoder );
|
651
|
+
/* dummy = rb_define_class_under( rb_mPG_TextEncoder, "Identifier", rb_cPG_SimpleEncoder ); */
|
652
|
+
pg_define_coder( "Identifier", pg_text_enc_identifier, rb_cPG_SimpleEncoder, rb_mPG_TextEncoder );
|
654
653
|
|
655
654
|
/* dummy = rb_define_class_under( rb_mPG_TextEncoder, "Array", rb_cPG_CompositeEncoder ); */
|
656
655
|
pg_define_coder( "Array", pg_text_enc_array, rb_cPG_CompositeEncoder, rb_mPG_TextEncoder );
|
657
|
-
/* dummy = rb_define_class_under( rb_mPG_TextEncoder, "Identifier", rb_cPG_CompositeEncoder ); */
|
658
|
-
pg_define_coder( "Identifier", pg_text_enc_identifier, rb_cPG_CompositeEncoder, rb_mPG_TextEncoder );
|
659
656
|
/* dummy = rb_define_class_under( rb_mPG_TextEncoder, "QuotedLiteral", rb_cPG_CompositeEncoder ); */
|
660
657
|
pg_define_coder( "QuotedLiteral", pg_text_enc_quoted_literal, rb_cPG_CompositeEncoder, rb_mPG_TextEncoder );
|
661
658
|
/* dummy = rb_define_class_under( rb_mPG_TextEncoder, "ToBase64", rb_cPG_CompositeEncoder ); */
|
data/ext/pg_type_map_in_ruby.c
CHANGED
@@ -212,12 +212,9 @@ pg_tmir_copy_get( t_typemap *p_typemap, VALUE field_str, int fieldno, int format
|
|
212
212
|
rb_encoding *p_encoding = rb_enc_from_index(enc_idx);
|
213
213
|
VALUE enc = rb_enc_from_encoding(p_encoding);
|
214
214
|
/* field_str is reused in-place by pg_text_dec_copy_row(), so we need to make
|
215
|
-
* a copy of the string buffer
|
216
|
-
|
217
|
-
|
218
|
-
VALUE field_str_copy = rb_str_new(RSTRING_PTR(field_str), RSTRING_LEN(field_str));
|
219
|
-
PG_ENCODING_SET_NOCHECK(field_str_copy, ENCODING_GET(field_str));
|
220
|
-
OBJ_INFECT(field_str_copy, field_str);
|
215
|
+
* a copy of the string buffer for use in ruby space. */
|
216
|
+
VALUE field_str_copy = rb_str_dup(field_str);
|
217
|
+
rb_str_modify(field_str_copy);
|
221
218
|
|
222
219
|
return rb_funcall( this->self, s_id_typecast_copy_get, 4, field_str_copy, INT2NUM(fieldno), INT2NUM(format), enc );
|
223
220
|
}
|
data/ext/util.c
CHANGED
@@ -124,7 +124,7 @@ base64_decode( char *out, char *in, unsigned int len)
|
|
124
124
|
* At most n bytes will be examined from each string.
|
125
125
|
*/
|
126
126
|
int
|
127
|
-
|
127
|
+
rbpg_strncasecmp(const char *s1, const char *s2, size_t n)
|
128
128
|
{
|
129
129
|
while (n-- > 0)
|
130
130
|
{
|
data/ext/util.h
CHANGED
@@ -60,6 +60,6 @@
|
|
60
60
|
void base64_encode( char *out, char *in, int len);
|
61
61
|
int base64_decode( char *out, char *in, unsigned int len);
|
62
62
|
|
63
|
-
int
|
63
|
+
int rbpg_strncasecmp(const char *s1, const char *s2, size_t n);
|
64
64
|
|
65
65
|
#endif /* end __utils_h */
|