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 +4 -4
- data/ChangeLogs.md +26 -2
- data/dmRuby-1.0.6.gem +0 -0
- data/ext/client.c +6 -1
- data/ext/result.c +8 -11
- data/ext/statement.c +95 -76
- 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: 16c17975a7c35617e5a27459e3f4bff7070a7bfac2d788019c2e9d999ec15ed2
|
|
4
|
+
data.tar.gz: 13be646ef94149926f1adc7bc539a013603dcadf9aaeafe53b1da87a64b732c0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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+
|
|
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]
|
|
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 =
|
|
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,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 *
|
|
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
|
+
}
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
441
|
-
|
|
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
|
-
|
|
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
|
|
509
|
-
if (CLASS_OF(argv[i]) == rb_cTime || CLASS_OF(argv[i]) == cDateTime) {
|
|
510
|
-
|
|
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
|
-
|
|
544
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
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.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-
|
|
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
|