sequel_pg 1.8.2 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +8 -0
- data/MIT-LICENSE +28 -1
- data/README.rdoc +2 -0
- data/ext/sequel_pg/sequel_pg.c +383 -36
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7e56aa87f96c34298bba6a14bac49f79938415c9d9d8546b5621ac82c45161a
|
4
|
+
data.tar.gz: 85a21e58594078a962344e2308d6ae4b860de0b3af34a99be4ad93cdb39f4163
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81ee2f7a944480110a254dbf6517e1b1d6eb64993c6e20f6425eab84e9f833213004c02857148bc36782bcef0862bacd17e8b12a7aa76e2f09b9c9aabe1c73dc
|
7
|
+
data.tar.gz: 5ff9e1e8750040e82c2cc9157d12f9c4fcf927f2dbb4576483b14d417bb5f65b45cacbd2c588ddc3db9ab5f0eca114f83b69455609e0bf8b6c92ec1b74b7423b
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
=== 1.9.0 (2018-06-06)
|
2
|
+
|
3
|
+
* Return arrays of common data types as PGArray instances automatically with much improved performance (jeremyevans)
|
4
|
+
|
5
|
+
* Borrow pg_text_dec_integer function from ruby-pg and use it to improve performance (jeremyevans)
|
6
|
+
|
7
|
+
* Borrow PG_ENCODING_SET_NOCHECK macro from ruby-pg and use it to improve performance (jeremyevans)
|
8
|
+
|
1
9
|
=== 1.8.2 (2018-05-25)
|
2
10
|
|
3
11
|
* Use Kernel.BigDecimal instead of BigDecimal.new to avoid verbose mode deprecation warnings (jeremyevans)
|
data/MIT-LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2010-
|
1
|
+
Copyright (c) 2010-2018 Jeremy Evans
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
of this software and associated documentation files (the "Software"), to
|
@@ -45,3 +45,30 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
45
45
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
46
46
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
47
47
|
|
48
|
+
|
49
|
+
Some improvements were taken from the ruby pg library
|
50
|
+
(https://bitbucket.org/ged/ruby-pg/wiki/Home), under the following
|
51
|
+
license:
|
52
|
+
|
53
|
+
Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
|
54
|
+
|
55
|
+
Redistribution and use in source and binary forms, with or without
|
56
|
+
modification, are permitted provided that the following conditions
|
57
|
+
are met:
|
58
|
+
1. Redistributions of source code must retain the above copyright
|
59
|
+
notice, this list of conditions and the following disclaimer.
|
60
|
+
2. Redistributions in binary form must reproduce the above copyright
|
61
|
+
notice, this list of conditions and the following disclaimer in the
|
62
|
+
documentation and/or other materials provided with the distribution.
|
63
|
+
|
64
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
65
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
66
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
67
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
68
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
69
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
70
|
+
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
71
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
72
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
73
|
+
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
74
|
+
SUCH DAMAGE.
|
data/README.rdoc
CHANGED
data/ext/sequel_pg/sequel_pg.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#define SEQUEL_PG_VERSION_INTEGER
|
1
|
+
#define SEQUEL_PG_VERSION_INTEGER 10900
|
2
2
|
|
3
3
|
#include <string.h>
|
4
4
|
#include <stdio.h>
|
@@ -42,6 +42,7 @@ PGconn* pg_get_pgconn(VALUE);
|
|
42
42
|
PGresult* pgresult_get(VALUE);
|
43
43
|
|
44
44
|
static VALUE spg_Sequel;
|
45
|
+
static VALUE spg_PGArray;
|
45
46
|
static VALUE spg_Blob;
|
46
47
|
static VALUE spg_Kernel;
|
47
48
|
static VALUE spg_Date;
|
@@ -59,6 +60,33 @@ static VALUE spg_sym_model;
|
|
59
60
|
static VALUE spg_sym__sequel_pg_type;
|
60
61
|
static VALUE spg_sym__sequel_pg_value;
|
61
62
|
|
63
|
+
static VALUE spg_sym_text;
|
64
|
+
static VALUE spg_sym_character_varying;
|
65
|
+
static VALUE spg_sym_integer;
|
66
|
+
static VALUE spg_sym_timestamp;
|
67
|
+
static VALUE spg_sym_timestamptz;
|
68
|
+
static VALUE spg_sym_time;
|
69
|
+
static VALUE spg_sym_timetz;
|
70
|
+
static VALUE spg_sym_bigint;
|
71
|
+
static VALUE spg_sym_numeric;
|
72
|
+
static VALUE spg_sym_double_precision;
|
73
|
+
static VALUE spg_sym_boolean;
|
74
|
+
static VALUE spg_sym_bytea;
|
75
|
+
static VALUE spg_sym_date;
|
76
|
+
static VALUE spg_sym_smallint;
|
77
|
+
static VALUE spg_sym_oid;
|
78
|
+
static VALUE spg_sym_real;
|
79
|
+
static VALUE spg_sym_xml;
|
80
|
+
static VALUE spg_sym_money;
|
81
|
+
static VALUE spg_sym_bit;
|
82
|
+
static VALUE spg_sym_bit_varying;
|
83
|
+
static VALUE spg_sym_uuid;
|
84
|
+
static VALUE spg_sym_xid;
|
85
|
+
static VALUE spg_sym_cid;
|
86
|
+
static VALUE spg_sym_name;
|
87
|
+
static VALUE spg_sym_tid;
|
88
|
+
static VALUE spg_sym_int2vector;
|
89
|
+
|
62
90
|
static VALUE spg_nan;
|
63
91
|
static VALUE spg_pos_inf;
|
64
92
|
static VALUE spg_neg_inf;
|
@@ -109,7 +137,74 @@ static int enc_get_index(VALUE val) {
|
|
109
137
|
return i;
|
110
138
|
}
|
111
139
|
|
112
|
-
|
140
|
+
#define PG_ENCODING_SET_NOCHECK(obj,i) \
|
141
|
+
do { \
|
142
|
+
if ((i) < ENCODING_INLINE_MAX) \
|
143
|
+
ENCODING_SET_INLINED((obj), (i)); \
|
144
|
+
else \
|
145
|
+
rb_enc_set_index((obj), (i)); \
|
146
|
+
} while(0)
|
147
|
+
|
148
|
+
static VALUE
|
149
|
+
pg_text_dec_integer(char *val, int len)
|
150
|
+
{
|
151
|
+
long i;
|
152
|
+
int max_len;
|
153
|
+
|
154
|
+
if( sizeof(i) >= 8 && FIXNUM_MAX >= 1000000000000000000LL ){
|
155
|
+
/* 64 bit system can safely handle all numbers up to 18 digits as Fixnum */
|
156
|
+
max_len = 18;
|
157
|
+
} else if( sizeof(i) >= 4 && FIXNUM_MAX >= 1000000000LL ){
|
158
|
+
/* 32 bit system can safely handle all numbers up to 9 digits as Fixnum */
|
159
|
+
max_len = 9;
|
160
|
+
} else {
|
161
|
+
/* unknown -> don't use fast path for int conversion */
|
162
|
+
max_len = 0;
|
163
|
+
}
|
164
|
+
|
165
|
+
if( len <= max_len ){
|
166
|
+
/* rb_cstr2inum() seems to be slow, so we do the int conversion by hand.
|
167
|
+
* This proved to be 40% faster by the following benchmark:
|
168
|
+
*
|
169
|
+
* conn.type_mapping_for_results = PG::BasicTypeMapForResults.new conn
|
170
|
+
* Benchmark.measure do
|
171
|
+
* conn.exec("select generate_series(1,1000000)").values }
|
172
|
+
* end
|
173
|
+
*/
|
174
|
+
char *val_pos = val;
|
175
|
+
char digit = *val_pos;
|
176
|
+
int neg;
|
177
|
+
int error = 0;
|
178
|
+
|
179
|
+
if( digit=='-' ){
|
180
|
+
neg = 1;
|
181
|
+
i = 0;
|
182
|
+
}else if( digit>='0' && digit<='9' ){
|
183
|
+
neg = 0;
|
184
|
+
i = digit - '0';
|
185
|
+
} else {
|
186
|
+
error = 1;
|
187
|
+
}
|
188
|
+
|
189
|
+
while (!error && (digit=*++val_pos)) {
|
190
|
+
if( digit>='0' && digit<='9' ){
|
191
|
+
i = i * 10 + (digit - '0');
|
192
|
+
} else {
|
193
|
+
error = 1;
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
if( !error ){
|
198
|
+
return LONG2FIX(neg ? -i : i);
|
199
|
+
}
|
200
|
+
}
|
201
|
+
/* Fallback to ruby method if number too big or unrecognized. */
|
202
|
+
return rb_cstr2inum(val, 10);
|
203
|
+
}
|
204
|
+
|
205
|
+
static VALUE spg__array_col_value(char *v, size_t length, VALUE converter, int enc_index, int oid, VALUE db);
|
206
|
+
|
207
|
+
static VALUE read_array(int *index, char *c_pg_array_string, int array_string_length, VALUE buf, VALUE converter, int enc_index, int oid, VALUE db) {
|
113
208
|
int word_index = 0;
|
114
209
|
char *word = RSTRING_PTR(buf);
|
115
210
|
|
@@ -152,16 +247,8 @@ static VALUE read_array(int *index, char *c_pg_array_string, int array_string_le
|
|
152
247
|
}
|
153
248
|
else
|
154
249
|
{
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
rb_enc_associate_index(rword, enc_index);
|
159
|
-
|
160
|
-
if (RTEST(converter)) {
|
161
|
-
rword = rb_funcall(converter, spg_id_call, 1, rword);
|
162
|
-
}
|
163
|
-
|
164
|
-
rb_ary_push(array, rword);
|
250
|
+
word[word_index] = '\0';
|
251
|
+
rb_ary_push(array, spg__array_col_value(word, word_index, converter, enc_index, oid, db));
|
165
252
|
}
|
166
253
|
}
|
167
254
|
if(c == '}')
|
@@ -179,7 +266,7 @@ static VALUE read_array(int *index, char *c_pg_array_string, int array_string_le
|
|
179
266
|
else if(c == '{')
|
180
267
|
{
|
181
268
|
(*index)++;
|
182
|
-
rb_ary_push(array, read_array(index, c_pg_array_string, array_string_length, buf, converter, enc_index));
|
269
|
+
rb_ary_push(array, read_array(index, c_pg_array_string, array_string_length, buf, converter, enc_index, oid, db));
|
183
270
|
escapeNext = 1;
|
184
271
|
}
|
185
272
|
else
|
@@ -213,29 +300,23 @@ static VALUE read_array(int *index, char *c_pg_array_string, int array_string_le
|
|
213
300
|
return array;
|
214
301
|
}
|
215
302
|
|
216
|
-
static VALUE
|
217
|
-
|
218
|
-
/* convert to c-string, create additional ruby string buffer of
|
219
|
-
* the same length, as that will be the worst case. */
|
220
|
-
char *c_pg_array_string = StringValueCStr(pg_array_string);
|
221
|
-
int array_string_length = RSTRING_LEN(pg_array_string);
|
222
|
-
VALUE buf = rb_str_buf_new(array_string_length);
|
223
|
-
int index = 1;
|
224
|
-
|
303
|
+
static VALUE check_pg_array(int* index, char *c_pg_array_string, int array_string_length) {
|
225
304
|
if (array_string_length == 0) {
|
226
305
|
rb_raise(rb_eArgError, "unexpected PostgreSQL array format, empty");
|
306
|
+
} else if (array_string_length == 2 && c_pg_array_string[0] == '{' && c_pg_array_string[0] == '}') {
|
307
|
+
return rb_ary_new();
|
227
308
|
}
|
228
309
|
|
229
310
|
switch (c_pg_array_string[0]) {
|
230
311
|
case '[':
|
231
312
|
/* Skip explicit subscripts, scanning until opening array */
|
232
|
-
for(;index < array_string_length && c_pg_array_string[index] != '{'; ++index)
|
313
|
+
for(;(*index) < array_string_length && c_pg_array_string[(*index)] != '{'; ++(*index))
|
233
314
|
/* nothing */;
|
234
315
|
|
235
|
-
if (index >= array_string_length) {
|
316
|
+
if ((*index) >= array_string_length) {
|
236
317
|
rb_raise(rb_eArgError, "unexpected PostgreSQL array format, no {");
|
237
318
|
} else {
|
238
|
-
++index;
|
319
|
+
++(*index);
|
239
320
|
}
|
240
321
|
case '{':
|
241
322
|
break;
|
@@ -243,9 +324,29 @@ static VALUE parse_pg_array(VALUE self, VALUE pg_array_string, VALUE converter)
|
|
243
324
|
rb_raise(rb_eArgError, "unexpected PostgreSQL array format, doesn't start with { or [");
|
244
325
|
}
|
245
326
|
|
246
|
-
return
|
247
|
-
|
248
|
-
|
327
|
+
return Qnil;
|
328
|
+
}
|
329
|
+
|
330
|
+
static VALUE parse_pg_array(VALUE self, VALUE pg_array_string, VALUE converter) {
|
331
|
+
/* convert to c-string, create additional ruby string buffer of
|
332
|
+
* the same length, as that will be the worst case. */
|
333
|
+
char *c_pg_array_string = StringValueCStr(pg_array_string);
|
334
|
+
int array_string_length = RSTRING_LEN(pg_array_string);
|
335
|
+
int index = 1;
|
336
|
+
VALUE ary;
|
337
|
+
|
338
|
+
if(RTEST(ary = check_pg_array(&index, c_pg_array_string, array_string_length))) {
|
339
|
+
return ary;
|
340
|
+
}
|
341
|
+
|
342
|
+
return read_array(&index,
|
343
|
+
c_pg_array_string,
|
344
|
+
array_string_length,
|
345
|
+
rb_str_buf_new(array_string_length),
|
346
|
+
converter,
|
347
|
+
enc_get_index(pg_array_string),
|
348
|
+
0,
|
349
|
+
Qnil);
|
249
350
|
}
|
250
351
|
|
251
352
|
static VALUE spg_time(const char *s) {
|
@@ -272,11 +373,10 @@ static VALUE spg_time(const char *s) {
|
|
272
373
|
}
|
273
374
|
|
274
375
|
static VALUE spg_timestamp_error(const char *s, VALUE self, const char *error_msg) {
|
275
|
-
|
276
|
-
|
277
|
-
if(RTEST(rb_funcall(db, spg_id_convert_infinite_timestamps, 0))) {
|
376
|
+
self = rb_funcall(self, spg_id_db, 0);
|
377
|
+
if(RTEST(rb_funcall(self, spg_id_convert_infinite_timestamps, 0))) {
|
278
378
|
if((strcmp(s, "infinity") == 0) || (strcmp(s, "-infinity") == 0)) {
|
279
|
-
return rb_funcall(
|
379
|
+
return rb_funcall(self, spg_id_infinite_timestamp_value, 1, rb_tainted_str_new2(s));
|
280
380
|
}
|
281
381
|
}
|
282
382
|
rb_raise(rb_eArgError, "%s", error_msg);
|
@@ -454,17 +554,95 @@ static VALUE spg_fetch_rows_set_cols(VALUE self, VALUE ignore) {
|
|
454
554
|
return Qnil;
|
455
555
|
}
|
456
556
|
|
557
|
+
static VALUE spg__array_col_value(char *v, size_t length, VALUE converter, int enc_index, int oid, VALUE db) {
|
558
|
+
VALUE rv;
|
559
|
+
size_t l;
|
560
|
+
|
561
|
+
switch(oid) {
|
562
|
+
case 16: /* boolean */
|
563
|
+
rv = *v == 't' ? Qtrue : Qfalse;
|
564
|
+
break;
|
565
|
+
case 17: /* bytea */
|
566
|
+
v = (char *)PQunescapeBytea((unsigned char*)v, &l);
|
567
|
+
rv = rb_funcall(spg_Blob, spg_id_new, 1, rb_str_new(v, l));
|
568
|
+
PQfreemem(v);
|
569
|
+
break;
|
570
|
+
case 20: /* integer */
|
571
|
+
case 21:
|
572
|
+
case 23:
|
573
|
+
case 26:
|
574
|
+
rv = pg_text_dec_integer(v, length);
|
575
|
+
break;
|
576
|
+
case 700: /* float */
|
577
|
+
case 701:
|
578
|
+
if (strcmp("NaN", v) == 0) {
|
579
|
+
rv = spg_nan;
|
580
|
+
} else if (strcmp("Infinity", v) == 0) {
|
581
|
+
rv = spg_pos_inf;
|
582
|
+
} else if (strcmp("-Infinity", v) == 0) {
|
583
|
+
rv = spg_neg_inf;
|
584
|
+
} else {
|
585
|
+
rv = rb_float_new(rb_cstr_to_dbl(v, Qfalse));
|
586
|
+
}
|
587
|
+
break;
|
588
|
+
case 1700: /* numeric */
|
589
|
+
rv = rb_funcall(spg_Kernel, spg_id_BigDecimal, 1, rb_str_new(v, length));
|
590
|
+
break;
|
591
|
+
case 1082: /* date */
|
592
|
+
rv = spg_date(v, db);
|
593
|
+
break;
|
594
|
+
case 1083: /* time */
|
595
|
+
case 1266:
|
596
|
+
rv = spg_time(v);
|
597
|
+
break;
|
598
|
+
case 1114: /* timestamp */
|
599
|
+
case 1184:
|
600
|
+
rv = spg_timestamp(v, db);
|
601
|
+
break;
|
602
|
+
case 18: /* char */
|
603
|
+
case 25: /* text */
|
604
|
+
case 1043: /* varchar*/
|
605
|
+
rv = rb_tainted_str_new(v, length);
|
606
|
+
PG_ENCODING_SET_NOCHECK(rv, enc_index);
|
607
|
+
break;
|
608
|
+
default:
|
609
|
+
rv = rb_tainted_str_new(v, length);
|
610
|
+
PG_ENCODING_SET_NOCHECK(rv, enc_index);
|
611
|
+
if (RTEST(converter)) {
|
612
|
+
rv = rb_funcall(converter, spg_id_call, 1, rv);
|
613
|
+
}
|
614
|
+
}
|
615
|
+
|
616
|
+
return rv;
|
617
|
+
}
|
618
|
+
|
619
|
+
static VALUE spg_array_value(char *c_pg_array_string, int array_string_length, VALUE converter, int enc_index, int oid, VALUE self, VALUE array_type) {
|
620
|
+
int index = 1;
|
621
|
+
VALUE args[2];
|
622
|
+
args[1] = array_type;
|
623
|
+
|
624
|
+
if(RTEST(args[0] = check_pg_array(&index, c_pg_array_string, array_string_length))) {
|
625
|
+
return rb_class_new_instance(2, args, spg_PGArray);
|
626
|
+
}
|
627
|
+
|
628
|
+
args[0] = read_array(&index, c_pg_array_string, array_string_length, rb_str_buf_new(array_string_length), converter, enc_index, oid, self);
|
629
|
+
return rb_class_new_instance(2, args, spg_PGArray);
|
630
|
+
}
|
631
|
+
|
457
632
|
static VALUE spg__col_value(VALUE self, PGresult *res, long i, long j, VALUE* colconvert, int enc_index) {
|
458
633
|
char *v;
|
459
634
|
VALUE rv;
|
460
635
|
size_t l;
|
636
|
+
int ftype = PQftype(res, j);
|
637
|
+
VALUE array_type;
|
638
|
+
VALUE scalar_oid;
|
461
639
|
|
462
640
|
if(PQgetisnull(res, i, j)) {
|
463
641
|
rv = Qnil;
|
464
642
|
} else {
|
465
643
|
v = PQgetvalue(res, i, j);
|
466
644
|
|
467
|
-
switch(
|
645
|
+
switch(ftype) {
|
468
646
|
case 16: /* boolean */
|
469
647
|
rv = *v == 't' ? Qtrue : Qfalse;
|
470
648
|
break;
|
@@ -477,7 +655,7 @@ static VALUE spg__col_value(VALUE self, PGresult *res, long i, long j, VALUE* co
|
|
477
655
|
case 21:
|
478
656
|
case 23:
|
479
657
|
case 26:
|
480
|
-
rv =
|
658
|
+
rv = pg_text_dec_integer(v, PQgetlength(res, i, j));
|
481
659
|
break;
|
482
660
|
case 700: /* float */
|
483
661
|
case 701:
|
@@ -509,11 +687,148 @@ static VALUE spg__col_value(VALUE self, PGresult *res, long i, long j, VALUE* co
|
|
509
687
|
case 25: /* text */
|
510
688
|
case 1043: /* varchar*/
|
511
689
|
rv = rb_tainted_str_new(v, PQgetlength(res, i, j));
|
512
|
-
|
690
|
+
PG_ENCODING_SET_NOCHECK(rv, enc_index);
|
691
|
+
break;
|
692
|
+
/* array types */
|
693
|
+
case 1009:
|
694
|
+
case 1014:
|
695
|
+
case 1015:
|
696
|
+
case 1007:
|
697
|
+
case 1115:
|
698
|
+
case 1185:
|
699
|
+
case 1183:
|
700
|
+
case 1270:
|
701
|
+
case 1016:
|
702
|
+
case 1231:
|
703
|
+
case 1022:
|
704
|
+
case 1000:
|
705
|
+
case 1001:
|
706
|
+
case 1182:
|
707
|
+
case 1005:
|
708
|
+
case 1028:
|
709
|
+
case 1021:
|
710
|
+
case 143:
|
711
|
+
case 791:
|
712
|
+
case 1561:
|
713
|
+
case 1563:
|
714
|
+
case 2951:
|
715
|
+
case 1011:
|
716
|
+
case 1012:
|
717
|
+
case 1003:
|
718
|
+
case 1010:
|
719
|
+
case 1006:
|
720
|
+
switch(ftype) {
|
721
|
+
case 1009:
|
722
|
+
case 1014:
|
723
|
+
array_type = spg_sym_text;
|
724
|
+
scalar_oid = 25;
|
725
|
+
break;
|
726
|
+
case 1015:
|
727
|
+
array_type = spg_sym_character_varying;
|
728
|
+
scalar_oid = 25;
|
729
|
+
break;
|
730
|
+
case 1007:
|
731
|
+
array_type = spg_sym_integer;
|
732
|
+
scalar_oid = 23;
|
733
|
+
break;
|
734
|
+
case 1115:
|
735
|
+
array_type = spg_sym_timestamp;
|
736
|
+
scalar_oid = 1114;
|
737
|
+
break;
|
738
|
+
case 1185:
|
739
|
+
array_type = spg_sym_timestamptz;
|
740
|
+
scalar_oid = 1184;
|
741
|
+
break;
|
742
|
+
case 1183:
|
743
|
+
array_type = spg_sym_time;
|
744
|
+
scalar_oid = 1083;
|
745
|
+
break;
|
746
|
+
case 1270:
|
747
|
+
array_type = spg_sym_timetz;
|
748
|
+
scalar_oid = 1266;
|
749
|
+
break;
|
750
|
+
case 1016:
|
751
|
+
array_type = spg_sym_bigint;
|
752
|
+
scalar_oid = 20;
|
753
|
+
break;
|
754
|
+
case 1231:
|
755
|
+
array_type = spg_sym_numeric;
|
756
|
+
scalar_oid = 1700;
|
757
|
+
break;
|
758
|
+
case 1022:
|
759
|
+
array_type = spg_sym_double_precision;
|
760
|
+
scalar_oid = 701;
|
761
|
+
break;
|
762
|
+
case 1000:
|
763
|
+
array_type = spg_sym_boolean;
|
764
|
+
scalar_oid = 16;
|
765
|
+
break;
|
766
|
+
case 1001:
|
767
|
+
array_type = spg_sym_bytea;
|
768
|
+
scalar_oid = 17;
|
769
|
+
break;
|
770
|
+
case 1182:
|
771
|
+
array_type = spg_sym_date;
|
772
|
+
scalar_oid = 1082;
|
773
|
+
break;
|
774
|
+
case 1005:
|
775
|
+
array_type = spg_sym_smallint;
|
776
|
+
scalar_oid = 21;
|
777
|
+
break;
|
778
|
+
case 1028:
|
779
|
+
array_type = spg_sym_oid;
|
780
|
+
scalar_oid = 26;
|
781
|
+
break;
|
782
|
+
case 1021:
|
783
|
+
array_type = spg_sym_real;
|
784
|
+
scalar_oid = 700;
|
785
|
+
break;
|
786
|
+
case 143:
|
787
|
+
array_type = spg_sym_xml;
|
788
|
+
scalar_oid = 142;
|
789
|
+
break;
|
790
|
+
case 791:
|
791
|
+
array_type = spg_sym_money;
|
792
|
+
scalar_oid = 790;
|
793
|
+
break;
|
794
|
+
case 1561:
|
795
|
+
array_type = spg_sym_bit;
|
796
|
+
scalar_oid = 1560;
|
797
|
+
break;
|
798
|
+
case 1563:
|
799
|
+
array_type = spg_sym_bit_varying;
|
800
|
+
scalar_oid = 1562;
|
801
|
+
break;
|
802
|
+
case 2951:
|
803
|
+
array_type = spg_sym_uuid;
|
804
|
+
scalar_oid = 2950;
|
805
|
+
break;
|
806
|
+
case 1011:
|
807
|
+
array_type = spg_sym_xid;
|
808
|
+
scalar_oid = 28;
|
809
|
+
break;
|
810
|
+
case 1012:
|
811
|
+
array_type = spg_sym_cid;
|
812
|
+
scalar_oid = 29;
|
813
|
+
break;
|
814
|
+
case 1003:
|
815
|
+
array_type = spg_sym_name;
|
816
|
+
scalar_oid = 19;
|
817
|
+
break;
|
818
|
+
case 1010:
|
819
|
+
array_type = spg_sym_tid;
|
820
|
+
scalar_oid = 27;
|
821
|
+
break;
|
822
|
+
case 1006:
|
823
|
+
array_type = spg_sym_int2vector;
|
824
|
+
scalar_oid = 22;
|
825
|
+
break;
|
826
|
+
}
|
827
|
+
rv = spg_array_value(v, PQgetlength(res, i, j), Qnil, enc_index, scalar_oid, self, array_type);
|
513
828
|
break;
|
514
829
|
default:
|
515
830
|
rv = rb_tainted_str_new(v, PQgetlength(res, i, j));
|
516
|
-
|
831
|
+
PG_ENCODING_SET_NOCHECK(rv, enc_index);
|
517
832
|
if (colconvert[j] != Qnil) {
|
518
833
|
rv = rb_funcall(colconvert[j], spg_id_call, 1, rv);
|
519
834
|
}
|
@@ -1002,6 +1317,7 @@ void Init_sequel_pg(void) {
|
|
1002
1317
|
return;
|
1003
1318
|
}
|
1004
1319
|
}
|
1320
|
+
rb_funcall(spg_Postgres, rb_intern("const_set"), 2, ID2SYM(rb_intern("SEQUEL_PG_VERSION_INTEGER")), INT2FIX(SEQUEL_PG_VERSION_INTEGER));
|
1005
1321
|
|
1006
1322
|
spg_id_BigDecimal = rb_intern("BigDecimal");
|
1007
1323
|
spg_id_new = rb_intern("new");
|
@@ -1046,6 +1362,33 @@ void Init_sequel_pg(void) {
|
|
1046
1362
|
spg_sym__sequel_pg_type = ID2SYM(rb_intern("_sequel_pg_type"));
|
1047
1363
|
spg_sym__sequel_pg_value = ID2SYM(rb_intern("_sequel_pg_value"));
|
1048
1364
|
|
1365
|
+
spg_sym_text = ID2SYM(rb_intern("text"));
|
1366
|
+
spg_sym_character_varying = ID2SYM(rb_intern("character varying"));
|
1367
|
+
spg_sym_integer = ID2SYM(rb_intern("integer"));
|
1368
|
+
spg_sym_timestamp = ID2SYM(rb_intern("timestamp"));
|
1369
|
+
spg_sym_timestamptz = ID2SYM(rb_intern("timestamptz"));
|
1370
|
+
spg_sym_time = ID2SYM(rb_intern("time"));
|
1371
|
+
spg_sym_timetz = ID2SYM(rb_intern("timetz"));
|
1372
|
+
spg_sym_bigint = ID2SYM(rb_intern("bigint"));
|
1373
|
+
spg_sym_numeric = ID2SYM(rb_intern("numeric"));
|
1374
|
+
spg_sym_double_precision = ID2SYM(rb_intern("double precision"));
|
1375
|
+
spg_sym_boolean = ID2SYM(rb_intern("boolean"));
|
1376
|
+
spg_sym_bytea = ID2SYM(rb_intern("bytea"));
|
1377
|
+
spg_sym_date = ID2SYM(rb_intern("date"));
|
1378
|
+
spg_sym_smallint = ID2SYM(rb_intern("smallint"));
|
1379
|
+
spg_sym_oid = ID2SYM(rb_intern("oid"));
|
1380
|
+
spg_sym_real = ID2SYM(rb_intern("real"));
|
1381
|
+
spg_sym_xml = ID2SYM(rb_intern("xml"));
|
1382
|
+
spg_sym_money = ID2SYM(rb_intern("money"));
|
1383
|
+
spg_sym_bit = ID2SYM(rb_intern("bit"));
|
1384
|
+
spg_sym_bit_varying = ID2SYM(rb_intern("bit varying"));
|
1385
|
+
spg_sym_uuid = ID2SYM(rb_intern("uuid"));
|
1386
|
+
spg_sym_xid = ID2SYM(rb_intern("xid"));
|
1387
|
+
spg_sym_cid = ID2SYM(rb_intern("cid"));
|
1388
|
+
spg_sym_name = ID2SYM(rb_intern("name"));
|
1389
|
+
spg_sym_tid = ID2SYM(rb_intern("tid"));
|
1390
|
+
spg_sym_int2vector = ID2SYM(rb_intern("int2vector"));
|
1391
|
+
|
1049
1392
|
spg_Blob = rb_funcall(rb_funcall(spg_Sequel, cg, 1, rb_str_new2("SQL")), cg, 1, rb_str_new2("Blob"));
|
1050
1393
|
spg_SQLTime= rb_funcall(spg_Sequel, cg, 1, rb_str_new2("SQLTime"));
|
1051
1394
|
spg_Kernel = rb_funcall(rb_cObject, cg, 1, rb_str_new2("Kernel"));
|
@@ -1089,4 +1432,8 @@ void Init_sequel_pg(void) {
|
|
1089
1432
|
rb_define_singleton_method(spg_Postgres, "parse_pg_array", parse_pg_array, 2);
|
1090
1433
|
|
1091
1434
|
rb_require("sequel_pg/sequel_pg");
|
1435
|
+
|
1436
|
+
rb_require("sequel/extensions/pg_array");
|
1437
|
+
spg_PGArray = rb_funcall(spg_Postgres, cg, 1, rb_str_new2("PGArray"));
|
1438
|
+
rb_global_variable(&spg_PGArray);
|
1092
1439
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel_pg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
91
|
version: '0'
|
92
92
|
requirements: []
|
93
93
|
rubyforge_project:
|
94
|
-
rubygems_version:
|
94
|
+
rubygems_version: 3.0.0.beta1
|
95
95
|
signing_key:
|
96
96
|
specification_version: 4
|
97
97
|
summary: Faster SELECTs when using Sequel with pg
|