activerecord-rdb-adapter 0.9.0 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 83412bda25cc2862942415bea85d79d44edd3d814e70b38273f1450e8dbd5ef0
4
- data.tar.gz: 1871da9ce62af55890baf5b2b35ac5b86ae889d1a66b145079bbc90c23c0ffcf
3
+ metadata.gz: f9d0576dbcd5a9724c79ac6ff18739649b3c4b3c38b7b5e3ac9018804a0389b6
4
+ data.tar.gz: 1bfd97cbeb22b5d9beba889f5d3a05cf620563e6e27b2426e01b99b35afb55be
5
5
  SHA512:
6
- metadata.gz: 229f06e7089fc3933eff918d9c694ea3ce90013d99c79c9ef659764adfced8478f20afe1642871e72ba4fa6599ce97b93abe609df5ef0c8123350ed948acb730
7
- data.tar.gz: 98cefd761bd85fef85e28177d8049a6fd7f9318cc223368ca6b1b5b438a33526bd46707d15a41337c8ceb85bf18d44768f52b1a866be57224c1cd45c2ac9b703
6
+ metadata.gz: '09e1856d986538037bf3e67c6e5b330a06a6454df046cf4579a05634e9c96a2b74401aeebf45f7ad721a78a684ca886db69289f97728871bd9598bc109f362bd'
7
+ data.tar.gz: 63f991b80b280a186f3bb01f911cc293970e8bc82a1b07b386164f9e5b6e0fe505c5cd711ac7c72ce5d8d18044e60d40beba4ed7c481636e144b9a8fd3889e0d
data/fb.c CHANGED
@@ -152,9 +152,9 @@ static long calculate_buffsize(XSQLDA *sqlda)
152
152
  alignment = sizeof(short);
153
153
  }
154
154
 
155
- offset = FB_ALIGN((size_t)offset, alignment);
155
+ offset = FB_ALIGN(offset, alignment);
156
156
  offset += length;
157
- offset = FB_ALIGN((size_t)offset, sizeof(short));
157
+ offset = FB_ALIGN(offset, sizeof(short));
158
158
  offset += sizeof(short);
159
159
  }
160
160
 
@@ -166,11 +166,11 @@ static VALUE fb_error_msg(const ISC_STATUS *isc_status)
166
166
  {
167
167
  char msg[1024];
168
168
  VALUE result = rb_str_new(NULL, 0);
169
- const size_t suffixLen = strlen("\n");
169
+
170
170
  while (fb_interpret(msg, 1024, &isc_status))
171
171
  {
172
172
  result = rb_str_cat(result, msg, strlen(msg));
173
- result = rb_str_cat(result, "\n", suffixLen);
173
+ result = rb_str_cat(result, "\n", strlen("\n"));
174
174
  }
175
175
  return result;
176
176
  }
@@ -234,7 +234,7 @@ static VALUE fb_mkdate(struct tm *tm)
234
234
  {
235
235
  return rb_funcall(
236
236
  rb_cDate, rb_intern("civil"), 3,
237
- INT2FIX(1900 + tm->tm_year), INT2FIX(tm->tm_mon + 1), INT2FIX(tm->tm_mday));
237
+ INT2FIX(1900 + tm->tm_year), INT2FIX(tm->tm_mon + 1), INT2FIX(tm->tm_mday));
238
238
  }
239
239
 
240
240
  static int responds_like_date(VALUE obj)
@@ -466,7 +466,7 @@ static XSQLDA* sqlda_alloc(long cols)
466
466
  {
467
467
  XSQLDA *sqlda;
468
468
 
469
- sqlda = (XSQLDA*)xmalloc(XSQLDA_LENGTH((size_t)cols));
469
+ sqlda = (XSQLDA*)xmalloc(XSQLDA_LENGTH(cols));
470
470
  #ifdef SQLDA_CURRENT_VERSION
471
471
  sqlda->version = SQLDA_CURRENT_VERSION;
472
472
  #else
@@ -686,6 +686,8 @@ static char* trans_parseopts(VALUE opt, long *tpb_len)
686
686
  s++;
687
687
  }
688
688
 
689
+ used = 0;
690
+ size = 0;
689
691
  tpb = NULL;
690
692
  memset((void *)check_f, 0, sizeof(check_f));
691
693
 
@@ -739,11 +741,7 @@ static char* trans_parseopts(VALUE opt, long *tpb_len)
739
741
  check_f[target_p->position] = 1;
740
742
  } else {
741
743
  if (used + 1 > size) {
742
- char *tmp_tpb = (char *)realloc(tpb, (size_t)(size + TPBBUFF_ALLOC));
743
- if (tmp_tpb == NULL) {
744
- } else {
745
- tpb = tmp_tpb;
746
- }
744
+ tpb = (char *)realloc(tpb, size + TPBBUFF_ALLOC);
747
745
  size += TPBBUFF_ALLOC;
748
746
  }
749
747
  tpb[used] = target_p->optval;
@@ -779,7 +777,7 @@ static char* trans_parseopts(VALUE opt, long *tpb_len)
779
777
  if (*resv_p == '\0' || (ofs = strspn(resv_p, LIST_DELIMIT)) < 0) {
780
778
  resv_p++;
781
779
  } else {
782
- resv_p = &resv_p[(size_t)ofs];
780
+ resv_p = &resv_p[ofs];
783
781
  tblend_p = strpbrk(resv_p, LIST_DELIMIT);
784
782
  if (tblend_p) {
785
783
  tbl_len = tblend_p - resv_p;
@@ -793,7 +791,7 @@ static char* trans_parseopts(VALUE opt, long *tpb_len)
793
791
 
794
792
  if (tbl_len > 0) {
795
793
  if (used + tbl_len + 3 > size) {
796
- tpb = (char*)xrealloc(tpb, (size_t)(size+TPBBUFF_ALLOC));
794
+ tpb = (char*)xrealloc(tpb, size+TPBBUFF_ALLOC);
797
795
  size += TPBBUFF_ALLOC;
798
796
  }
799
797
  tpb[used+1] = (char)tbl_len;
@@ -1283,15 +1281,15 @@ static void fb_cursor_free(struct FbCursor *fb_cursor)
1283
1281
 
1284
1282
  static VALUE sql_decimal_to_bigdecimal(long long sql_data, int scale)
1285
1283
  {
1286
- int i;
1284
+ unsigned long i;
1287
1285
  char bigdecimal_buffer[23];
1288
- int bigdecimal_dot;
1286
+ unsigned long bigdecimal_dot;
1289
1287
  sprintf(bigdecimal_buffer, "%022lld", sql_data);
1290
- bigdecimal_dot = strlen(bigdecimal_buffer) + (size_t)scale;
1288
+ bigdecimal_dot = strlen(bigdecimal_buffer) + scale;
1291
1289
  for (i = strlen(bigdecimal_buffer); i > bigdecimal_dot; i--)
1292
1290
  bigdecimal_buffer[i] = bigdecimal_buffer[i-1];
1293
1291
  bigdecimal_buffer[bigdecimal_dot] = '.';
1294
- return rb_funcall(rb_path2class("BigDecimal"), rb_intern("new"), 1, rb_str_new2(bigdecimal_buffer));
1292
+ return rb_funcall(rb_cObject, rb_intern("BigDecimal"), 1, rb_str_new2(bigdecimal_buffer));
1295
1293
  }
1296
1294
 
1297
1295
  static VALUE object_to_unscaled_bigdecimal(VALUE object, int scale)
@@ -1302,7 +1300,7 @@ static VALUE object_to_unscaled_bigdecimal(VALUE object, int scale)
1302
1300
  ratio *= 10;
1303
1301
  if (TYPE(object) == T_FLOAT)
1304
1302
  object = rb_funcall(object, rb_intern("to_s"), 0);
1305
- object = rb_funcall(rb_path2class("BigDecimal"), rb_intern("new"), 1, object);
1303
+ object = rb_funcall(rb_cObject, rb_intern("BigDecimal"), 1, object);
1306
1304
  object = rb_funcall(object, rb_intern("*"), 1, LONG2NUM(ratio));
1307
1305
  return rb_funcall(object, rb_intern("round"), 0);
1308
1306
  }
@@ -1354,36 +1352,36 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
1354
1352
  switch (dtp) {
1355
1353
  case SQL_TEXT :
1356
1354
  alignment = 1;
1357
- offset = FB_ALIGN((size_t)offset, alignment);
1358
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1355
+ offset = FB_ALIGN(offset, alignment);
1356
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1359
1357
  obj = rb_obj_as_string(obj);
1360
1358
  if (RSTRING_LEN(obj) > var->sqllen) {
1361
1359
  rb_raise(rb_eRangeError, "CHAR overflow: %ld bytes exceeds %d byte(s) allowed.",
1362
1360
  RSTRING_LEN(obj), var->sqllen);
1363
1361
  }
1364
- memcpy(var->sqldata, RSTRING_PTR(obj), (size_t)RSTRING_LEN(obj));
1362
+ memcpy(var->sqldata, RSTRING_PTR(obj), RSTRING_LEN(obj));
1365
1363
  var->sqllen = RSTRING_LEN(obj);
1366
1364
  offset += var->sqllen + 1;
1367
1365
  break;
1368
1366
 
1369
1367
  case SQL_VARYING :
1370
1368
  alignment = sizeof(short);
1371
- offset = FB_ALIGN((size_t)offset, alignment);
1372
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1369
+ offset = FB_ALIGN(offset, alignment);
1370
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1373
1371
  vary = (VARY *)var->sqldata;
1374
1372
  obj = rb_obj_as_string(obj);
1375
1373
  if (RSTRING_LEN(obj) > var->sqllen) {
1376
1374
  rb_raise(rb_eRangeError, "VARCHAR overflow: %ld bytes exceeds %d byte(s) allowed.",
1377
1375
  RSTRING_LEN(obj), var->sqllen);
1378
1376
  }
1379
- memcpy(vary->vary_string, RSTRING_PTR(obj), (size_t)RSTRING_LEN(obj));
1377
+ memcpy(vary->vary_string, RSTRING_PTR(obj), RSTRING_LEN(obj));
1380
1378
  vary->vary_length = RSTRING_LEN(obj);
1381
1379
  offset += vary->vary_length + sizeof(short);
1382
1380
  break;
1383
1381
 
1384
1382
  case SQL_SHORT :
1385
- offset = FB_ALIGN((size_t)offset, alignment);
1386
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1383
+ offset = FB_ALIGN(offset, alignment);
1384
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1387
1385
  if (var->sqlscale < 0) {
1388
1386
  lvalue = NUM2LONG(object_to_unscaled_bigdecimal(obj, var->sqlscale));
1389
1387
  } else {
@@ -1397,8 +1395,8 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
1397
1395
  break;
1398
1396
 
1399
1397
  case SQL_LONG :
1400
- offset = FB_ALIGN((size_t)offset, alignment);
1401
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1398
+ offset = FB_ALIGN(offset, alignment);
1399
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1402
1400
  if (var->sqlscale < 0) {
1403
1401
  lvalue = NUM2LONG(object_to_unscaled_bigdecimal(obj, var->sqlscale));
1404
1402
  } else {
@@ -1412,8 +1410,8 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
1412
1410
  break;
1413
1411
 
1414
1412
  case SQL_FLOAT :
1415
- offset = FB_ALIGN((size_t)offset, alignment);
1416
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1413
+ offset = FB_ALIGN(offset, alignment);
1414
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1417
1415
  obj = double_from_obj(obj);
1418
1416
  dvalue = NUM2DBL(obj);
1419
1417
  if (dvalue >= 0.0) {
@@ -1429,8 +1427,8 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
1429
1427
  break;
1430
1428
 
1431
1429
  case SQL_DOUBLE :
1432
- offset = FB_ALIGN((size_t)offset, alignment);
1433
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1430
+ offset = FB_ALIGN(offset, alignment);
1431
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1434
1432
  obj = double_from_obj(obj);
1435
1433
  dvalue = NUM2DBL(obj);
1436
1434
  *(double *)var->sqldata = dvalue;
@@ -1438,8 +1436,8 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
1438
1436
  break;
1439
1437
 
1440
1438
  case SQL_INT64 :
1441
- offset = FB_ALIGN((size_t)offset, alignment);
1442
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1439
+ offset = FB_ALIGN(offset, alignment);
1440
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1443
1441
 
1444
1442
  if (var->sqlscale < 0) {
1445
1443
  llvalue = NUM2LL(object_to_unscaled_bigdecimal(obj, var->sqlscale));
@@ -1452,8 +1450,8 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
1452
1450
  break;
1453
1451
 
1454
1452
  case SQL_BLOB :
1455
- offset = FB_ALIGN((size_t)offset, alignment);
1456
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1453
+ offset = FB_ALIGN(offset, alignment);
1454
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1457
1455
  obj = rb_obj_as_string(obj);
1458
1456
 
1459
1457
  blob_handle = 0;
@@ -1481,24 +1479,24 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
1481
1479
  break;
1482
1480
 
1483
1481
  case SQL_TIMESTAMP :
1484
- offset = FB_ALIGN((size_t)offset, alignment);
1485
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1482
+ offset = FB_ALIGN(offset, alignment);
1483
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1486
1484
  tm_from_timestamp(&tms, obj);
1487
1485
  isc_encode_timestamp(&tms, (ISC_TIMESTAMP *)var->sqldata);
1488
1486
  offset += alignment;
1489
1487
  break;
1490
1488
 
1491
1489
  case SQL_TYPE_TIME :
1492
- offset = FB_ALIGN((size_t)offset, alignment);
1493
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1490
+ offset = FB_ALIGN(offset, alignment);
1491
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1494
1492
  tm_from_timestamp(&tms, obj);
1495
1493
  isc_encode_sql_time(&tms, (ISC_TIME *)var->sqldata);
1496
1494
  offset += alignment;
1497
1495
  break;
1498
1496
 
1499
1497
  case SQL_TYPE_DATE :
1500
- offset = FB_ALIGN((size_t)offset, alignment);
1501
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1498
+ offset = FB_ALIGN(offset, alignment);
1499
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1502
1500
  tm_from_date(&tms, obj);
1503
1501
  isc_encode_sql_date(&tms, (ISC_DATE *)var->sqldata);
1504
1502
  offset += alignment;
@@ -1519,29 +1517,27 @@ static void fb_cursor_set_inputparams(struct FbCursor *fb_cursor, long argc, VAL
1519
1517
  #endif
1520
1518
 
1521
1519
  #if (FB_API_VER >= 30)
1522
- case SQL_BOOLEAN:
1523
- case blr_bool:
1524
- case blr_boolean:
1525
- offset = FB_ALIGN((size_t)offset, alignment);
1526
- var->sqldata = (char *)(fb_cursor->i_buffer + (size_t)offset);
1520
+ case SQL_BOOLEAN:
1521
+ offset = FB_ALIGN(offset, alignment);
1522
+ var->sqldata = (char *)(fb_cursor->i_buffer + offset);
1527
1523
  *(bool *)var->sqldata = obj;
1528
- offset += alignment;
1529
- break;
1524
+ offset += alignment;
1525
+ break;
1530
1526
  #endif
1531
1527
  default :
1532
1528
  rb_raise(rb_eFbError, "Specified table includes unsupported datatype (%d)", dtp);
1533
1529
  }
1534
1530
 
1535
1531
  if (var->sqltype & 1) {
1536
- offset = FB_ALIGN((size_t)offset, sizeof(short));
1537
- var->sqlind = (short *)(fb_cursor->i_buffer + (size_t)offset);
1532
+ offset = FB_ALIGN(offset, sizeof(short));
1533
+ var->sqlind = (short *)(fb_cursor->i_buffer + offset);
1538
1534
  *var->sqlind = 0;
1539
1535
  offset += sizeof(short);
1540
1536
  }
1541
1537
  } else if (var->sqltype & 1) {
1542
1538
  var->sqldata = 0;
1543
- offset = FB_ALIGN((size_t)offset, sizeof(short));
1544
- var->sqlind = (short *)(fb_cursor->i_buffer + (size_t)offset);
1539
+ offset = FB_ALIGN(offset, sizeof(short));
1540
+ var->sqlind = (short *)(fb_cursor->i_buffer + offset);
1545
1541
  *var->sqlind = -1;
1546
1542
  offset += sizeof(short);
1547
1543
  } else {
@@ -1620,10 +1616,7 @@ static VALUE precision_from_sqlvar(XSQLVAR *sqlvar)
1620
1616
  case SQL_BLOB: return Qnil;
1621
1617
  case SQL_ARRAY: return Qnil;
1622
1618
  #if (FB_API_VER >= 30)
1623
- case SQL_BOOLEAN:
1624
- case blr_bool:
1625
- case blr_boolean:
1626
- return Qnil;
1619
+ case SQL_BOOLEAN: return Qnil;
1627
1620
  #endif
1628
1621
  case SQL_QUAD: return Qnil;
1629
1622
  case SQL_TYPE_TIME: return Qnil;
@@ -1746,11 +1739,11 @@ static void fb_cursor_fetch_prep(struct FbCursor *fb_cursor)
1746
1739
  length += sizeof(short);
1747
1740
  alignment = sizeof(short);
1748
1741
  }
1749
- offset = FB_ALIGN((size_t)offset, alignment);
1750
- var->sqldata = (char*)(fb_cursor->o_buffer + (size_t)offset);
1742
+ offset = FB_ALIGN(offset, alignment);
1743
+ var->sqldata = (char*)(fb_cursor->o_buffer + offset);
1751
1744
  offset += length;
1752
- offset = FB_ALIGN((size_t)offset, sizeof(short));
1753
- var->sqlind = (short*)(fb_cursor->o_buffer + (size_t)offset);
1745
+ offset = FB_ALIGN(offset, sizeof(short));
1746
+ var->sqlind = (short*)(fb_cursor->o_buffer + offset);
1754
1747
  offset += sizeof(short);
1755
1748
  }
1756
1749
  }
@@ -1922,11 +1915,9 @@ static VALUE fb_cursor_fetch(struct FbCursor *fb_cursor)
1922
1915
  break;
1923
1916
 
1924
1917
  #if (FB_API_VER >= 30)
1925
- case SQL_BOOLEAN:
1926
- case blr_bool:
1927
- case blr_boolean:
1928
- val = ((*(bool*)var->sqldata) == true) ? Qtrue : Qfalse;
1929
- break;
1918
+ case SQL_BOOLEAN:
1919
+ val = (*(bool*)var->sqldata) ? Qtrue : Qfalse;
1920
+ break;
1930
1921
  #endif
1931
1922
 
1932
1923
  default:
@@ -2045,7 +2036,7 @@ static VALUE cursor_execute2(VALUE args)
2045
2036
  if (in_params) {
2046
2037
  length = calculate_buffsize(fb_cursor->i_sqlda);
2047
2038
  if (length > fb_cursor->i_buffer_size) {
2048
- fb_cursor->i_buffer = xrealloc(fb_cursor->i_buffer, (size_t)length);
2039
+ fb_cursor->i_buffer = xrealloc(fb_cursor->i_buffer, length);
2049
2040
  fb_cursor->i_buffer_size = length;
2050
2041
  }
2051
2042
  }
@@ -2090,7 +2081,7 @@ static VALUE cursor_execute2(VALUE args)
2090
2081
  /* Get the size of results buffer and reallocate it */
2091
2082
  length = calculate_buffsize(fb_cursor->o_sqlda);
2092
2083
  if (length > fb_cursor->o_buffer_size) {
2093
- fb_cursor->o_buffer = xrealloc(fb_cursor->o_buffer, (size_t)length);
2084
+ fb_cursor->o_buffer = xrealloc(fb_cursor->o_buffer, length);
2094
2085
  fb_cursor->o_buffer_size = length;
2095
2086
  }
2096
2087
 
@@ -2429,10 +2420,10 @@ static char* dbp_add_string(char *dbp, char isc_dbp_code, char *s, long *length)
2429
2420
  long s_len = strlen(s);
2430
2421
  *length += 2 + s_len;
2431
2422
  REALLOC_N(dbp, char, *length);
2432
- buf = dbp + (size_t)old_length;
2423
+ buf = dbp + old_length;
2433
2424
  *buf++ = isc_dbp_code;
2434
2425
  *buf++ = (char)s_len;
2435
- memcpy(buf, s, (size_t)s_len);
2426
+ memcpy(buf, s, s_len);
2436
2427
  return dbp;
2437
2428
  }
2438
2429
 
@@ -2650,7 +2641,7 @@ static VALUE connection_columns(VALUE self, VALUE table_name)
2650
2641
  if (fb_connection->downcase_names && no_lowercase(name)) {
2651
2642
  rb_funcall(name, id_downcase_bang, 0);
2652
2643
  }
2653
- if (rb_funcall(re_rdb, match_id, 1, domain) != Qnil) {
2644
+ if (rb_funcall(re_rdb, rb_intern("match"), 1, domain) != Qnil) {
2654
2645
  domain = Qnil;
2655
2646
  }
2656
2647
  if (sql_subtype == Qnil) {
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveModel
4
+ module Type
5
+ class Integer < Value # :nodoc:
6
+ include Helpers::Numeric
7
+
8
+ DEFAULT_LIMIT = 8
9
+
10
+ def initialize(*)
11
+ super
12
+ @range = min_value...max_value
13
+ end
14
+
15
+ def type
16
+ :integer
17
+ end
18
+
19
+ def deserialize(value)
20
+ return if value.nil?
21
+ value.to_i
22
+ end
23
+
24
+ def serialize(value)
25
+ result = cast(value)
26
+ if result
27
+ ensure_in_range(result)
28
+ end
29
+ result
30
+ end
31
+
32
+ # TODO Change this to private once we've dropped Ruby 2.2 support.
33
+ # Workaround for Ruby 2.2 "private attribute?" warning.
34
+ protected
35
+
36
+ attr_reader :range
37
+
38
+ private
39
+
40
+ def cast_value(value)
41
+ case value
42
+ when true then 1
43
+ when false then 0
44
+ else
45
+ value.to_i rescue nil
46
+ end
47
+ end
48
+
49
+ def ensure_in_range(value)
50
+ unless range.cover?(value)
51
+ raise ActiveModel::RangeError, "#{value} is out of range for #{self.class} with limit #{_limit} bytes"
52
+ end
53
+ end
54
+
55
+ def max_value
56
+ 1 << (_limit * 8 - 1) # 8 bits per byte with one bit for sign
57
+ end
58
+
59
+ def min_value
60
+ -max_value
61
+ end
62
+
63
+ def _limit
64
+ limit || DEFAULT_LIMIT
65
+ end
66
+ end
67
+ end
68
+ end
@@ -33,7 +33,7 @@ module ActiveRecord
33
33
  end
34
34
  end
35
35
  rescue StandardError => e
36
- raise e.message.encode('UTF-8', @connection.encoding)
36
+ raise e
37
37
  end
38
38
 
39
39
  def explain(arel, binds = [])
@@ -93,6 +93,90 @@ module ActiveRecord
93
93
  def last_inserted_id(_result)
94
94
  nil
95
95
  end
96
+
97
+ def insert_fixtures_set(fixture_set, tables_to_delete = [])
98
+ fixture_inserts = fixture_set.map do |table_name, fixtures|
99
+ next if fixtures.empty?
100
+
101
+ build_fixture_sql(fixtures, table_name).collect {|f| f }
102
+ end.compact
103
+
104
+ table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name table}".dup }
105
+ sql = fixture_inserts.flatten(1)
106
+ sql.unshift(*table_deletes)
107
+
108
+ transaction(requires_new: true) do
109
+ sql.each do |s|
110
+ execute s, 'Fixture load'
111
+ end
112
+ end
113
+ end
114
+
115
+ private
116
+
117
+ def default_insert_value(column)
118
+ if column.default.nil?
119
+ Arel.sql('NULL')
120
+ else
121
+ Arel.sql(quote(column.default))
122
+ end
123
+ end
124
+
125
+ def build_fixture_sql(fixtures, table_name)
126
+ columns = schema_cache.columns_hash(table_name)
127
+
128
+ values = fixtures.map do |fixture|
129
+ fixture = fixture.stringify_keys
130
+
131
+ unknown_columns = fixture.keys - columns.keys
132
+ if unknown_columns.any?
133
+ raise Fixture::FixtureError, %(table "#{table_name}" has no columns named #{unknown_columns.map(&:inspect).join(', ')}.)
134
+ end
135
+
136
+ columns.map do |name, column|
137
+ if fixture.key?(name)
138
+ type = lookup_cast_type_from_column(column)
139
+ bind = Relation::QueryAttribute.new(name, fixture[name], type)
140
+ with_yaml_fallback(bind.value_for_database)
141
+ else
142
+ default_insert_value(column)
143
+ end
144
+ end
145
+ end
146
+
147
+ sql ||= []
148
+
149
+ values.each_with_index do |row, i|
150
+ s = ''
151
+ s << "INSERT INTO #{quote_table_name(table_name)}"
152
+
153
+ unless columns.empty?
154
+ s << ' ('
155
+ columns.each_with_index do |x, y|
156
+ s << ', ' unless y == 0
157
+ s << quote_column_name(x[1].name)
158
+ end
159
+ s << ')'
160
+ end
161
+
162
+ s << ' VALUES ('
163
+ row.each_with_index do |value, k|
164
+ s << ', ' unless k == 0
165
+ case value
166
+ when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
167
+ s << value.to_s
168
+ when Time
169
+ s << quote(value.strftime("%F %T"))
170
+ else
171
+ s << quote(value).to_s
172
+ end
173
+ end
174
+ s << ');'
175
+ sql << s
176
+ end
177
+
178
+ sql
179
+ end
96
180
  end
97
181
  end
98
182
  end
@@ -59,6 +59,7 @@ module ActiveRecord
59
59
  end
60
60
 
61
61
  return if options[:sequence] == false || !needs_sequence
62
+
62
63
  create_sequence(options[:sequence] || default_sequence_name(name))
63
64
  trg_sql = <<-END_SQL
64
65
  CREATE TRIGGER N$#{name.upcase} FOR #{name.upcase}
@@ -135,12 +136,13 @@ module ActiveRecord
135
136
  create_sequence(options[:sequence] || default_sequence_name(table_name)) if type == :primary_key && options[:sequence] != false
136
137
 
137
138
  return unless options[:position]
139
+
138
140
  # position is 1-based but add 1 to skip id column
139
- execute(squish_sql(<<-end_sql))
141
+ execute(squish_sql(<<-END_SQL))
140
142
  ALTER TABLE #{quote_table_name(table_name)}
141
143
  ALTER COLUMN #{quote_column_name(column_name)}
142
144
  POSITION #{options[:position] + 1}
143
- end_sql
145
+ END_SQL
144
146
  end
145
147
 
146
148
  def remove_column(table_name, column_name, type = nil, options = {})
@@ -349,6 +351,7 @@ module ActiveRecord
349
351
 
350
352
  def integer_to_sql(limit)
351
353
  return 'integer' if limit.nil?
354
+
352
355
  case limit
353
356
  when 1..2 then
354
357
  'smallint'
@@ -375,10 +378,10 @@ module ActiveRecord
375
378
  end
376
379
 
377
380
  def string_to_sql(limit)
378
- if limit && limit > 0
381
+ if limit && limit > 0 && limit < 255
379
382
  "VARCHAR(#{limit})"
380
383
  else
381
- 'VARCHAR(150)'
384
+ 'VARCHAR(255)'
382
385
  end
383
386
  end
384
387
 
@@ -86,6 +86,10 @@ module ActiveRecord
86
86
  1499
87
87
  end
88
88
 
89
+ def supports_multi_insert?
90
+ false
91
+ end
92
+
89
93
  def active?
90
94
  return false unless @connection.open?
91
95
  # return true if @connection.transaction_started
@@ -145,6 +149,11 @@ module ActiveRecord
145
149
  ActiveRecord::RecordNotUnique.new(message)
146
150
  when /This operation is not defined for system tables/
147
151
  ActiveRecord::ActiveRecordError.new(message)
152
+ when /Column does not belong to referenced table/,
153
+ /Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements/,
154
+ /The cursor identified in the UPDATE or DELETE statement is not positioned on a row/,
155
+ /Overflow occurred during data type conversion/
156
+ ActiveRecord::StatementInvalid.new(message)
148
157
  else
149
158
  super
150
159
  end
@@ -4,6 +4,7 @@ module ActiveRecord
4
4
  require 'fb'
5
5
  config = rdb_connection_config(config)
6
6
  db = ::Fb::Database.new(config)
7
+ @database = db
7
8
  begin
8
9
  connection = db.connect
9
10
  rescue StandardError
@@ -1,24 +1,23 @@
1
- require 'active_record/tasks/database_tasks'
2
-
3
1
  module ActiveRecord
4
- module Tasks
2
+ module Tasks # :nodoc:
5
3
  class RdbDatabaseTasks # :nodoc:
6
- delegate :rdb_connection_config, :establish_connection, to: ::ActiveRecord::Base
4
+ delegate :rdb_connection, :rdb_connection_config, :establish_connection, to: ::ActiveRecord::Base
7
5
 
8
- def initialize(configuration, root = ::ActiveRecord::Tasks::DatabaseTasks.root)
9
- @root = root
6
+ def initialize(configuration)
10
7
  @configuration = rdb_connection_config(configuration)
11
8
  end
12
9
 
13
10
  def create
14
11
  rdb_database.create
12
+ # create_db
15
13
  establish_connection configuration
16
14
  rescue ::Fb::Error => e
17
- raise unless e.message.include?('database or file exists')
15
+ raise unless e.message.include?('File exists')
18
16
  raise DatabaseAlreadyExists
19
17
  end
20
18
 
21
19
  def drop
20
+ establish_connection configuration
22
21
  rdb_database.drop
23
22
  rescue ::Fb::Error => e
24
23
  raise ::ActiveRecord::ConnectionNotEstablished, e.message
@@ -33,11 +32,11 @@ module ActiveRecord
33
32
  create
34
33
  end
35
34
 
36
- def structure_dump(filename)
35
+ def structure_dump(filename, structure_dump_flags = nil)
37
36
  isql :extract, output: filename
38
37
  end
39
38
 
40
- def structure_load(filename)
39
+ def structure_load(filename, structure_load_flags = nil)
41
40
  isql input: filename
42
41
  end
43
42
 
@@ -69,14 +68,11 @@ module ActiveRecord
69
68
  # Finds the isql command line utility from the PATH
70
69
  # Many linux distros call this program isql-fb, instead of isql
71
70
  def isql_executable
72
- require 'mkmf'
73
- exe = %w[isql-fb isql].detect(&method(:find_executable0))
74
- exe || abort('Unable to find isql or isql-fb in your $PATH')
71
+ "/opt/RedDatabase/bin/isql"
75
72
  end
76
73
 
77
74
  attr_reader :configuration
78
75
 
79
- attr_reader :root
80
76
  end
81
77
  end
82
78
  end
@@ -3,21 +3,43 @@ module Arel
3
3
  class Rdb < Arel::Visitors::ToSql # :nodoc
4
4
  private
5
5
 
6
- def visit_Arel_Nodes_SelectStatement o, collector
7
- collector << "SELECT "
6
+ def visit_Arel_Nodes_InsertStatement(o, collector)
7
+ collector << "INSERT INTO "
8
+ collector = visit o.relation, collector
9
+
10
+ unless o.columns.empty?
11
+ collector << " ("
12
+ o.columns.each_with_index do |x, i|
13
+ collector << ", " unless i == 0
14
+ collector << quote_column_name(x.name)
15
+ end
16
+ collector << ")"
17
+ end
18
+
19
+ if o.values
20
+ maybe_visit o.values, collector
21
+ elsif o.select
22
+ maybe_visit o.select, collector
23
+ else
24
+ collector
25
+ end
26
+ end
27
+
28
+ def visit_Arel_Nodes_SelectStatement(o, collector)
29
+ collector << 'SELECT '
8
30
  collector = visit o.offset, collector if o.offset && !o.limit
9
31
 
10
- collector = o.cores.inject(collector) {|c, x|
32
+ collector = o.cores.inject(collector) do |c, x|
11
33
  visit_Arel_Nodes_SelectCore(x, c)
12
- }
34
+ end
13
35
 
14
36
  unless o.orders.empty?
15
37
  collector << ORDER_BY
16
38
  len = o.orders.length - 1
17
- o.orders.each_with_index {|x, i|
39
+ o.orders.each_with_index do |x, i|
18
40
  collector = visit(x, collector)
19
41
  collector << COMMA unless len == i
20
- }
42
+ end
21
43
  end
22
44
 
23
45
  if o.limit && o.offset
@@ -29,7 +51,7 @@ module Arel
29
51
  maybe_visit o.lock, collector
30
52
  end
31
53
 
32
- def visit_Arel_Nodes_SelectCore o, collector
54
+ def visit_Arel_Nodes_SelectCore(o, collector)
33
55
  if o.set_quantifier
34
56
  collector = visit o.set_quantifier, collector
35
57
  collector << SPACE
@@ -44,7 +66,7 @@ module Arel
44
66
  end
45
67
 
46
68
  if o.source && !o.source.empty?
47
- collector << " FROM "
69
+ collector << ' FROM '
48
70
  collector = visit o.source, collector
49
71
  end
50
72
 
@@ -69,7 +91,7 @@ module Arel
69
91
  collector = maybe_visit o.having, collector
70
92
  else
71
93
  unless o.havings.empty?
72
- collector << " HAVING "
94
+ collector << ' HAVING '
73
95
  inject_join o.havings, collector, AND
74
96
  end
75
97
  end
@@ -77,33 +99,34 @@ module Arel
77
99
  collector
78
100
  end
79
101
 
80
- def visit_Arel_Nodes_Limit o, collector
81
- collector << " ROWS "
102
+ def visit_Arel_Nodes_Limit(o, collector)
103
+ collector << ' ROWS '
82
104
  visit o.expr, collector
83
105
  end
84
106
 
85
- def visit_Arel_Nodes_Offset o, collector
86
- collector << " SKIP "
107
+ def visit_Arel_Nodes_Offset(o, collector)
108
+ collector << ' SKIP '
87
109
  visit o.expr, collector
88
110
  end
89
111
 
90
112
  def limit_with_rows o, collector
91
- o.offset.expr.value = ActiveModel::Attribute.with_cast_value("OFFSET".freeze,
113
+ o.offset.expr.value = ActiveModel::Attribute.with_cast_value('OFFSET'.freeze,
92
114
  o.offset.expr.value.value + 1,
93
115
  ActiveModel::Type.default_value)
94
116
  offset = o.offset.expr.value
95
- o.limit.expr.value = ActiveModel::Attribute.with_cast_value("LIMIT".freeze,
96
- (o.limit.expr.value.value) + (offset.value - 1),
117
+ o.limit.expr.value = ActiveModel::Attribute.with_cast_value('LIMIT'.freeze,
118
+ o.limit.expr.value.value + (offset.value - 1),
97
119
  ActiveModel::Type.default_value)
98
120
  limit = o.limit.expr.value
99
- collector << " ROWS "
100
- collector.add_bind(offset) {|i| "?"}
101
- collector << " TO "
102
- collector.add_bind(limit) {|i| "?"}
121
+ collector << ' ROWS '
122
+ collector.add_bind(offset) { |i| '?' }
123
+ collector << ' TO '
124
+ collector.add_bind(limit) { |i| '?' }
103
125
  end
104
126
 
105
127
  def quote_column_name name
106
128
  return name if Arel::Nodes::SqlLiteral === name
129
+
107
130
  @connection.quote_column_name(name)
108
131
  end
109
132
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-rdb-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Lobanov (RedSoft)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-06 00:00:00.000000000 Z
11
+ date: 2019-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.1'
19
+ version: '5.2'
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: '5.1'
26
+ version: '5.2'
27
27
  description: ActiveRecord RedDatabase 3+ and Firebird 3+ Adapter for Rails 5+
28
28
  email: andrey.lobanov@red-soft.ru
29
29
  executables: []
@@ -35,6 +35,7 @@ files:
35
35
  - extconf.rb
36
36
  - fb.c
37
37
  - fb_extensions.rb
38
+ - lib/active_model/type/integer.rb
38
39
  - lib/active_record/connection_adapters/rdb/database_limits.rb
39
40
  - lib/active_record/connection_adapters/rdb/database_statements.rb
40
41
  - lib/active_record/connection_adapters/rdb/quoting.rb
@@ -69,7 +70,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
70
  version: '0'
70
71
  requirements:
71
72
  - Firebird library fb
72
- rubygems_version: 3.0.1
73
+ rubyforge_project:
74
+ rubygems_version: 2.7.6.2
73
75
  signing_key:
74
76
  specification_version: 4
75
77
  summary: ActiveRecord RedDatabase 3+ and Firebird 3+ Adapter