sequel_pg 1.7.1 → 1.8.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: '08ac123f28a04a27f31f8e0c36f35357c97518db'
4
- data.tar.gz: f55ca7eec3931cbc8b4d3a4c6eb1295299d511a1
3
+ metadata.gz: 12f6ab4a1eb1aefe52198b01d2b32ff5e1108dd3
4
+ data.tar.gz: d70c53a25c1af4d132bf63c7887f096efa0754e3
5
5
  SHA512:
6
- metadata.gz: fdee057696e6a5cf1c283a2e1305df07dd7a9773e5eb284a6bdd7ecf5df4e21288a7f961afaad334ff23d71ec1b6ef980be95753ec80f0912d86920b897b7073
7
- data.tar.gz: 97715ed30e04d22e9f479720e8bd08c830050e86408a67dae20f60ce1aca397a40155b8c31c6d837b651b4b2b426e79757a1a802281cba8fdf21a8142d2fb0ea
6
+ metadata.gz: 0ed2744dc9f5e9620bf463ad85baca278b84a20ea0368f36e2c65243cb9cc38c1ea7746cce9c9b881d78ff26ee1ef35341f788a5d919f613aeebe32c3d11b470
7
+ data.tar.gz: 59a2b4123aae9e61b025b1b9006c1f6700b5b876fd6de28bdbd27d2123c3d7d71e428ce559273a69a7376cd757658fb6960ff452ebb9dcf730e8bace0284b746
data/CHANGELOG CHANGED
@@ -1,3 +1,15 @@
1
+ === 1.8.0 (2017-10-18)
2
+
3
+ * Handle timezone offsets with seconds when parsing timestamps (jeremyevans)
4
+
5
+ * Parse BC dates and timestamps correctly (jeremyevans)
6
+
7
+ * Drop Sequel <4.34.0 support (jeremyevans)
8
+
9
+ * Drop pg <0.18.0 support (jeremyevans)
10
+
11
+ * Drop ruby <1.9.3 support (jeremyevans)
12
+
1
13
  === 1.7.1 (2017-08-25)
2
14
 
3
15
  * Handle case where PGconn#get_result returns nil in single row mode (jeremyevans)
@@ -130,7 +130,6 @@ requirements:
130
130
 
131
131
  sequel_pg has been tested on the following:
132
132
 
133
- * ruby 1.8.7
134
133
  * ruby 1.9.3
135
134
  * ruby 2.0
136
135
  * ruby 2.1
@@ -1,18 +1,9 @@
1
1
  require 'mkmf'
2
- $CFLAGS << " -O0 -g -ggdb" if ENV['DEBUG']
2
+ $CFLAGS << " -O0 -g" if ENV['DEBUG']
3
3
  $CFLAGS << " -Wall " unless RUBY_PLATFORM =~ /solaris/
4
4
  dir_config('pg', ENV["POSTGRES_INCLUDE"] || (IO.popen("pg_config --includedir").readline.chomp rescue nil),
5
5
  ENV["POSTGRES_LIB"] || (IO.popen("pg_config --libdir").readline.chomp rescue nil))
6
6
 
7
- if enable_config("static-build")
8
- # Link against all required libraries for static build, if they are available
9
- have_library('gdi32', 'CreateDC')
10
- have_library('secur32')
11
- have_library('ws2_32')
12
- have_library('eay32')
13
- have_library('ssleay32', 'SSL_pending')
14
- end
15
-
16
7
  if (have_library('pq') || have_library('libpq') || have_library('ms/libpq')) && have_header('libpq-fe.h')
17
8
  have_func 'PQsetSingleRowMode'
18
9
  create_makefile("sequel_pg")
@@ -1,4 +1,4 @@
1
- #define SEQUEL_PG_VERSION_INTEGER 10701
1
+ #define SEQUEL_PG_VERSION_INTEGER 10800
2
2
 
3
3
  #include <string.h>
4
4
  #include <stdio.h>
@@ -6,23 +6,15 @@
6
6
  #include <libpq-fe.h>
7
7
  #include <ruby.h>
8
8
 
9
- #if defined(HAVE_RUBY_ENCODING_H) && HAVE_RUBY_ENCODING_H
10
- #define SPG_ENCODING 1
11
9
  #include <ruby/encoding.h>
12
- #define ENC_INDEX ,enc_index
13
- #else
14
- #define ENC_INDEX
15
- #endif
16
10
 
17
11
  #ifndef SPG_MAX_FIELDS
18
12
  #define SPG_MAX_FIELDS 256
19
13
  #endif
20
- #define SPG_MICROSECONDS_PER_DAY_LL 86400000000ULL
21
- #define SPG_MICROSECONDS_PER_DAY 86400000000.0
22
14
  #define SPG_MINUTES_PER_DAY 1440.0
23
15
  #define SPG_SECONDS_PER_DAY 86400.0
24
16
 
25
- #define SPG_DT_ADD_USEC if (usec != 0) { dt = rb_funcall(dt, spg_id_op_plus, 1, spg_id_Rational ? rb_funcall(rb_cObject, spg_id_Rational, 2, INT2NUM(usec), ULL2NUM(SPG_MICROSECONDS_PER_DAY_LL)) : rb_float_new(usec/SPG_MICROSECONDS_PER_DAY)); }
17
+ #define SPG_DT_ADD_USEC if (usec != 0) { dt = rb_funcall(dt, spg_id_op_plus, 1, rb_Rational2(INT2NUM(usec), spg_usec_per_day)); }
26
18
 
27
19
  #define SPG_NO_TZ 0
28
20
  #define SPG_DB_LOCAL 1
@@ -45,18 +37,10 @@
45
37
  #define SPG_YIELD_KMV_HASH_GROUPS 12
46
38
  #define SPG_YIELD_MKMV_HASH_GROUPS 13
47
39
 
48
- /* Whether the data objects are structs instead of just pointers */
49
- static int unwrap_structs;
50
- static int use_columns_method;
51
-
52
40
  /* External functions defined by ruby-pg when data objects are structs */
53
41
  PGconn* pg_get_pgconn(VALUE);
54
42
  PGresult* pgresult_get(VALUE);
55
43
 
56
- /* Normalize access to data objects for both old and new versions of pg gem */
57
- #define GetPGconn(_val, _var) if (unwrap_structs) {Check_Type(_val, T_DATA); _var = pg_get_pgconn(_val);} else {Data_Get_Struct(_val, PGconn, _var);}
58
- #define GetPGresult(_val, _var) if (unwrap_structs) {Check_Type(_val, T_DATA); _var = pgresult_get(_val);} else {Data_Get_Struct(_val, PGresult, _var);}
59
-
60
44
  static VALUE spg_Sequel;
61
45
  static VALUE spg_Blob;
62
46
  static VALUE spg_BigDecimal;
@@ -78,8 +62,8 @@ static VALUE spg_sym__sequel_pg_value;
78
62
  static VALUE spg_nan;
79
63
  static VALUE spg_pos_inf;
80
64
  static VALUE spg_neg_inf;
65
+ static VALUE spg_usec_per_day;
81
66
 
82
- static ID spg_id_Rational;
83
67
  static ID spg_id_new;
84
68
  static ID spg_id_local;
85
69
  static ID spg_id_year;
@@ -116,23 +100,15 @@ static ID spg_id_clear;
116
100
  static ID spg_id_check;
117
101
  #endif
118
102
 
119
- #if SPG_ENCODING
120
- static int enc_get_index(VALUE val)
121
- {
103
+ static int enc_get_index(VALUE val) {
122
104
  int i = ENCODING_GET_INLINED(val);
123
105
  if (i == ENCODING_INLINE_MAX) {
124
106
  i = NUM2INT(rb_ivar_get(val, spg_id_encoding));
125
107
  }
126
108
  return i;
127
109
  }
128
- #endif
129
110
 
130
- static VALUE read_array(int *index, char *c_pg_array_string, int array_string_length, VALUE buf, VALUE converter
131
- #ifdef SPG_ENCODING
132
- , int enc_index
133
- #endif
134
- )
135
- {
111
+ static VALUE read_array(int *index, char *c_pg_array_string, int array_string_length, VALUE buf, VALUE converter, int enc_index) {
136
112
  int word_index = 0;
137
113
  char *word = RSTRING_PTR(buf);
138
114
 
@@ -178,9 +154,7 @@ static VALUE read_array(int *index, char *c_pg_array_string, int array_string_le
178
154
  VALUE rword = rb_tainted_str_new(word, word_index);
179
155
  RB_GC_GUARD(rword);
180
156
 
181
- #ifdef SPG_ENCODING
182
157
  rb_enc_associate_index(rword, enc_index);
183
- #endif
184
158
 
185
159
  if (RTEST(converter)) {
186
160
  rword = rb_funcall(converter, spg_id_call, 1, rword);
@@ -204,11 +178,7 @@ static VALUE read_array(int *index, char *c_pg_array_string, int array_string_le
204
178
  else if(c == '{')
205
179
  {
206
180
  (*index)++;
207
- rb_ary_push(array, read_array(index, c_pg_array_string, array_string_length, buf, converter
208
- #ifdef SPG_ENCODING
209
- , enc_index
210
- #endif
211
- ));
181
+ rb_ary_push(array, read_array(index, c_pg_array_string, array_string_length, buf, converter, enc_index));
212
182
  escapeNext = 1;
213
183
  }
214
184
  else
@@ -273,9 +243,7 @@ static VALUE parse_pg_array(VALUE self, VALUE pg_array_string, VALUE converter)
273
243
  }
274
244
 
275
245
  return read_array(&index, c_pg_array_string, array_string_length, buf, converter
276
- #ifdef SPG_ENCODING
277
246
  , enc_get_index(pg_array_string)
278
- #endif
279
247
  );
280
248
  }
281
249
 
@@ -320,13 +288,18 @@ static VALUE spg_date(const char *s, VALUE self) {
320
288
  return spg_timestamp_error(s, self, "unexpected date format");
321
289
  }
322
290
 
291
+ if(s[10] == ' ' && s[11] == 'B' && s[12] == 'C') {
292
+ year = -year;
293
+ year++;
294
+ }
295
+
323
296
  return rb_funcall(spg_Date, spg_id_new, 3, INT2NUM(year), INT2NUM(month), INT2NUM(day));
324
297
  }
325
298
 
326
299
  static VALUE spg_timestamp(const char *s, VALUE self) {
327
300
  VALUE dtc, dt, rtz, db;
328
301
  int tz = SPG_NO_TZ;
329
- int year, month, day, hour, min, sec, usec, tokens, utc_offset;
302
+ int year, month, day, hour, min, sec, usec, tokens, utc_offset, len;
330
303
  int usec_start, usec_stop;
331
304
  char offset_sign = 0;
332
305
  int offset_hour = 0;
@@ -358,18 +331,18 @@ static VALUE spg_timestamp(const char *s, VALUE self) {
358
331
  }
359
332
 
360
333
  if (0 != strchr(s, '.')) {
361
- tokens = sscanf(s, "%d-%2d-%2d %2d:%2d:%2d.%n%d%n%c%02d:%02d",
362
- &year, &month, &day, &hour, &min, &sec,
363
- &usec_start, &usec, &usec_stop,
364
- &offset_sign, &offset_hour, &offset_minute);
334
+ tokens = sscanf(s, "%d-%2d-%2d %2d:%2d:%2d.%n%d%n%c%02d:%02d:%02d",
335
+ &year, &month, &day, &hour, &min, &sec,
336
+ &usec_start, &usec, &usec_stop,
337
+ &offset_sign, &offset_hour, &offset_minute, &offset_seconds);
365
338
  if(tokens < 7) {
366
339
  return spg_timestamp_error(s, self, "unexpected datetime format");
367
340
  }
368
341
  usec *= (int) pow(10, (6 - (usec_stop - usec_start)));
369
342
  } else {
370
- tokens = sscanf(s, "%d-%2d-%2d %2d:%2d:%2d%c%02d:%02d",
371
- &year, &month, &day, &hour, &min, &sec,
372
- &offset_sign, &offset_hour, &offset_minute);
343
+ tokens = sscanf(s, "%d-%2d-%2d %2d:%2d:%2d%c%02d:%02d:%02d",
344
+ &year, &month, &day, &hour, &min, &sec,
345
+ &offset_sign, &offset_hour, &offset_minute, &offset_seconds);
373
346
  if (tokens == 3) {
374
347
  hour = 0;
375
348
  min = 0;
@@ -380,9 +353,16 @@ static VALUE spg_timestamp(const char *s, VALUE self) {
380
353
  usec = 0;
381
354
  }
382
355
 
356
+ len = strlen(s);
357
+ if(s[len-3] == ' ' && s[len-2] == 'B' && s[len-1] == 'C') {
358
+ year = -year;
359
+ year++;
360
+ }
361
+
383
362
  if (offset_sign == '-') {
384
363
  offset_hour *= -1;
385
364
  offset_minute *= -1;
365
+ offset_seconds *= -1;
386
366
  }
387
367
 
388
368
  dtc = rb_funcall(spg_Sequel, spg_id_datetime_class, 0);
@@ -394,7 +374,7 @@ static VALUE spg_timestamp(const char *s, VALUE self) {
394
374
  */
395
375
  dt = rb_funcall(rb_cTime, spg_id_local, 7, INT2NUM(year), INT2NUM(month), INT2NUM(day), INT2NUM(hour), INT2NUM(min), INT2NUM(sec), INT2NUM(usec));
396
376
  utc_offset = NUM2INT(rb_funcall(dt, spg_id_utc_offset, 0));
397
- offset_seconds = offset_hour * 3600 + offset_minute * 60;
377
+ offset_seconds += offset_hour * 3600 + offset_minute * 60;
398
378
  if (utc_offset != offset_seconds) {
399
379
  dt = rb_funcall(dt, spg_id_op_plus, 1, INT2NUM(utc_offset - offset_seconds));
400
380
  }
@@ -429,7 +409,7 @@ static VALUE spg_timestamp(const char *s, VALUE self) {
429
409
  /* Offset given, handle correct local time.
430
410
  * While PostgreSQL generally returns timestamps in local time, it's unwise to rely on this.
431
411
  */
432
- offset_fraction = offset_hour/24.0 + offset_minute/SPG_MINUTES_PER_DAY;
412
+ offset_fraction = offset_hour/24.0 + offset_minute/SPG_MINUTES_PER_DAY + offset_seconds/SPG_SECONDS_PER_DAY;
433
413
  dt = rb_funcall(dtc, spg_id_new, 7, INT2NUM(year), INT2NUM(month), INT2NUM(day), INT2NUM(hour), INT2NUM(min), INT2NUM(sec), rb_float_new(offset_fraction));
434
414
  SPG_DT_ADD_USEC
435
415
 
@@ -473,11 +453,7 @@ static VALUE spg_fetch_rows_set_cols(VALUE self, VALUE ignore) {
473
453
  return Qnil;
474
454
  }
475
455
 
476
- static VALUE spg__col_value(VALUE self, PGresult *res, long i, long j, VALUE* colconvert
477
- #ifdef SPG_ENCODING
478
- , int enc_index
479
- #endif
480
- ) {
456
+ static VALUE spg__col_value(VALUE self, PGresult *res, long i, long j, VALUE* colconvert, int enc_index) {
481
457
  char *v;
482
458
  VALUE rv;
483
459
  size_t l;
@@ -532,15 +508,11 @@ static VALUE spg__col_value(VALUE self, PGresult *res, long i, long j, VALUE* co
532
508
  case 25: /* text */
533
509
  case 1043: /* varchar*/
534
510
  rv = rb_tainted_str_new(v, PQgetlength(res, i, j));
535
- #ifdef SPG_ENCODING
536
511
  rb_enc_associate_index(rv, enc_index);
537
- #endif
538
512
  break;
539
513
  default:
540
514
  rv = rb_tainted_str_new(v, PQgetlength(res, i, j));
541
- #ifdef SPG_ENCODING
542
515
  rb_enc_associate_index(rv, enc_index);
543
- #endif
544
516
  if (colconvert[j] != Qnil) {
545
517
  rv = rb_funcall(colconvert[j], spg_id_call, 1, rv);
546
518
  }
@@ -549,18 +521,14 @@ static VALUE spg__col_value(VALUE self, PGresult *res, long i, long j, VALUE* co
549
521
  return rv;
550
522
  }
551
523
 
552
- static VALUE spg__col_values(VALUE self, VALUE v, VALUE *colsyms, long nfields, PGresult *res, long i, VALUE *colconvert
553
- #ifdef SPG_ENCODING
554
- , int enc_index
555
- #endif
556
- ) {
524
+ static VALUE spg__col_values(VALUE self, VALUE v, VALUE *colsyms, long nfields, PGresult *res, long i, VALUE *colconvert, int enc_index) {
557
525
  long j;
558
526
  VALUE cur;
559
527
  long len = RARRAY_LEN(v);
560
528
  VALUE a = rb_ary_new2(len);
561
529
  for (j=0; j<len; j++) {
562
530
  cur = rb_ary_entry(v, j);
563
- rb_ary_store(a, j, cur == Qnil ? Qnil : spg__col_value(self, res, i, NUM2LONG(cur), colconvert ENC_INDEX));
531
+ rb_ary_store(a, j, cur == Qnil ? Qnil : spg__col_value(self, res, i, NUM2LONG(cur), colconvert, enc_index));
564
532
  }
565
533
  return a;
566
534
  }
@@ -589,14 +557,6 @@ static VALUE spg__field_ids(VALUE v, VALUE *colsyms, long nfields) {
589
557
  return pg_columns;
590
558
  }
591
559
 
592
- static void spg_set_columns(VALUE self, VALUE cols) {
593
- if (use_columns_method) {
594
- rb_funcall(self, spg_id_columns_equal, 1, cols);
595
- } else {
596
- rb_ivar_set(self, spg_id_columns, cols);
597
- }
598
- }
599
-
600
560
  static void spg_set_column_info(VALUE self, PGresult *res, VALUE *colsyms, VALUE *colconvert) {
601
561
  long i;
602
562
  long j;
@@ -637,7 +597,8 @@ static void spg_set_column_info(VALUE self, PGresult *res, VALUE *colsyms, VALUE
637
597
  break;
638
598
  }
639
599
  }
640
- spg_set_columns(self, rb_ary_new4(nfields, colsyms));
600
+
601
+ rb_funcall(self, spg_id_columns_equal, 1, rb_ary_new4(nfields, colsyms));
641
602
  }
642
603
 
643
604
  static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
@@ -657,12 +618,11 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
657
618
  if (!RTEST(rres)) {
658
619
  return self;
659
620
  }
660
- GetPGresult(rres, res);
621
+ Check_Type(rres, T_DATA);
622
+ res = pgresult_get(rres);
661
623
 
662
- #ifdef SPG_ENCODING
663
624
  int enc_index;
664
625
  enc_index = enc_get_index(rres);
665
- #endif
666
626
 
667
627
  ntuples = PQntuples(res);
668
628
  nfields = PQnfields(res);
@@ -716,7 +676,7 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
716
676
  for(i=0; i<ntuples; i++) {
717
677
  h = rb_hash_new();
718
678
  for(j=0; j<nfields; j++) {
719
- rb_hash_aset(h, colsyms[j], spg__col_value(self, res, i, j, colconvert ENC_INDEX));
679
+ rb_hash_aset(h, colsyms[j], spg__col_value(self, res, i, j, colconvert, enc_index));
720
680
  }
721
681
  rb_yield(h);
722
682
  }
@@ -730,7 +690,7 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
730
690
  }
731
691
  } else {
732
692
  for(i=0; i<ntuples; i++) {
733
- rb_yield(spg__col_value(self, res, i, j, colconvert ENC_INDEX));
693
+ rb_yield(spg__col_value(self, res, i, j, colconvert, enc_index));
734
694
  }
735
695
  }
736
696
  break;
@@ -738,13 +698,13 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
738
698
  /* Multiple columns as an array */
739
699
  h = spg__field_ids(pg_value, colsyms, nfields);
740
700
  for(i=0; i<ntuples; i++) {
741
- rb_yield(spg__col_values(self, h, colsyms, nfields, res, i, colconvert ENC_INDEX));
701
+ rb_yield(spg__col_values(self, h, colsyms, nfields, res, i, colconvert, enc_index));
742
702
  }
743
703
  break;
744
704
  case SPG_YIELD_FIRST:
745
705
  /* First column */
746
706
  for(i=0; i<ntuples; i++) {
747
- rb_yield(spg__col_value(self, res, i, 0, colconvert ENC_INDEX));
707
+ rb_yield(spg__col_value(self, res, i, 0, colconvert, enc_index));
748
708
  }
749
709
  break;
750
710
  case SPG_YIELD_ARRAY:
@@ -752,7 +712,7 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
752
712
  for(i=0; i<ntuples; i++) {
753
713
  h = rb_ary_new2(nfields);
754
714
  for(j=0; j<nfields; j++) {
755
- rb_ary_store(h, j, spg__col_value(self, res, i, j, colconvert ENC_INDEX));
715
+ rb_ary_store(h, j, spg__col_value(self, res, i, j, colconvert, enc_index));
756
716
  }
757
717
  rb_yield(h);
758
718
  }
@@ -767,13 +727,13 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
767
727
  v = spg__field_id(rb_ary_entry(pg_value, 1), colsyms, nfields);
768
728
  if(type == SPG_YIELD_KV_HASH) {
769
729
  for(i=0; i<ntuples; i++) {
770
- rb_hash_aset(h, spg__col_value(self, res, i, k, colconvert ENC_INDEX), spg__col_value(self, res, i, v, colconvert ENC_INDEX));
730
+ rb_hash_aset(h, spg__col_value(self, res, i, k, colconvert, enc_index), spg__col_value(self, res, i, v, colconvert, enc_index));
771
731
  }
772
732
  } else {
773
733
  VALUE kv, vv, a;
774
734
  for(i=0; i<ntuples; i++) {
775
- kv = spg__col_value(self, res, i, k, colconvert ENC_INDEX);
776
- vv = spg__col_value(self, res, i, v, colconvert ENC_INDEX);
735
+ kv = spg__col_value(self, res, i, k, colconvert, enc_index);
736
+ vv = spg__col_value(self, res, i, v, colconvert, enc_index);
777
737
  a = rb_hash_lookup(h, kv);
778
738
  if(!RTEST(a)) {
779
739
  rb_hash_aset(h, kv, rb_ary_new3(1, vv));
@@ -795,13 +755,13 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
795
755
  v = spg__field_id(rb_ary_entry(pg_value, 1), colsyms, nfields);
796
756
  if(type == SPG_YIELD_MKV_HASH) {
797
757
  for(i=0; i<ntuples; i++) {
798
- rb_hash_aset(h, spg__col_values(self, k, colsyms, nfields, res, i, colconvert ENC_INDEX), spg__col_value(self, res, i, v, colconvert ENC_INDEX));
758
+ rb_hash_aset(h, spg__col_values(self, k, colsyms, nfields, res, i, colconvert, enc_index), spg__col_value(self, res, i, v, colconvert, enc_index));
799
759
  }
800
760
  } else {
801
761
  VALUE kv, vv, a;
802
762
  for(i=0; i<ntuples; i++) {
803
- kv = spg__col_values(self, k, colsyms, nfields, res, i, colconvert ENC_INDEX);
804
- vv = spg__col_value(self, res, i, v, colconvert ENC_INDEX);
763
+ kv = spg__col_values(self, k, colsyms, nfields, res, i, colconvert, enc_index);
764
+ vv = spg__col_value(self, res, i, v, colconvert, enc_index);
805
765
  a = rb_hash_lookup(h, kv);
806
766
  if(!RTEST(a)) {
807
767
  rb_hash_aset(h, kv, rb_ary_new3(1, vv));
@@ -823,13 +783,13 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
823
783
  v = spg__field_ids(rb_ary_entry(pg_value, 1), colsyms, nfields);
824
784
  if(type == SPG_YIELD_KMV_HASH) {
825
785
  for(i=0; i<ntuples; i++) {
826
- rb_hash_aset(h, spg__col_value(self, res, i, k, colconvert ENC_INDEX), spg__col_values(self, v, colsyms, nfields, res, i, colconvert ENC_INDEX));
786
+ rb_hash_aset(h, spg__col_value(self, res, i, k, colconvert, enc_index), spg__col_values(self, v, colsyms, nfields, res, i, colconvert, enc_index));
827
787
  }
828
788
  } else {
829
789
  VALUE kv, vv, a;
830
790
  for(i=0; i<ntuples; i++) {
831
- kv = spg__col_value(self, res, i, k, colconvert ENC_INDEX);
832
- vv = spg__col_values(self, v, colsyms, nfields, res, i, colconvert ENC_INDEX);
791
+ kv = spg__col_value(self, res, i, k, colconvert, enc_index);
792
+ vv = spg__col_values(self, v, colsyms, nfields, res, i, colconvert, enc_index);
833
793
  a = rb_hash_lookup(h, kv);
834
794
  if(!RTEST(a)) {
835
795
  rb_hash_aset(h, kv, rb_ary_new3(1, vv));
@@ -851,13 +811,13 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
851
811
  v = spg__field_ids(rb_ary_entry(pg_value, 1), colsyms, nfields);
852
812
  if(type == SPG_YIELD_MKMV_HASH) {
853
813
  for(i=0; i<ntuples; i++) {
854
- rb_hash_aset(h, spg__col_values(self, k, colsyms, nfields, res, i, colconvert ENC_INDEX), spg__col_values(self, v, colsyms, nfields, res, i, colconvert ENC_INDEX));
814
+ rb_hash_aset(h, spg__col_values(self, k, colsyms, nfields, res, i, colconvert, enc_index), spg__col_values(self, v, colsyms, nfields, res, i, colconvert, enc_index));
855
815
  }
856
816
  } else {
857
817
  VALUE kv, vv, a;
858
818
  for(i=0; i<ntuples; i++) {
859
- kv = spg__col_values(self, k, colsyms, nfields, res, i, colconvert ENC_INDEX);
860
- vv = spg__col_values(self, v, colsyms, nfields, res, i, colconvert ENC_INDEX);
819
+ kv = spg__col_values(self, k, colsyms, nfields, res, i, colconvert, enc_index);
820
+ vv = spg__col_values(self, v, colsyms, nfields, res, i, colconvert, enc_index);
861
821
  a = rb_hash_lookup(h, kv);
862
822
  if(!RTEST(a)) {
863
823
  rb_hash_aset(h, kv, rb_ary_new3(1, vv));
@@ -874,7 +834,7 @@ static VALUE spg_yield_hash_rows(VALUE self, VALUE rres, VALUE ignore) {
874
834
  for(i=0; i<ntuples; i++) {
875
835
  h = rb_hash_new();
876
836
  for(j=0; j<nfields; j++) {
877
- rb_hash_aset(h, colsyms[j], spg__col_value(self, res, i, j, colconvert ENC_INDEX));
837
+ rb_hash_aset(h, colsyms[j], spg__col_value(self, res, i, j, colconvert, enc_index));
878
838
  }
879
839
  /* Abuse local variable */
880
840
  pg_type = rb_obj_alloc(pg_value);
@@ -898,7 +858,8 @@ static VALUE spg_supports_streaming_p(VALUE self) {
898
858
  #if HAVE_PQSETSINGLEROWMODE
899
859
  static VALUE spg_set_single_row_mode(VALUE self) {
900
860
  PGconn *conn;
901
- GetPGconn(self, conn);
861
+ Check_Type(self, T_DATA);
862
+ conn = pg_get_pgconn(self);
902
863
  if (PQsetSingleRowMode(conn) != 1) {
903
864
  rb_raise(spg_PGError, "cannot set single row mode");
904
865
  }
@@ -922,19 +883,19 @@ static VALUE spg__yield_each_row(VALUE self) {
922
883
 
923
884
  rconn = rb_ary_entry(self, 1);
924
885
  self = rb_ary_entry(self, 0);
925
- GetPGconn(rconn, conn);
886
+ Check_Type(rconn, T_DATA);
887
+ conn = pg_get_pgconn(rconn);
926
888
 
927
889
  rres = rb_funcall(rconn, spg_id_get_result, 0);
928
890
  if (rres == Qnil) {
929
891
  goto end_yield_each_row;
930
892
  }
931
893
  rb_funcall(rres, spg_id_check, 0);
932
- GetPGresult(rres, res);
894
+ Check_Type(rres, T_DATA);
895
+ res = pgresult_get(rres);
933
896
 
934
- #ifdef SPG_ENCODING
935
897
  int enc_index;
936
898
  enc_index = enc_get_index(rres);
937
- #endif
938
899
 
939
900
  /* Only handle regular and model types. All other types require compiling all
940
901
  * of the results at once, which is not a use case for streaming. The streaming
@@ -959,7 +920,7 @@ static VALUE spg__yield_each_row(VALUE self) {
959
920
  while (PQntuples(res) != 0) {
960
921
  h = rb_hash_new();
961
922
  for(j=0; j<nfields; j++) {
962
- rb_hash_aset(h, colsyms[j], spg__col_value(self, res, 0, j, colconvert ENC_INDEX));
923
+ rb_hash_aset(h, colsyms[j], spg__col_value(self, res, 0, j, colconvert , enc_index));
963
924
  }
964
925
 
965
926
  rb_funcall(rres, spg_id_clear, 0);
@@ -978,7 +939,8 @@ static VALUE spg__yield_each_row(VALUE self) {
978
939
  goto end_yield_each_row;
979
940
  }
980
941
  rb_funcall(rres, spg_id_check, 0);
981
- GetPGresult(rres, res);
942
+ Check_Type(rres, T_DATA);
943
+ res = pgresult_get(rres);
982
944
  }
983
945
  rb_funcall(rres, spg_id_clear, 0);
984
946
 
@@ -990,7 +952,8 @@ static VALUE spg__flush_results(VALUE rconn) {
990
952
  PGconn *conn;
991
953
  PGresult *res;
992
954
  VALUE error = 0;
993
- GetPGconn(rconn, conn);
955
+ Check_Type(rconn, T_DATA);
956
+ conn = pg_get_pgconn(rconn);
994
957
 
995
958
  while ((res = PQgetResult(conn)) != NULL) {
996
959
  if (!error) {
@@ -1085,11 +1048,12 @@ void Init_sequel_pg(void) {
1085
1048
  spg_SQLTime= rb_funcall(spg_Sequel, cg, 1, rb_str_new2("SQLTime"));
1086
1049
  spg_BigDecimal = rb_funcall(rb_cObject, cg, 1, rb_str_new2("BigDecimal"));
1087
1050
  spg_Date = rb_funcall(rb_cObject, cg, 1, rb_str_new2("Date"));
1088
- spg_PGError = rb_eval_string("defined?(PG::Error) ? PG::Error : PGError");
1051
+ spg_PGError = rb_funcall(rb_funcall(rb_cObject, cg, 1, rb_str_new2("PG")), cg, 1, rb_str_new2("Error"));
1089
1052
 
1090
1053
  spg_nan = rb_eval_string("0.0/0.0");
1091
1054
  spg_pos_inf = rb_eval_string("1.0/0.0");
1092
1055
  spg_neg_inf = rb_eval_string("-1.0/0.0");
1056
+ spg_usec_per_day = ULL2NUM(86400000000ULL);
1093
1057
 
1094
1058
  rb_global_variable(&spg_Sequel);
1095
1059
  rb_global_variable(&spg_Blob);
@@ -1100,14 +1064,7 @@ void Init_sequel_pg(void) {
1100
1064
  rb_global_variable(&spg_nan);
1101
1065
  rb_global_variable(&spg_pos_inf);
1102
1066
  rb_global_variable(&spg_neg_inf);
1103
-
1104
- /* Check for 1.8-1.9.2 stdlib date that needs Rational for usec accuracy */
1105
- if (rb_attr_get(rb_eval_string("Date.today"), rb_intern("@ajd")) != Qnil) {
1106
- spg_id_Rational = rb_intern("Rational");
1107
- }
1108
- if (rb_eval_string("defined?(PG::TypeMapAllStrings)") != Qnil) {
1109
- unwrap_structs = 1;
1110
- }
1067
+ rb_global_variable(&spg_usec_per_day);
1111
1068
 
1112
1069
  c = rb_funcall(spg_Postgres, cg, 1, rb_str_new2("Dataset"));
1113
1070
  rb_undef_method(c, "yield_hash_rows");
@@ -1115,10 +1072,6 @@ void Init_sequel_pg(void) {
1115
1072
  rb_undef_method(c, "fetch_rows_set_cols");
1116
1073
  rb_define_private_method(c, "fetch_rows_set_cols", spg_fetch_rows_set_cols, 1);
1117
1074
 
1118
- if (rb_eval_string("Sequel::Dataset.private_method_defined?(:columns=)") == Qtrue) {
1119
- use_columns_method = 1;
1120
- }
1121
-
1122
1075
  rb_define_singleton_method(spg_Postgres, "supports_streaming?", spg_supports_streaming_p, 0);
1123
1076
 
1124
1077
  #if HAVE_PQSETSINGLEROWMODE
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.7.1
4
+ version: 1.8.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: 2017-08-25 00:00:00.000000000 Z
11
+ date: 2017-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.8.0
19
+ version: 0.18.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.8.0
26
+ version: 0.18.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: sequel
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 4.0.0
33
+ version: 4.34.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 4.0.0
40
+ version: 4.34.0
41
41
  description: |
42
42
  sequel_pg overwrites the inner loop of the Sequel postgres
43
43
  adapter row fetching code with a C version. The C version
@@ -83,7 +83,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
83
83
  requirements:
84
84
  - - ">="
85
85
  - !ruby/object:Gem::Version
86
- version: 1.8.7
86
+ version: 1.9.3
87
87
  required_rubygems_version: !ruby/object:Gem::Requirement
88
88
  requirements:
89
89
  - - ">="
@@ -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: 2.6.11
94
+ rubygems_version: 2.6.13
95
95
  signing_key:
96
96
  specification_version: 4
97
97
  summary: Faster SELECTs when using Sequel with pg