dmRuby 1.0.4 → 1.0.5

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: 64aabe0fbddebacf24fc7a4822257d952dd44e6c28d231218077a4d8261e0b50
4
+ data.tar.gz: 0b5b3bc45b31795d01a59006703e3f6a9c6277730f7bb5eea859e7807ba9baf9
5
5
  SHA512:
6
- metadata.gz: 8615170e2fedb07bd810734a3235c7a3d23f3b037130ee290699d481b1a37103a8bbb8c6025850a15c119cb1d50cb672462b445301d7591d233e77354fdc118f
7
- data.tar.gz: f3aaa9c5e134493f38c959fb298081e4c155fb6437ef555b734806c430d6e1e74a6669709dc659536a522819f9902b94e138d56aaafd5e2d8c83324a28a9b12f
6
+ metadata.gz: 70e9160a4f618833a593439af92c0f1b8261389f91109472af994ac94e522093ed61e925961d39472e6f0d899edbd6127569bcf3198692351d8b1e11930b814a
7
+ data.tar.gz: 5426e757e3aa0380a67a493fd389ab624ffd082d9a58b5d9ce1f90db7d36419b660389835b2fbc2b7d00d2b007afd7f77abe672196bc566abf3bd787e1a6145b
data/ChangeLogs.md CHANGED
@@ -8,13 +8,27 @@
8
8
 
9
9
  ## Change Logs
10
10
 
11
+ - dmRuby v1.0.5
12
+
13
+ 1、修改读取bit类型结果错误的问题;
14
+
15
+ 2、修改Dm::Client.affected_rows()返回结果错误的问题;
16
+
17
+ 3、修改对number类型,查询sum()求和返回结果丢失精度的问题;
18
+
19
+ 4、修改不手动调用stmt.close,内存持续增长的问题;
20
+
21
+ 5、修改blob插入二进制数据,数据库查询为空的问题;
22
+
23
+ 6、修改插入较长的整数会溢出的问题。
24
+
11
25
  - dmRuby v1.0.4
12
26
 
13
- 1、新增连接参数schema
27
+ 1、新增连接参数schema
14
28
 
15
29
  - dmRuby v1.0.3
16
30
 
17
- 1、修改stmt执行的语句不能输出array类型的result
31
+ 1、修改stmt执行的语句不能输出array类型的result
18
32
 
19
33
  - dmRuby v1.0.2
20
34
 
data/dmRuby-1.0.5.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
@@ -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
  }
@@ -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,11 @@ 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
+ }
34
37
  }
35
38
 
36
39
  #ifdef HAVE_RB_GC_MARK_MOVABLE
@@ -74,12 +77,25 @@ static void *nogvl_stmt_close(void *ptr) {
74
77
  void decr_dm_stmt(dm_stmt_wrapper *stmt_wrapper) {
75
78
  stmt_wrapper->refcount--;
76
79
 
77
- if (stmt_wrapper->refcount == 0) {
78
- if(stmt_wrapper->paramdesc != NULL)
80
+ if (stmt_wrapper->refcount == 0)
81
+ {
82
+ if (stmt_wrapper->paramdesc != NULL)
79
83
  {
80
84
  xfree(stmt_wrapper->paramdesc);
81
85
  stmt_wrapper->paramdesc = NULL;
82
86
  }
87
+
88
+ if (stmt_wrapper->stmt && stmt_wrapper->client != Qnil)
89
+ {
90
+ if (stmt_wrapper->client_wrapper->closed != 1) {
91
+ dpi_free_stmt(stmt_wrapper->stmt);
92
+ }
93
+ stmt_wrapper->stmt = NULL;
94
+ }
95
+
96
+ if (stmt_wrapper->client != Qnil)
97
+ decr_dm_client(stmt_wrapper->client_wrapper);
98
+
83
99
  xfree(stmt_wrapper);
84
100
  }
85
101
  }
@@ -201,6 +217,8 @@ VALUE rb_dm_stmt_new(VALUE rb_client, VALUE sql) {
201
217
  #endif
202
218
  {
203
219
  stmt_wrapper->client = rb_client;
220
+ stmt_wrapper->client_wrapper = DATA_PTR(rb_client);
221
+ stmt_wrapper->client_wrapper->refcount++;
204
222
  stmt_wrapper->refcount = 1;
205
223
  stmt_wrapper->closed = 0;
206
224
  stmt_wrapper->stmt = NULL;
@@ -292,11 +310,13 @@ static void *nogvl_stmt_execute(void *ptr) {
292
310
  rt = dpi_rowid_to_char(wrapper->client,lastrowid,sizeof(lastrowid),stmt_wrapper->lastrowid,sizeof(stmt_wrapper->lastrowid),&len);
293
311
  if (!DSQL_SUCCEEDED(rt)) {
294
312
  return (void*)Qfalse;
295
- }
313
+ }
314
+ strncpy(wrapper->lastrowid, stmt_wrapper->lastrowid, 20);
296
315
  }
297
316
  else
298
317
  {
299
318
  strncpy(stmt_wrapper->lastrowid, "", 20);
319
+ strncpy(wrapper->lastrowid, "", 20);
300
320
  }
301
321
 
302
322
  // affected_rows
@@ -308,7 +328,13 @@ static void *nogvl_stmt_execute(void *ptr) {
308
328
  rt = dpi_row_count(stmt_wrapper->stmt,&stmt_wrapper->affected_rows);
309
329
  if (!DSQL_SUCCEEDED(rt)) {
310
330
  return (void*)Qfalse;
311
- }
331
+ }
332
+ wrapper->affected_rows = stmt_wrapper->affected_rows;
333
+ }
334
+ else
335
+ {
336
+ stmt_wrapper->affected_rows = 0;
337
+ wrapper->affected_rows = 0;
312
338
  }
313
339
 
314
340
  rt = dpi_number_columns(stmt_wrapper->stmt, &stmt_wrapper->col_num);
@@ -357,10 +383,7 @@ static int my_big2ll(VALUE bignum, sdint8 *ptr)
357
383
 
358
384
  if (len > sizeof(sdint8)) goto overflow;
359
385
  if (RBIGNUM_POSITIVE_P(bignum)) {
360
- num = rb_big2ull(bignum);
361
- if (num > LLONG_MAX)
362
- goto overflow;
363
- *ptr = num;
386
+ goto overflow;
364
387
  }
365
388
  else {
366
389
  if (len == 8 &&
@@ -403,6 +426,7 @@ static VALUE rb_dm_stmt_execute(int argc, VALUE *argv, VALUE self) {
403
426
  VALUE *params_enc = NULL;
404
427
  rb_encoding *conn_enc;
405
428
  DPIRETURN rt;
429
+ rb_encoding *enc;
406
430
 
407
431
  GET_STATEMENT(self);
408
432
  GET_CLIENT(stmt_wrapper->client);
@@ -439,70 +463,88 @@ static VALUE rb_dm_stmt_execute(int argc, VALUE *argv, VALUE self) {
439
463
  case T_NIL:
440
464
  bind_buffers[i].buffer = xmalloc(8192);
441
465
  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
+ bind_buffers[i].buffer_length = 8192;
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, bind_buffers[i].buffer, bind_buffers[i].buffer_length, NULL);
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
@@ -528,7 +570,8 @@ static VALUE rb_dm_stmt_execute(int argc, VALUE *argv, VALUE self) {
528
570
  t.year = FIX2INT(rb_funcall(rb_time, intern_year, 0));
529
571
 
530
572
  *(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);
573
+ bind_buffers[i].buffer_length = sizeof(dpi_timestamp_t);
574
+ 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, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
532
575
  } else if (CLASS_OF(argv[i]) == cDate) {
533
576
  dpi_date_t t;
534
577
  VALUE rb_time = argv[i];
@@ -541,17 +584,18 @@ static VALUE rb_dm_stmt_execute(int argc, VALUE *argv, VALUE self) {
541
584
  t.year = FIX2INT(rb_funcall(rb_time, intern_year, 0));
542
585
 
543
586
  *(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);
587
+ bind_buffers[i].buffer_length = sizeof(dpi_date_t);
588
+ 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, bind_buffers[i].buffer_length, &(bind_buffers[i].buffer_length));
545
589
  } else if (CLASS_OF(argv[i]) == cBigDecimal) {
546
590
  VALUE rb_val_as_string = rb_funcall(argv[i], intern_to_s, 0);
547
591
 
548
592
  params_enc[i] = rb_val_as_string;
549
593
  params_enc[i] = rb_str_export_to_enc(params_enc[i], conn_enc);
550
594
  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);
595
+ 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
596
  }
553
597
  if(!DSQL_SUCCEEDED(rt))
554
- rb_raise(cdmError, "failed to bind param %d", i);
598
+ rb_raise(cdmError, "failed to bind param %d , code = %d", i, rt, stmt_wrapper, stmt_wrapper->stmt, *(udint8*)stmt_wrapper->stmt);
555
599
  break;
556
600
  }
557
601
  }
@@ -595,7 +639,13 @@ static VALUE rb_dm_stmt_execute(int argc, VALUE *argv, VALUE self) {
595
639
  */
596
640
  static VALUE rb_dm_stmt_last_id(VALUE self) {
597
641
  GET_STATEMENT(self);
598
- return rb_str_new2(stmt_wrapper->lastrowid);
642
+ GET_CLIENT(stmt_wrapper->client);
643
+ rb_encoding *conn_enc;
644
+ VALUE obj = rb_str_new2(stmt_wrapper->lastrowid);
645
+
646
+ conn_enc = rb_to_encoding(wrapper->encoding);
647
+ rb_enc_associate(obj, conn_enc);
648
+ return obj;
599
649
  }
600
650
 
601
651
  /* 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.5"
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.5
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-18 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.5.gem"
42
43
  - ext/client.c
43
44
  - ext/client.h
44
45
  - ext/dm_enc_name_to_ruby.h