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 +4 -4
- data/ChangeLogs.md +16 -2
- data/dmRuby-1.0.5.gem +0 -0
- data/ext/client.c +6 -1
- data/ext/result.c +4 -7
- data/ext/statement.c +91 -41
- data/ext/statement.h +1 -0
- data/lib/dm/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 64aabe0fbddebacf24fc7a4822257d952dd44e6c28d231218077a4d8261e0b50
|
|
4
|
+
data.tar.gz: 0b5b3bc45b31795d01a59006703e3f6a9c6277730f7bb5eea859e7807ba9baf9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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 =
|
|
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 (
|
|
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 *
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*(
|
|
456
|
-
|
|
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
|
-
|
|
459
|
-
#endif
|
|
460
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
data/lib/dm/version.rb
CHANGED
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
|
+
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-
|
|
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
|