dmRuby 1.0.4 → 1.0.6

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: 6f8275b526bc427412425d3772f468905157dafdb29b61bde45caafc23224579
4
- data.tar.gz: 0bb96975bee1b29230b2f59c6f8f77614b0935bb37fa73fdb2906fea25618a19
3
+ metadata.gz: 16c17975a7c35617e5a27459e3f4bff7070a7bfac2d788019c2e9d999ec15ed2
4
+ data.tar.gz: 13be646ef94149926f1adc7bc539a013603dcadf9aaeafe53b1da87a64b732c0
5
5
  SHA512:
6
- metadata.gz: 8615170e2fedb07bd810734a3235c7a3d23f3b037130ee290699d481b1a37103a8bbb8c6025850a15c119cb1d50cb672462b445301d7591d233e77354fdc118f
7
- data.tar.gz: f3aaa9c5e134493f38c959fb298081e4c155fb6437ef555b734806c430d6e1e74a6669709dc659536a522819f9902b94e138d56aaafd5e2d8c83324a28a9b12f
6
+ metadata.gz: 8600e17b7285807a567cfacc749b9645428626eec4f3301442a1d2c2a94728e93b01ed4572039e68351252b26bda50c3d512c67f40b30ee849e1a821a125cc21
7
+ data.tar.gz: 70fb7211153bc57809bc82b86aa80bd0e578b208b3f7b0a1ba11590e53b69c9c835d14cde417d18b68bfb2433d670b1f07c8d9437015fe11b65962c19811d0b3
data/ChangeLogs.md CHANGED
@@ -8,13 +8,37 @@
8
8
 
9
9
  ## Change Logs
10
10
 
11
+ - dmRuby v1.0.6
12
+
13
+ 1、修改读取中文数据缺失的问题;
14
+
15
+ 2、修改插入带时区的时间数据没有转换时区的问题;
16
+
17
+ 3、修改插入空数据的问题;
18
+
19
+ 4、修改读取空串的问题;
20
+
21
+ - dmRuby v1.0.5
22
+
23
+ 1、修改读取bit类型结果错误的问题;
24
+
25
+ 2、修改Dm::Client.affected_rows()返回结果错误的问题;
26
+
27
+ 3、修改对number类型,查询sum()求和返回结果丢失精度的问题;
28
+
29
+ 4、修改不手动调用stmt.close,内存持续增长的问题;
30
+
31
+ 5、修改blob插入二进制数据,数据库查询为空的问题;
32
+
33
+ 6、修改插入较长的整数会溢出的问题。
34
+
11
35
  - dmRuby v1.0.4
12
36
 
13
- 1、新增连接参数schema
37
+ 1、新增连接参数schema
14
38
 
15
39
  - dmRuby v1.0.3
16
40
 
17
- 1、修改stmt执行的语句不能输出array类型的result
41
+ 1、修改stmt执行的语句不能输出array类型的result
18
42
 
19
43
  - dmRuby v1.0.2
20
44
 
data/dmRuby-1.0.6.gem ADDED
Binary file
data/ext/client.c CHANGED
@@ -422,7 +422,12 @@ static VALUE rb_dm_query(VALUE self, VALUE sql, VALUE options) {
422
422
  static VALUE rb_dm_client_last_id(VALUE self) {
423
423
  GET_CLIENT(self);
424
424
  REQUIRE_CONNECTED(wrapper);
425
- return rb_str_new2(wrapper->lastrowid);
425
+ rb_encoding *conn_enc;
426
+ VALUE obj = rb_str_new2(wrapper->lastrowid);
427
+
428
+ conn_enc = rb_to_encoding(wrapper->encoding);
429
+ rb_enc_associate(obj, conn_enc);
430
+ return obj;
426
431
  }
427
432
 
428
433
 
data/ext/result.c CHANGED
@@ -111,18 +111,18 @@ static void *nogvl_get_col_desc(void *ptr) {
111
111
  (dpointer)&(wrapper->col_desc[iParam].length), 0, NULL);
112
112
  if(!DSQL_SUCCEEDED(rt))
113
113
  return (void*)Qfalse;
114
- wrapper->result[iParam] = (char*)xmalloc(wrapper->col_desc[iParam].length+2);
114
+ wrapper->result[iParam] = (char*)xmalloc(wrapper->col_desc[iParam].length * 2 + 1);
115
115
  if(wrapper->col_desc[iParam].sql_type == DSQL_BINARY || wrapper->col_desc[iParam].sql_type == DSQL_VARBINARY)
116
116
  {
117
117
  rt = dpi_bind_col(wrapper->statement, (udint2)iParam + 1, DSQL_C_BINARY,
118
118
  (dpointer)wrapper->result[iParam],
119
- wrapper->col_desc[iParam].length + 1, &wrapper->length[iParam]);
119
+ wrapper->col_desc[iParam].length * 2 + 1, &wrapper->length[iParam]);
120
120
  }
121
121
  else
122
122
  {
123
123
  rt = dpi_bind_col(wrapper->statement, (udint2)iParam + 1, DSQL_C_NCHAR,
124
124
  (dpointer)wrapper->result[iParam],
125
- wrapper->col_desc[iParam].length + 1, &wrapper->length[iParam]);
125
+ wrapper->col_desc[iParam].length * 2 + 1, &wrapper->length[iParam]);
126
126
  }
127
127
  }
128
128
  }
@@ -150,7 +150,7 @@ static void rb_dm_result_free_result(dm_result_wrapper * wrapper) {
150
150
 
151
151
  for(i = 0; i < wrapper->numberOfFields; i++)
152
152
  {
153
- if(wrapper->col_desc[i].sql_type == DSQL_BLOB || wrapper->col_desc[i].sql_type == DSQL_CLOB)
153
+ if((wrapper->col_desc[i].sql_type == DSQL_BLOB || wrapper->col_desc[i].sql_type == DSQL_CLOB) && wrapper->client != Qnil && wrapper->client_wrapper->closed != 1)
154
154
  dpi_free_lob_locator(wrapper->lobs[i]);
155
155
  if(wrapper->result[i])
156
156
  {
@@ -172,7 +172,7 @@ static void rb_dm_result_free_result(dm_result_wrapper * wrapper) {
172
172
  /* this is called during GC */
173
173
  static void rb_dm_result_free(void *ptr) {
174
174
  dm_result_wrapper *wrapper = ptr;
175
- if (wrapper->statement != NULL && wrapper->is_prepare == 0) {
175
+ if (wrapper->statement != NULL && wrapper->is_prepare == 0 && wrapper->client != Qnil && wrapper->client_wrapper->closed != 1) {
176
176
  dpi_free_stmt(wrapper->statement);
177
177
  wrapper->statement = NULL;
178
178
  }
@@ -550,7 +550,7 @@ static VALUE rb_dm_result_fetch_row(VALUE self,const result_each_args *args)
550
550
 
551
551
  for (i = 0; i < wrapper->numberOfFields; i++) {
552
552
  VALUE field = rb_dm_result_fetch_field(self, i, args->symbolizeKeys);
553
- if (row[i] && fieldLengths[i]>0) {
553
+ if (row[i] && fieldLengths[i]>=0) {
554
554
  VALUE val = Qnil;
555
555
  sdint2 type = wrapper->col_desc[i].sql_type;
556
556
 
@@ -563,7 +563,7 @@ static VALUE rb_dm_result_fetch_row(VALUE self,const result_each_args *args)
563
563
  if (args->castBool && fieldLengths[i] == 1) {
564
564
  val = *row[i] == '1' ? Qtrue : Qfalse;
565
565
  }else{
566
- val = rb_str_new(row[i], fieldLengths[i]);
566
+ val = rb_cstr2inum(row[i], 10);
567
567
  }
568
568
  break;
569
569
  case DSQL_TINYINT: /* TINYINT field */
@@ -577,9 +577,7 @@ static VALUE rb_dm_result_fetch_row(VALUE self,const result_each_args *args)
577
577
  val = rb_cstr2inum(row[i], 10);
578
578
  break;
579
579
  case DSQL_DEC: /* DECIMAL or NUMERIC field */
580
- if (wrapper->col_desc[i].scale == 0) {
581
- val = rb_cstr2inum(row[i], 10);
582
- } else if (strtod(row[i], NULL) == 0.000000){
580
+ if (strtod(row[i], NULL) == 0.000000){
583
581
  val = rb_funcall(rb_mKernel, intern_BigDecimal, 1, opt_decimal_zero);
584
582
  }else{
585
583
  val = rb_funcall(rb_mKernel, intern_BigDecimal, 1, rb_str_new(row[i], fieldLengths[i]));
@@ -882,7 +880,6 @@ static VALUE rb_dm_result_each(int argc, VALUE * argv, VALUE self) {
882
880
  }
883
881
  else
884
882
  {
885
-
886
883
  symbolizeKeys = 0;
887
884
  asArray = 0;
888
885
  castBool = 0;
data/ext/statement.c CHANGED
@@ -29,8 +29,12 @@ static void rb_dm_stmt_free(void *ptr) {
29
29
  }
30
30
 
31
31
  static size_t rb_dm_stmt_memsize(const void * ptr) {
32
- const dm_stmt_wrapper *stmt_wrapper = ptr;
33
- return sizeof(*stmt_wrapper);
32
+ const dm_stmt_wrapper * w = ptr;
33
+ size_t memsize = sizeof(*w);
34
+ if (w->client_wrapper) {
35
+ memsize += sizeof(*w->client_wrapper);
36
+ }
37
+ return memsize;
34
38
  }
35
39
 
36
40
  #ifdef HAVE_RB_GC_MARK_MOVABLE
@@ -74,12 +78,25 @@ static void *nogvl_stmt_close(void *ptr) {
74
78
  void decr_dm_stmt(dm_stmt_wrapper *stmt_wrapper) {
75
79
  stmt_wrapper->refcount--;
76
80
 
77
- if (stmt_wrapper->refcount == 0) {
78
- if(stmt_wrapper->paramdesc != NULL)
81
+ if (stmt_wrapper->refcount == 0)
82
+ {
83
+ if (stmt_wrapper->paramdesc != NULL)
79
84
  {
80
85
  xfree(stmt_wrapper->paramdesc);
81
86
  stmt_wrapper->paramdesc = NULL;
82
87
  }
88
+
89
+ if (stmt_wrapper->stmt && stmt_wrapper->client != Qnil)
90
+ {
91
+ if (stmt_wrapper->client_wrapper->closed != 1) {
92
+ dpi_free_stmt(stmt_wrapper->stmt);
93
+ }
94
+ stmt_wrapper->stmt = NULL;
95
+ }
96
+
97
+ if (stmt_wrapper->client != Qnil)
98
+ decr_dm_client(stmt_wrapper->client_wrapper);
99
+
83
100
  xfree(stmt_wrapper);
84
101
  }
85
102
  }
@@ -201,6 +218,8 @@ VALUE rb_dm_stmt_new(VALUE rb_client, VALUE sql) {
201
218
  #endif
202
219
  {
203
220
  stmt_wrapper->client = rb_client;
221
+ stmt_wrapper->client_wrapper = DATA_PTR(rb_client);
222
+ stmt_wrapper->client_wrapper->refcount++;
204
223
  stmt_wrapper->refcount = 1;
205
224
  stmt_wrapper->closed = 0;
206
225
  stmt_wrapper->stmt = NULL;
@@ -292,11 +311,13 @@ static void *nogvl_stmt_execute(void *ptr) {
292
311
  rt = dpi_rowid_to_char(wrapper->client,lastrowid,sizeof(lastrowid),stmt_wrapper->lastrowid,sizeof(stmt_wrapper->lastrowid),&len);
293
312
  if (!DSQL_SUCCEEDED(rt)) {
294
313
  return (void*)Qfalse;
295
- }
314
+ }
315
+ strncpy(wrapper->lastrowid, stmt_wrapper->lastrowid, 20);
296
316
  }
297
317
  else
298
318
  {
299
319
  strncpy(stmt_wrapper->lastrowid, "", 20);
320
+ strncpy(wrapper->lastrowid, "", 20);
300
321
  }
301
322
 
302
323
  // affected_rows
@@ -308,7 +329,13 @@ static void *nogvl_stmt_execute(void *ptr) {
308
329
  rt = dpi_row_count(stmt_wrapper->stmt,&stmt_wrapper->affected_rows);
309
330
  if (!DSQL_SUCCEEDED(rt)) {
310
331
  return (void*)Qfalse;
311
- }
332
+ }
333
+ wrapper->affected_rows = stmt_wrapper->affected_rows;
334
+ }
335
+ else
336
+ {
337
+ stmt_wrapper->affected_rows = 0;
338
+ wrapper->affected_rows = 0;
312
339
  }
313
340
 
314
341
  rt = dpi_number_columns(stmt_wrapper->stmt, &stmt_wrapper->col_num);
@@ -357,10 +384,7 @@ static int my_big2ll(VALUE bignum, sdint8 *ptr)
357
384
 
358
385
  if (len > sizeof(sdint8)) goto overflow;
359
386
  if (RBIGNUM_POSITIVE_P(bignum)) {
360
- num = rb_big2ull(bignum);
361
- if (num > LLONG_MAX)
362
- goto overflow;
363
- *ptr = num;
387
+ goto overflow;
364
388
  }
365
389
  else {
366
390
  if (len == 8 &&
@@ -403,6 +427,8 @@ static VALUE rb_dm_stmt_execute(int argc, VALUE *argv, VALUE self) {
403
427
  VALUE *params_enc = NULL;
404
428
  rb_encoding *conn_enc;
405
429
  DPIRETURN rt;
430
+ rb_encoding *enc;
431
+ slength indicator;
406
432
 
407
433
  GET_STATEMENT(self);
408
434
  GET_CLIENT(stmt_wrapper->client);
@@ -437,121 +463,108 @@ static VALUE rb_dm_stmt_execute(int argc, VALUE *argv, VALUE self) {
437
463
 
438
464
  switch (TYPE(argv[i])) {
439
465
  case T_NIL:
440
- bind_buffers[i].buffer = xmalloc(8192);
441
- strncpy(bind_buffers[i].buffer, "", 8192);
442
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, 8192, NULL);
466
+ indicator = DSQL_NULL_DATA;
467
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, NULL, 0, &indicator);
443
468
  if(!DSQL_SUCCEEDED(rt))
444
- rb_raise(cdmError, "failed to bind param %d", i);
469
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
445
470
  break;
446
471
  case T_FIXNUM:
447
- #if SIZEOF_INT < SIZEOF_LONG
472
+ #if SIZEOF_INT < SIZEOF_LONG
448
473
  bind_buffers[i].buffer = xmalloc(sizeof(long long int));
449
- *(long*)(bind_buffers[i].buffer) = FIX2LONG(argv[i]);
450
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SBIGINT, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, sizeof(long long int), NULL);
474
+ *(long long int*)(bind_buffers[i].buffer) = FIX2LONG(argv[i]);
475
+ bind_buffers[i].buffer_length = sizeof(long long int);
476
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SBIGINT, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
451
477
  if(!DSQL_SUCCEEDED(rt))
452
- rb_raise(cdmError, "failed to bind param %d", i);
453
- #else
478
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
479
+ #else
454
480
  bind_buffers[i].buffer = xmalloc(sizeof(int));
455
- *(long*)(bind_buffers[i].buffer) = FIX2INT(argv[i]);
456
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, sizeof(int), NULL);
481
+ *(int*)(bind_buffers[i].buffer) = FIX2INT(argv[i]);
482
+ bind_buffers[i].buffer_length = sizeof(int);
483
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
457
484
  if(!DSQL_SUCCEEDED(rt))
458
- rb_raise(cdmError, "failed to bind param %d", i);
459
- #endif
460
- break;
485
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
486
+ #endif
487
+ break;
461
488
  case T_BIGNUM:
462
489
  {
463
490
  sdint8 num;
464
491
  if (my_big2ll(argv[i], &num) == 0) {
465
492
  bind_buffers[i].buffer = xmalloc(sizeof(sdint8));
466
493
  *(sdint8*)(bind_buffers[i].buffer) = num;
467
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SBIGINT, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, sizeof(sdint8), NULL);
494
+ bind_buffers[i].buffer_length = sizeof(sdint8);
495
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SBIGINT, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
468
496
  } else {
469
497
  /* The bignum was larger than we can fit in LONG_LONG, send it as a string */
470
498
  params_enc[i] = rb_str_export_to_enc(rb_big2str(argv[i], 10), conn_enc);
471
499
  set_buffer_for_string(&bind_buffers[i], &length_buffers[i], params_enc[i]);
472
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, NULL);
500
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
473
501
  }
474
502
  }
475
503
  if(!DSQL_SUCCEEDED(rt))
476
- rb_raise(cdmError, "failed to bind param %d", i);
504
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
477
505
  break;
478
506
  case T_FLOAT:
479
507
  bind_buffers[i].buffer = xmalloc(sizeof(double));
480
508
  *(double*)(bind_buffers[i].buffer) = NUM2DBL(argv[i]);
481
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_DOUBLE, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, sizeof(double), NULL);
509
+ bind_buffers[i].buffer_length = sizeof(double);
510
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_DOUBLE, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
482
511
  if(!DSQL_SUCCEEDED(rt))
483
- rb_raise(cdmError, "failed to bind param %d", i);
512
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
484
513
  break;
485
514
  case T_STRING:
486
515
  params_enc[i] = argv[i];
487
- params_enc[i] = rb_str_export_to_enc(params_enc[i], conn_enc);
488
- set_buffer_for_string(&bind_buffers[i], &length_buffers[i], params_enc[i]);
489
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, NULL);
490
- if(!DSQL_SUCCEEDED(rt))
491
- rb_raise(cdmError, "failed to bind param %d", i);
516
+ enc = rb_enc_get(params_enc[i]);
517
+ if (enc == rb_ascii8bit_encoding())
518
+ {
519
+ set_buffer_for_string(&bind_buffers[i], &length_buffers[i], params_enc[i]);
520
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_BINARY, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
521
+ if(!DSQL_SUCCEEDED(rt))
522
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
523
+ }
524
+ else
525
+ {
526
+ params_enc[i] = rb_str_export_to_enc(params_enc[i], conn_enc);
527
+ set_buffer_for_string(&bind_buffers[i], &length_buffers[i], params_enc[i]);
528
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
529
+ if(!DSQL_SUCCEEDED(rt))
530
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
531
+ }
492
532
  break;
493
533
  case T_TRUE:
494
534
  bind_buffers[i].buffer = xmalloc(sizeof(int));
495
535
  *(int*)(bind_buffers[i].buffer) = 1;
496
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, sizeof(int), NULL);
536
+ bind_buffers[i].buffer_length = sizeof(int);
537
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
497
538
  if(!DSQL_SUCCEEDED(rt))
498
- rb_raise(cdmError, "failed to bind param %d", i);
539
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
499
540
  break;
500
541
  case T_FALSE:
501
542
  bind_buffers[i].buffer = xmalloc(sizeof(int));
502
543
  *(int*)(bind_buffers[i].buffer) = 0;
503
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, sizeof(int), NULL);
544
+ bind_buffers[i].buffer_length = sizeof(int);
545
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_SLONG, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
504
546
  if(!DSQL_SUCCEEDED(rt))
505
- rb_raise(cdmError, "failed to bind param %d", i);
547
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
506
548
  break;
507
549
  default:
508
550
  // TODO: what Ruby type should support dm_TYPE_TIME
509
- if (CLASS_OF(argv[i]) == rb_cTime || CLASS_OF(argv[i]) == cDateTime) {
510
- dpi_timestamp_t t;
511
- VALUE rb_time = argv[i];
512
-
513
- bind_buffers[i].buffer = xmalloc(sizeof(dpi_timestamp_t));
514
-
515
- memset(&t, 0, sizeof(dpi_timestamp_t));
516
-
517
- if (CLASS_OF(argv[i]) == rb_cTime) {
518
- t.fraction = FIX2INT(rb_funcall(rb_time, intern_usec, 0));
519
- } else if (CLASS_OF(argv[i]) == cDateTime) {
520
- t.fraction = NUM2DBL(rb_funcall(rb_time, intern_sec_fraction, 0)) * 1000000;
521
- }
522
-
523
- t.second = FIX2INT(rb_funcall(rb_time, intern_sec, 0));
524
- t.minute = FIX2INT(rb_funcall(rb_time, intern_min, 0));
525
- t.hour = FIX2INT(rb_funcall(rb_time, intern_hour, 0));
526
- t.day = FIX2INT(rb_funcall(rb_time, intern_day, 0));
527
- t.month = FIX2INT(rb_funcall(rb_time, intern_month, 0));
528
- t.year = FIX2INT(rb_funcall(rb_time, intern_year, 0));
529
-
530
- *(dpi_timestamp_t*)(bind_buffers[i].buffer) = t;
531
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_TIMESTAMP, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, sizeof(dpi_timestamp_t), NULL);
532
- } else if (CLASS_OF(argv[i]) == cDate) {
533
- dpi_date_t t;
534
- VALUE rb_time = argv[i];
535
-
536
- bind_buffers[i].buffer = xmalloc(sizeof(dpi_date_t));
537
-
538
- memset(&t, 0, sizeof(dpi_date_t));
539
- t.day = FIX2INT(rb_funcall(rb_time, intern_day, 0));
540
- t.month = FIX2INT(rb_funcall(rb_time, intern_month, 0));
541
- t.year = FIX2INT(rb_funcall(rb_time, intern_year, 0));
551
+ if (CLASS_OF(argv[i]) == rb_cTime || CLASS_OF(argv[i]) == cDateTime || CLASS_OF(argv[i]) == cDate) {
552
+ VALUE rb_val_as_string = rb_funcall(argv[i], intern_to_s, 0);
542
553
 
543
- *(dpi_date_t*)(bind_buffers[i].buffer) = t;
544
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_DATE, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, sizeof(dpi_date_t), NULL);
554
+ params_enc[i] = rb_val_as_string;
555
+ params_enc[i] = rb_str_export_to_enc(params_enc[i], conn_enc);
556
+ set_buffer_for_string(&bind_buffers[i], &length_buffers[i], params_enc[i]);
557
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
545
558
  } else if (CLASS_OF(argv[i]) == cBigDecimal) {
546
559
  VALUE rb_val_as_string = rb_funcall(argv[i], intern_to_s, 0);
547
560
 
548
561
  params_enc[i] = rb_val_as_string;
549
562
  params_enc[i] = rb_str_export_to_enc(params_enc[i], conn_enc);
550
563
  set_buffer_for_string(&bind_buffers[i], &length_buffers[i], params_enc[i]);
551
- rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, NULL);
564
+ rt = dpi_bind_param(stmt_wrapper->stmt, i + 1, DSQL_PARAM_INPUT, DSQL_C_NCHAR, stmt_wrapper->paramdesc[i].sql_type, stmt_wrapper->paramdesc[i].prec, stmt_wrapper->paramdesc[i].scale, bind_buffers[i].buffer, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
552
565
  }
553
566
  if(!DSQL_SUCCEEDED(rt))
554
- rb_raise(cdmError, "failed to bind param %d", i);
567
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
555
568
  break;
556
569
  }
557
570
  }
@@ -595,7 +608,13 @@ static VALUE rb_dm_stmt_execute(int argc, VALUE *argv, VALUE self) {
595
608
  */
596
609
  static VALUE rb_dm_stmt_last_id(VALUE self) {
597
610
  GET_STATEMENT(self);
598
- return rb_str_new2(stmt_wrapper->lastrowid);
611
+ GET_CLIENT(stmt_wrapper->client);
612
+ rb_encoding *conn_enc;
613
+ VALUE obj = rb_str_new2(stmt_wrapper->lastrowid);
614
+
615
+ conn_enc = rb_to_encoding(wrapper->encoding);
616
+ rb_enc_associate(obj, conn_enc);
617
+ return obj;
599
618
  }
600
619
 
601
620
  /* call-seq:
data/ext/statement.h CHANGED
@@ -26,6 +26,7 @@ typedef struct {
26
26
  udint2 col_num;
27
27
  ParamDesc *paramdesc;
28
28
  int is_prepare;
29
+ dm_client_wrapper *client_wrapper;
29
30
  } dm_stmt_wrapper;
30
31
 
31
32
  void init_dm_statement(void);
data/lib/dm/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dm
4
- VERSION = "1.0.4"
4
+ VERSION = "1.0.6"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dmRuby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - sunbiao
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-10-10 00:00:00.000000000 Z
11
+ date: 2025-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bigdecimal
@@ -39,6 +39,7 @@ files:
39
39
  - "./README.md"
40
40
  - "./Rakefile"
41
41
  - "./dm.gemspec"
42
+ - "./dmRuby-1.0.6.gem"
42
43
  - ext/client.c
43
44
  - ext/client.h
44
45
  - ext/dm_enc_name_to_ruby.h