activerecord-rdb-adapter 0.9.0 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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