ibm_db 1.5.0-mswin32 → 2.0.0-mswin32
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.
- data/CHANGES +4 -0
- data/LICENSE +1 -1
- data/ParameterizedQueries README +39 -0
- data/README +1 -1
- data/ext/ibm_db.c +663 -436
- data/ext/ruby_ibm_db.h +6 -2
- data/ext/ruby_ibm_db_cli.c +3 -3
- data/ext/ruby_ibm_db_cli.h +17 -8
- data/lib/IBM_DB.rb +1 -1
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +383 -70
- data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1902 -0
- data/lib/mswin32/ibm_db.so +0 -0
- data/test/cases/calculations_test.rb +5 -1
- data/test/cases/helper.rb +75 -0
- data/test/connections/native_ibm_db/connection.rb +26 -24
- data/test/schema/schema.rb +1 -0
- metadata +5 -3
- data/ext/mkmf.log +0 -45
data/CHANGES
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
Change Log
|
2
2
|
==============
|
3
|
+
2010/01/21 (IBM_DB adapter 2.0.0, driver 2.0.0) :
|
4
|
+
- Support for usage of parameterized SQL queries
|
5
|
+
- Exposed constant VERSION in the driver [Feature Request: #27231]
|
6
|
+
|
3
7
|
2009/08/21 (IBM_DB adapter 1.5.0, driver 1.5.0) :
|
4
8
|
- non-block enhancement in the ruby driver made for Ruby version 1.9. [support request #25023]
|
5
9
|
- New API's getErrormsg and getErrorstate for retrieving error messages/state added
|
data/LICENSE
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
+-------------------------------------------+-------------------------------------------+
|
2
|
+
| README for Parameterized Queries Support in Ruby-on-Rails/ Activerecord applications |
|
3
|
+
+-------------------------------------------+-------------------------------------------+
|
4
|
+
|
5
|
+
Enabling Usage of Parameterized Queries with Ruby-on-Rails / Activerecord applications
|
6
|
+
======================================================================================
|
7
|
+
To enable usage of parameterized SQL queries with Ruby-on-Rails/ActiveRecord applications, in your connection configuration (database.yml), set "parameterized" to true. By default "parameterized" is false (if not specified). A sample database.yml file showing development section with parameterized queries enabled looks as below
|
8
|
+
|
9
|
+
development:
|
10
|
+
adapter: ibm_db
|
11
|
+
username: db2inst1
|
12
|
+
password: secret
|
13
|
+
database: devdb
|
14
|
+
#schema: db2inst1
|
15
|
+
#host: localhost
|
16
|
+
#port: 50000
|
17
|
+
#account: my_account
|
18
|
+
#app_user: my_app_user
|
19
|
+
#application: my_application
|
20
|
+
#workstation: my_workstation
|
21
|
+
parameterized: true
|
22
|
+
|
23
|
+
Similarly for the other sections (test/production) of the database.yml file set "parameterized" to true to enable usage of parameterized SQL queries
|
24
|
+
|
25
|
+
Supported Activerecord Versions
|
26
|
+
===============================
|
27
|
+
Activerecord-2.3.3, Activerecord-2.3.4, Activerecord-2.3.5
|
28
|
+
|
29
|
+
Supported Operating Systems and Databases
|
30
|
+
=========================================
|
31
|
+
Refer the main README
|
32
|
+
|
33
|
+
Feedback
|
34
|
+
========
|
35
|
+
Your feedback is very much appreciated and expected through Rubyforge:
|
36
|
+
- rubyibm project: http://rubyforge.org/projects/rubyibm/
|
37
|
+
- rubyibm forum: http://rubyforge.org/forum/?group_id=2361
|
38
|
+
- rubyibm bug reports: http://rubyforge.org/tracker/?group_id=2361
|
39
|
+
- IBM_DB developers: rubyibm-developers@rubyforge.org
|
data/README
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
=====================================================================
|
2
|
-
README for the IBM_DB Adapter (
|
2
|
+
README for the IBM_DB Adapter (2.0.0) and Driver (2.0.0) (2010/01/21)
|
3
3
|
For ActiveRecord Version >= 1.15.5 (and Rails >= 1.2.5)
|
4
4
|
=====================================================================
|
5
5
|
|
data/ext/ibm_db.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
+----------------------------------------------------------------------+
|
3
3
|
| Licensed Materials - Property of IBM |
|
4
4
|
| |
|
5
|
-
| (C) Copyright IBM Corporation 2006, 2007,2008, 2009
|
5
|
+
| (C) Copyright IBM Corporation 2006, 2007,2008, 2009, 2010 |
|
6
6
|
+----------------------------------------------------------------------+
|
7
7
|
| Authors: Sushant Koduru, Lynh Nguyen, Kanchana Padmanabhan, |
|
8
8
|
| Dan Scott, Helmut Tessarek, Sam Ruby, Kellen Bombardier, |
|
@@ -12,7 +12,7 @@
|
|
12
12
|
+----------------------------------------------------------------------+
|
13
13
|
*/
|
14
14
|
|
15
|
-
#define MODULE_RELEASE "
|
15
|
+
#define MODULE_RELEASE "2.0.0"
|
16
16
|
|
17
17
|
#ifdef HAVE_CONFIG_H
|
18
18
|
#include "config.h"
|
@@ -31,7 +31,7 @@ static struct _ibm_db_globals *ibm_db_globals;
|
|
31
31
|
static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType, SQLHANDLE handle, SQLSMALLINT hType,
|
32
32
|
int rc, int cpy_to_global, char* ret_str, int API, SQLSMALLINT recno,
|
33
33
|
int release_gil );
|
34
|
-
static VALUE _ruby_ibm_db_assign_options( void* handle, int type, long opt_key, VALUE data,
|
34
|
+
static VALUE _ruby_ibm_db_assign_options( void* handle, int type, long opt_key, VALUE data, VALUE *error );
|
35
35
|
static void _ruby_ibm_db_clear_conn_err_cache();
|
36
36
|
static void _ruby_ibm_db_clear_stmt_err_cache();
|
37
37
|
static int _ruby_ibm_db_set_decfloat_rounding_mode_client(SQLHANDLE hdbc);
|
@@ -44,7 +44,7 @@ typedef struct _stmt_bind_data_array {
|
|
44
44
|
stmt_handle *stmt_res;
|
45
45
|
SQLSMALLINT num;
|
46
46
|
int bind_params;
|
47
|
-
|
47
|
+
VALUE *error;
|
48
48
|
}stmt_bind_array;
|
49
49
|
|
50
50
|
/*
|
@@ -55,7 +55,8 @@ typedef struct _ibm_db_connect_helper_args_struct {
|
|
55
55
|
connect_args *conn_args;
|
56
56
|
int isPersistent;
|
57
57
|
VALUE *options;
|
58
|
-
|
58
|
+
VALUE *error;
|
59
|
+
int literal_replacement;
|
59
60
|
} connect_helper_args;
|
60
61
|
|
61
62
|
/*
|
@@ -64,7 +65,7 @@ typedef struct _ibm_db_connect_helper_args_struct {
|
|
64
65
|
typedef struct _ibm_db_result_args_struct {
|
65
66
|
stmt_handle *stmt_res;
|
66
67
|
VALUE column;
|
67
|
-
|
68
|
+
VALUE *error;
|
68
69
|
} ibm_db_result_args;
|
69
70
|
|
70
71
|
/*
|
@@ -75,7 +76,7 @@ typedef struct _ibm_db_fetch_helper_struct {
|
|
75
76
|
VALUE row_number;
|
76
77
|
int arg_count;
|
77
78
|
int funcType;
|
78
|
-
|
79
|
+
VALUE *error;
|
79
80
|
} ibm_db_fetch_helper_args;
|
80
81
|
|
81
82
|
void ruby_init_ibm_db();
|
@@ -241,10 +242,10 @@ static void ruby_ibm_db_init_globals(struct _ibm_db_globals *ibm_db_globals)
|
|
241
242
|
/* env handle */
|
242
243
|
ibm_db_globals->bin_mode = 1;
|
243
244
|
|
244
|
-
memset(ibm_db_globals->__ruby_conn_err_msg, 0, DB2_MAX_ERR_MSG_LEN);
|
245
|
-
memset(ibm_db_globals->__ruby_stmt_err_msg, 0, DB2_MAX_ERR_MSG_LEN);
|
246
|
-
memset(ibm_db_globals->__ruby_conn_err_state, 0, SQL_SQLSTATE_SIZE + 1);
|
247
|
-
memset(ibm_db_globals->__ruby_stmt_err_state, 0, SQL_SQLSTATE_SIZE + 1);
|
245
|
+
memset(ibm_db_globals->__ruby_conn_err_msg, '\0', DB2_MAX_ERR_MSG_LEN);
|
246
|
+
memset(ibm_db_globals->__ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN);
|
247
|
+
memset(ibm_db_globals->__ruby_conn_err_state, '\0', SQL_SQLSTATE_SIZE + 1);
|
248
|
+
memset(ibm_db_globals->__ruby_stmt_err_state, '\0', SQL_SQLSTATE_SIZE + 1);
|
248
249
|
}
|
249
250
|
/* */
|
250
251
|
|
@@ -268,18 +269,20 @@ char *estrndup(char *data, int max) {
|
|
268
269
|
return dup;
|
269
270
|
}
|
270
271
|
|
271
|
-
|
272
|
-
|
273
|
-
|
272
|
+
void strtolower(char *data, int max) {
|
273
|
+
if( max > 0 ) {
|
274
|
+
while (max--) {
|
275
|
+
data[max] = tolower(data[max]);
|
276
|
+
}
|
274
277
|
}
|
275
|
-
return data;
|
276
278
|
}
|
277
279
|
|
278
|
-
|
279
|
-
|
280
|
-
|
280
|
+
void strtoupper(char *data, int max) {
|
281
|
+
if( max > 0 ) {
|
282
|
+
while (max--) {
|
283
|
+
data[max] = toupper(data[max]);
|
284
|
+
}
|
281
285
|
}
|
282
|
-
return data;
|
283
286
|
}
|
284
287
|
|
285
288
|
/* static void _ruby_ibm_db_mark_conn_struct */
|
@@ -317,6 +320,7 @@ static void _ruby_ibm_db_free_conn_struct(conn_handle *handle)
|
|
317
320
|
ruby_xfree( handle );
|
318
321
|
}*/
|
319
322
|
ruby_xfree( handle );
|
323
|
+
handle = NULL;
|
320
324
|
}
|
321
325
|
}
|
322
326
|
/* */
|
@@ -344,7 +348,10 @@ static void _ruby_ibm_db_mark_row_struct(row_hash_struct *handle)
|
|
344
348
|
/* static void _ruby_ibm_db_free_row_struct */
|
345
349
|
static void _ruby_ibm_db_free_row_struct(row_hash_struct *handle)
|
346
350
|
{
|
347
|
-
|
351
|
+
if ( handle != NULL ) {
|
352
|
+
ruby_xfree( handle );
|
353
|
+
handle = NULL;
|
354
|
+
}
|
348
355
|
}
|
349
356
|
/* */
|
350
357
|
|
@@ -360,22 +367,28 @@ static void _ruby_ibm_db_free_result_struct(stmt_handle* handle)
|
|
360
367
|
curr_ptr = handle->head_cache_list;
|
361
368
|
prev_ptr = handle->head_cache_list;
|
362
369
|
|
363
|
-
while (curr_ptr != NULL) {
|
370
|
+
while ( curr_ptr != NULL ) {
|
364
371
|
curr_ptr = curr_ptr->next;
|
365
372
|
|
366
|
-
if (prev_ptr->varname) {
|
373
|
+
if ( prev_ptr->varname != NULL ) {
|
367
374
|
ruby_xfree( prev_ptr->varname );
|
375
|
+
prev_ptr->varname = NULL;
|
368
376
|
}
|
369
377
|
|
370
|
-
if ( prev_ptr->svalue ) {
|
378
|
+
if ( prev_ptr->svalue != NULL ) {
|
371
379
|
ruby_xfree( prev_ptr->svalue );
|
380
|
+
prev_ptr->svalue = NULL;
|
372
381
|
}
|
373
382
|
ruby_xfree( prev_ptr );
|
374
383
|
|
375
384
|
prev_ptr = curr_ptr;
|
376
385
|
}
|
386
|
+
handle->head_cache_list = NULL;
|
387
|
+
handle->num_params = 0;
|
388
|
+
handle->current_node = NULL;
|
389
|
+
|
377
390
|
/* free row data cache */
|
378
|
-
if (handle->row_data) {
|
391
|
+
if ( handle->row_data ) {
|
379
392
|
for (i=0; i<handle->num_columns;i++) {
|
380
393
|
switch (handle->column_info[i].type) {
|
381
394
|
case SQL_CHAR:
|
@@ -404,7 +417,10 @@ static void _ruby_ibm_db_free_result_struct(stmt_handle* handle)
|
|
404
417
|
/* free column info cache */
|
405
418
|
if ( handle->column_info ) {
|
406
419
|
for (i=0; i<handle->num_columns; i++) {
|
407
|
-
|
420
|
+
if ( handle->column_info[i].name != NULL ) {
|
421
|
+
ruby_xfree( handle->column_info[i].name );
|
422
|
+
handle->column_info[i].name = NULL;
|
423
|
+
}
|
408
424
|
}
|
409
425
|
ruby_xfree( handle->column_info );
|
410
426
|
handle->column_info = NULL;
|
@@ -421,7 +437,7 @@ static stmt_handle *_ibm_db_new_stmt_struct(conn_handle* conn_res)
|
|
421
437
|
stmt_handle *stmt_res;
|
422
438
|
|
423
439
|
stmt_res = ALLOC( stmt_handle );
|
424
|
-
memset( stmt_res, 0, sizeof(stmt_handle) );
|
440
|
+
memset( stmt_res, '\0', sizeof(stmt_handle) );
|
425
441
|
|
426
442
|
/* Initialize stmt resource so parsing assigns updated options if needed */
|
427
443
|
stmt_res->hdbc = conn_res->hdbc;
|
@@ -443,7 +459,8 @@ static stmt_handle *_ibm_db_new_stmt_struct(conn_handle* conn_res)
|
|
443
459
|
|
444
460
|
stmt_res->row_data = NULL;
|
445
461
|
|
446
|
-
stmt_res->is_executing
|
462
|
+
stmt_res->is_executing = 0;
|
463
|
+
stmt_res->is_freed = 0;
|
447
464
|
|
448
465
|
stmt_res->ruby_stmt_err_msg = NULL;
|
449
466
|
stmt_res->ruby_stmt_err_state = NULL;
|
@@ -456,31 +473,47 @@ static stmt_handle *_ibm_db_new_stmt_struct(conn_handle* conn_res)
|
|
456
473
|
static void _ruby_ibm_db_mark_stmt_struct(stmt_handle *handle)
|
457
474
|
{
|
458
475
|
}
|
476
|
+
|
459
477
|
/* */
|
460
478
|
|
461
|
-
/* static
|
462
|
-
static void
|
479
|
+
/* static _ruby_ibm_db_free_stmt_handle_and_resources */
|
480
|
+
static void _ruby_ibm_db_free_stmt_handle_and_resources(stmt_handle *handle)
|
463
481
|
{
|
464
482
|
int rc;
|
465
483
|
if ( handle != NULL ) {
|
466
484
|
|
467
|
-
|
485
|
+
if( !handle->is_freed ) {
|
486
|
+
rc = SQLFreeHandle( SQL_HANDLE_STMT, handle->hstmt );
|
468
487
|
|
469
|
-
|
488
|
+
_ruby_ibm_db_free_result_struct( handle );
|
470
489
|
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
490
|
+
if( handle->ruby_stmt_err_msg != NULL ) {
|
491
|
+
ruby_xfree( handle->ruby_stmt_err_msg );
|
492
|
+
handle->ruby_stmt_err_msg = NULL;
|
493
|
+
}
|
475
494
|
|
476
|
-
|
477
|
-
|
478
|
-
|
495
|
+
if( handle->ruby_stmt_err_state != NULL ) {
|
496
|
+
ruby_xfree( handle->ruby_stmt_err_state );
|
497
|
+
handle->ruby_stmt_err_state = NULL;
|
498
|
+
}
|
499
|
+
handle->is_freed = 1; /* Indicates that the handle is freed */
|
479
500
|
}
|
501
|
+
}
|
502
|
+
}
|
480
503
|
|
504
|
+
/* */
|
505
|
+
|
506
|
+
/* static _ruby_ibm_db_free_stmt_struct */
|
507
|
+
static void _ruby_ibm_db_free_stmt_struct(stmt_handle *handle)
|
508
|
+
{
|
509
|
+
int rc;
|
510
|
+
if ( handle != NULL ) {
|
511
|
+
_ruby_ibm_db_free_stmt_handle_and_resources( handle );
|
481
512
|
ruby_xfree( handle );
|
513
|
+
handle = NULL;
|
482
514
|
}
|
483
515
|
}
|
516
|
+
|
484
517
|
/* */
|
485
518
|
|
486
519
|
/* allow direct access to hash object as object attributes */
|
@@ -514,7 +547,7 @@ void ruby_init_ibm_db()
|
|
514
547
|
#endif
|
515
548
|
|
516
549
|
ibm_db_globals = ALLOC(struct _ibm_db_globals);
|
517
|
-
memset(ibm_db_globals, 0, sizeof(struct _ibm_db_globals));
|
550
|
+
memset(ibm_db_globals, '\0', sizeof(struct _ibm_db_globals));
|
518
551
|
|
519
552
|
ruby_ibm_db_init_globals(ibm_db_globals);
|
520
553
|
|
@@ -592,6 +625,12 @@ void ruby_init_ibm_db()
|
|
592
625
|
rb_define_const(mDB, "DB_CONN", INT2NUM(DB_CONN));
|
593
626
|
/*Specifies resource Type passed is Statement Handle, for retrieving error message*/
|
594
627
|
rb_define_const(mDB, "DB_STMT", INT2NUM(DB_STMT));
|
628
|
+
/*Specifies Quoted Literal replacement connection attribute is to be set*/
|
629
|
+
rb_define_const(mDB, "QUOTED_LITERAL_REPLACEMENT_ON", INT2NUM(SET_QUOTED_LITERAL_REPLACEMENT_ON));
|
630
|
+
/*Specifies Quoted Literal replacement connection attribute should not be set*/
|
631
|
+
rb_define_const(mDB, "QUOTED_LITERAL_REPLACEMENT_OFF", INT2NUM(SET_QUOTED_LITERAL_REPLACEMENT_OFF));
|
632
|
+
/*Specfies the version of the driver*/
|
633
|
+
rb_define_const(mDB, "VERSION",rb_str_new2(MODULE_RELEASE));
|
595
634
|
|
596
635
|
rb_global_variable(&persistent_list);
|
597
636
|
|
@@ -699,7 +738,7 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
699
738
|
memset(msg, '\0', SQL_MAX_MESSAGE_LENGTH + 1);
|
700
739
|
memset(sqlstate, '\0', SQL_SQLSTATE_SIZE + 1);
|
701
740
|
|
702
|
-
get_DiagRec_args =
|
741
|
+
get_DiagRec_args = ALLOC(get_diagRec_args);
|
703
742
|
memset(get_DiagRec_args,'\0',sizeof(struct _ibm_db_get_diagRec_struct));
|
704
743
|
|
705
744
|
get_DiagRec_args->hType = hType;
|
@@ -762,14 +801,14 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
762
801
|
}
|
763
802
|
|
764
803
|
if( conn_res->ruby_error_msg == NULL ) {
|
765
|
-
conn_res->ruby_error_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
804
|
+
conn_res->ruby_error_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
766
805
|
}
|
767
806
|
|
768
807
|
memset( conn_res->ruby_error_state,'\0', SQL_SQLSTATE_SIZE+1 );
|
769
|
-
memset( conn_res->ruby_error_msg,'\0', DB2_MAX_ERR_MSG_LEN );
|
808
|
+
memset( conn_res->ruby_error_msg,'\0', DB2_MAX_ERR_MSG_LEN+1 );
|
770
809
|
|
771
810
|
strncpy(conn_res->ruby_error_state, (char*)sqlstate, SQL_SQLSTATE_SIZE+1 );
|
772
|
-
strncpy(conn_res->ruby_error_msg, (char*)errMsg, DB2_MAX_ERR_MSG_LEN );
|
811
|
+
strncpy(conn_res->ruby_error_msg, (char*)errMsg, DB2_MAX_ERR_MSG_LEN+1 );
|
773
812
|
|
774
813
|
break;
|
775
814
|
|
@@ -786,14 +825,14 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
786
825
|
}
|
787
826
|
|
788
827
|
if( conn_res->ruby_error_msg == NULL ) {
|
789
|
-
conn_res->ruby_error_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
828
|
+
conn_res->ruby_error_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
790
829
|
}
|
791
830
|
|
792
831
|
memset( conn_res->ruby_error_state,'\0', SQL_SQLSTATE_SIZE+1 );
|
793
|
-
memset( conn_res->ruby_error_msg,'\0', DB2_MAX_ERR_MSG_LEN );
|
832
|
+
memset( conn_res->ruby_error_msg,'\0', DB2_MAX_ERR_MSG_LEN+1 );
|
794
833
|
|
795
834
|
strncpy(conn_res->ruby_error_state, (char*)sqlstate, SQL_SQLSTATE_SIZE+1 );
|
796
|
-
strncpy(conn_res->ruby_error_msg, (char*)errMsg, DB2_MAX_ERR_MSG_LEN );
|
835
|
+
strncpy(conn_res->ruby_error_msg, (char*)errMsg, DB2_MAX_ERR_MSG_LEN+1 );
|
797
836
|
|
798
837
|
break;
|
799
838
|
|
@@ -807,14 +846,14 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
807
846
|
}
|
808
847
|
|
809
848
|
if( stmt_res->ruby_stmt_err_msg == NULL ) {
|
810
|
-
stmt_res->ruby_stmt_err_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
849
|
+
stmt_res->ruby_stmt_err_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
811
850
|
}
|
812
851
|
|
813
852
|
memset( stmt_res->ruby_stmt_err_state, '\0', SQL_SQLSTATE_SIZE+1 );
|
814
|
-
memset( stmt_res->ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN );
|
853
|
+
memset( stmt_res->ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN+1 );
|
815
854
|
|
816
855
|
strncpy(stmt_res->ruby_stmt_err_state, (char*)sqlstate, SQL_SQLSTATE_SIZE+1 );
|
817
|
-
strncpy(stmt_res->ruby_stmt_err_msg, (char*)errMsg, DB2_MAX_ERR_MSG_LEN );
|
856
|
+
strncpy(stmt_res->ruby_stmt_err_msg, (char*)errMsg, DB2_MAX_ERR_MSG_LEN+1 );
|
818
857
|
|
819
858
|
break;
|
820
859
|
|
@@ -825,7 +864,7 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
825
864
|
conn_errormsg and conn_error are removed
|
826
865
|
*/
|
827
866
|
strncpy(IBM_DB_G(__ruby_stmt_err_state), (char*)sqlstate, SQL_SQLSTATE_SIZE+1);
|
828
|
-
strncpy(IBM_DB_G(__ruby_stmt_err_msg), (char*)errMsg, DB2_MAX_ERR_MSG_LEN);
|
867
|
+
strncpy(IBM_DB_G(__ruby_stmt_err_msg), (char*)errMsg, DB2_MAX_ERR_MSG_LEN+1);
|
829
868
|
|
830
869
|
break;
|
831
870
|
|
@@ -842,7 +881,7 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
842
881
|
return;
|
843
882
|
case DB_ERRMSG:
|
844
883
|
if ( ret_str != NULL ) {
|
845
|
-
strncpy(ret_str, (char*)msg, DB2_MAX_ERR_MSG_LEN);
|
884
|
+
strncpy(ret_str, (char*)msg, DB2_MAX_ERR_MSG_LEN+1);
|
846
885
|
}
|
847
886
|
return;
|
848
887
|
default:
|
@@ -859,9 +898,9 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
859
898
|
/* */
|
860
899
|
|
861
900
|
/*
|
862
|
-
static void _ruby_ibm_db_assign_options( void *handle, int type, long opt_key, VALUE data,
|
901
|
+
static void _ruby_ibm_db_assign_options( void *handle, int type, long opt_key, VALUE data, VALUE *error )
|
863
902
|
*/
|
864
|
-
static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key, VALUE data,
|
903
|
+
static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key, VALUE data, VALUE *error )
|
865
904
|
{
|
866
905
|
int rc = 0;
|
867
906
|
long option_num = 0;
|
@@ -884,7 +923,7 @@ static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key,
|
|
884
923
|
((stmt_handle*)handle)->s_case_mode = CASE_NATURAL;
|
885
924
|
break;
|
886
925
|
default:
|
887
|
-
|
926
|
+
*error = rb_str_new2("ATTR_CASE attribute must be one of CASE_LOWER, CASE_UPPER, or CASE_NATURAL");
|
888
927
|
return Qfalse;
|
889
928
|
}
|
890
929
|
} else if (type == SQL_HANDLE_DBC) {
|
@@ -899,15 +938,15 @@ static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key,
|
|
899
938
|
((conn_handle*)handle)->c_case_mode = CASE_NATURAL;
|
900
939
|
break;
|
901
940
|
default:
|
902
|
-
|
941
|
+
*error = rb_str_new2("ATTR_CASE attribute must be one of CASE_LOWER, CASE_UPPER, or CASE_NATURAL");
|
903
942
|
return Qfalse;
|
904
943
|
}
|
905
944
|
} else {
|
906
|
-
|
945
|
+
*error = rb_str_new2("Connection or statement handle must be passed in");
|
907
946
|
return Qfalse;
|
908
947
|
}
|
909
948
|
} else if (type == SQL_HANDLE_STMT) {
|
910
|
-
handleAttr_args =
|
949
|
+
handleAttr_args = ALLOC( set_handle_attr_args );
|
911
950
|
memset(handleAttr_args,'\0',sizeof(struct _ibm_db_set_handle_attr_struct));
|
912
951
|
|
913
952
|
handleAttr_args->handle = &((stmt_handle *)handle)->hstmt;
|
@@ -927,7 +966,13 @@ static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key,
|
|
927
966
|
if ( rc == SQL_ERROR ) {
|
928
967
|
_ruby_ibm_db_check_sql_errors( handle, DB_STMT, (SQLHSTMT)((stmt_handle *)handle)->hstmt,
|
929
968
|
SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
930
|
-
|
969
|
+
ruby_xfree( handleAttr_args );
|
970
|
+
handleAttr_args = NULL;
|
971
|
+
if( handle != NULL && ((stmt_handle *)handle)->ruby_stmt_err_msg != NULL ) {
|
972
|
+
*error = rb_str_cat2(rb_str_new2("Setting of statement attribute failed: "), ((stmt_handle *)handle)->ruby_stmt_err_msg);
|
973
|
+
} else {
|
974
|
+
*error = rb_str_new2("Setting of statement attribute failed: <error message could not be retrieved>");
|
975
|
+
}
|
931
976
|
return Qfalse;
|
932
977
|
}
|
933
978
|
} else {
|
@@ -950,12 +995,18 @@ static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key,
|
|
950
995
|
if ( rc == SQL_ERROR ) {
|
951
996
|
_ruby_ibm_db_check_sql_errors( handle, DB_STMT, (SQLHSTMT)((stmt_handle *)handle)->hstmt,
|
952
997
|
SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
953
|
-
|
998
|
+
ruby_xfree( handleAttr_args );
|
999
|
+
handleAttr_args = NULL;
|
1000
|
+
if( handle != NULL && ((stmt_handle *)handle)->ruby_stmt_err_msg != NULL ) {
|
1001
|
+
*error = rb_str_cat2(rb_str_new2("Setting of statement attribute failed: "), ((stmt_handle *)handle)->ruby_stmt_err_msg);
|
1002
|
+
} else {
|
1003
|
+
*error = rb_str_new2("Setting of statement attribute failed: <error message could not be retrieved>");
|
1004
|
+
}
|
954
1005
|
return Qfalse;
|
955
1006
|
}
|
956
1007
|
}
|
957
1008
|
} else if (type == SQL_HANDLE_DBC) {
|
958
|
-
handleAttr_args =
|
1009
|
+
handleAttr_args = ALLOC( set_handle_attr_args );
|
959
1010
|
memset(handleAttr_args,'\0',sizeof(struct _ibm_db_set_handle_attr_struct));
|
960
1011
|
|
961
1012
|
handleAttr_args->handle = &((conn_handle*)handle)->hdbc;
|
@@ -975,7 +1026,13 @@ static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key,
|
|
975
1026
|
if ( rc == SQL_ERROR ) {
|
976
1027
|
_ruby_ibm_db_check_sql_errors( handle, DB_CONN, (SQLHDBC)((conn_handle *)handle)->hdbc,
|
977
1028
|
SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
978
|
-
|
1029
|
+
ruby_xfree( handleAttr_args );
|
1030
|
+
handleAttr_args = NULL;
|
1031
|
+
if( handle != NULL && ((conn_handle *)handle)->ruby_error_msg != NULL ) {
|
1032
|
+
*error = rb_str_cat2(rb_str_new2("Setting of connection attribute failed: "), ((conn_handle *)handle)->ruby_error_msg);
|
1033
|
+
} else {
|
1034
|
+
*error = rb_str_new2("Setting of connection attribute failed: <error message could not be retrieved>");
|
1035
|
+
}
|
979
1036
|
return Qfalse;
|
980
1037
|
}
|
981
1038
|
} else {
|
@@ -996,12 +1053,18 @@ static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key,
|
|
996
1053
|
if ( rc == SQL_ERROR ) {
|
997
1054
|
_ruby_ibm_db_check_sql_errors( handle, DB_CONN, (SQLHDBC)((conn_handle *)handle)->hdbc,
|
998
1055
|
SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0);
|
999
|
-
|
1056
|
+
ruby_xfree( handleAttr_args );
|
1057
|
+
handleAttr_args = NULL;
|
1058
|
+
if( handle != NULL && ((conn_handle *)handle)->ruby_error_msg != NULL ) {
|
1059
|
+
*error = rb_str_cat2(rb_str_new2("Setting of connection attribute failed: "), ((conn_handle *)handle)->ruby_error_msg);
|
1060
|
+
} else {
|
1061
|
+
*error = rb_str_new2("Setting of connection attribute failed: <error message could not be retrieved>");
|
1062
|
+
}
|
1000
1063
|
return Qfalse;
|
1001
1064
|
}
|
1002
1065
|
}
|
1003
1066
|
} else {
|
1004
|
-
|
1067
|
+
*error = rb_str_new2("Connection or statement handle must be passed in");
|
1005
1068
|
return Qfalse;
|
1006
1069
|
}
|
1007
1070
|
|
@@ -1015,9 +1078,9 @@ static VALUE _ruby_ibm_db_assign_options( void *handle, int type, long opt_key,
|
|
1015
1078
|
}
|
1016
1079
|
/* */
|
1017
1080
|
|
1018
|
-
/* static int _ruby_ibm_db_parse_options( VALUE options, int type, void *handle)
|
1081
|
+
/* static int _ruby_ibm_db_parse_options( VALUE options, int type, void *handle, VALUE *error)
|
1019
1082
|
*/
|
1020
|
-
static int _ruby_ibm_db_parse_options ( VALUE options, int type, void *handle,
|
1083
|
+
static int _ruby_ibm_db_parse_options ( VALUE options, int type, void *handle, VALUE *error )
|
1021
1084
|
{
|
1022
1085
|
int numOpts = 0, i = 0;
|
1023
1086
|
VALUE keys;
|
@@ -1061,12 +1124,12 @@ static int _ruby_ibm_db_parse_options ( VALUE options, int type, void *handle, c
|
|
1061
1124
|
static int _ruby_ibm_db_get_result_set_info(stmt_handle *stmt_res)
|
1062
1125
|
{
|
1063
1126
|
int rc = -1, i;
|
1064
|
-
SQLCHAR
|
1127
|
+
SQLCHAR tmp_name[BUFSIZ];
|
1065
1128
|
|
1066
1129
|
row_col_count_args *result_cols_args = NULL;
|
1067
1130
|
describecol_args *describecolargs = NULL;
|
1068
1131
|
|
1069
|
-
result_cols_args =
|
1132
|
+
result_cols_args = ALLOC( row_col_count_args );
|
1070
1133
|
memset(result_cols_args,'\0',sizeof(struct _ibm_db_row_col_count_struct));
|
1071
1134
|
|
1072
1135
|
result_cols_args->stmt_res = stmt_res;
|
@@ -1077,6 +1140,7 @@ static int _ruby_ibm_db_get_result_set_info(stmt_handle *stmt_res)
|
|
1077
1140
|
if ( rc == SQL_ERROR || result_cols_args->count == 0) {
|
1078
1141
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, (SQLHSTMT)stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
1079
1142
|
ruby_xfree( result_cols_args );
|
1143
|
+
result_cols_args = NULL;
|
1080
1144
|
return -1;
|
1081
1145
|
}
|
1082
1146
|
stmt_res->num_columns = result_cols_args->count;
|
@@ -1084,7 +1148,7 @@ static int _ruby_ibm_db_get_result_set_info(stmt_handle *stmt_res)
|
|
1084
1148
|
stmt_res->column_info = ALLOC_N(ibm_db_result_set_info, result_cols_args->count);
|
1085
1149
|
memset(stmt_res->column_info, 0, sizeof(ibm_db_result_set_info)*(result_cols_args->count));
|
1086
1150
|
|
1087
|
-
describecolargs =
|
1151
|
+
describecolargs = ALLOC( describecol_args );
|
1088
1152
|
memset(describecolargs,'\0',sizeof(struct _ibm_db_describecol_args_struct));
|
1089
1153
|
|
1090
1154
|
describecolargs->stmt_res = stmt_res;
|
@@ -1095,7 +1159,7 @@ static int _ruby_ibm_db_get_result_set_info(stmt_handle *stmt_res)
|
|
1095
1159
|
stmt_res->column_info[i].loc_ind = 0;
|
1096
1160
|
stmt_res->column_info[i].loc_type = 0;
|
1097
1161
|
|
1098
|
-
stmt_res->column_info[i].name =
|
1162
|
+
stmt_res->column_info[i].name = tmp_name;
|
1099
1163
|
memset(stmt_res->column_info[i].name, '\0', BUFSIZ);
|
1100
1164
|
|
1101
1165
|
describecolargs->col_no = i + 1;
|
@@ -1108,14 +1172,16 @@ static int _ruby_ibm_db_get_result_set_info(stmt_handle *stmt_res)
|
|
1108
1172
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, (SQLHSTMT)stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
1109
1173
|
ruby_xfree( result_cols_args );
|
1110
1174
|
ruby_xfree( describecolargs );
|
1175
|
+
ruby_xfree( stmt_res->column_info );
|
1176
|
+
result_cols_args = NULL;
|
1177
|
+
describecolargs = NULL;
|
1178
|
+
stmt_res->column_info = NULL;
|
1111
1179
|
return -1;
|
1112
1180
|
}
|
1113
1181
|
if ( describecolargs->name_length <= 0 ) {
|
1114
|
-
ruby_xfree( stmt_res->column_info[i].name );
|
1115
1182
|
stmt_res->column_info[i].name = (SQLCHAR *)estrdup("");
|
1116
1183
|
} else if ( describecolargs->name_length >= BUFSIZ ) {
|
1117
1184
|
/* column name is longer than BUFSIZ, free the previously allocate memory and reallocate new*/
|
1118
|
-
ruby_xfree( stmt_res->column_info[i].name );
|
1119
1185
|
|
1120
1186
|
stmt_res->column_info[i].name = (SQLCHAR*)ALLOC_N(char, describecolargs->name_length+1);
|
1121
1187
|
describecolargs->buff_length = describecolargs->name_length + 1;
|
@@ -1126,12 +1192,14 @@ static int _ruby_ibm_db_get_result_set_info(stmt_handle *stmt_res)
|
|
1126
1192
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, (SQLHSTMT)stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
1127
1193
|
ruby_xfree( describecolargs );
|
1128
1194
|
ruby_xfree( result_cols_args );
|
1195
|
+
ruby_xfree( stmt_res->column_info );
|
1196
|
+
result_cols_args = NULL;
|
1197
|
+
describecolargs = NULL;
|
1198
|
+
stmt_res->column_info = NULL;
|
1129
1199
|
return -1;
|
1130
1200
|
}
|
1131
1201
|
} else {
|
1132
|
-
|
1133
|
-
stmt_res->column_info[i].name = (SQLCHAR*) estrndup( (char *)tmp_name, describecolargs->name_length );
|
1134
|
-
ruby_xfree( tmp_name );
|
1202
|
+
stmt_res->column_info[i].name = (SQLCHAR*) estrdup( (char *)tmp_name );
|
1135
1203
|
}
|
1136
1204
|
}
|
1137
1205
|
|
@@ -1161,9 +1229,9 @@ static int _ruby_ibm_db_bind_column_helper(stmt_handle *stmt_res)
|
|
1161
1229
|
bind_col_args *bindCol_args = NULL;
|
1162
1230
|
|
1163
1231
|
stmt_res->row_data = ALLOC_N(ibm_db_row_type, stmt_res->num_columns);
|
1164
|
-
memset(stmt_res->row_data,0,sizeof(ibm_db_row_type)*stmt_res->num_columns);
|
1232
|
+
memset(stmt_res->row_data,'\0',sizeof(ibm_db_row_type)*stmt_res->num_columns);
|
1165
1233
|
|
1166
|
-
bindCol_args =
|
1234
|
+
bindCol_args = ALLOC( bind_col_args );
|
1167
1235
|
memset(bindCol_args,'\0',sizeof(struct _ibm_db_bind_col_struct));
|
1168
1236
|
|
1169
1237
|
bindCol_args->stmt_res = stmt_res;
|
@@ -1381,8 +1449,8 @@ static int _ruby_ibm_db_bind_column_helper(stmt_handle *stmt_res)
|
|
1381
1449
|
*/
|
1382
1450
|
static void _ruby_ibm_db_clear_stmt_err_cache()
|
1383
1451
|
{
|
1384
|
-
memset(IBM_DB_G(__ruby_stmt_err_msg), 0, DB2_MAX_ERR_MSG_LEN);
|
1385
|
-
memset(IBM_DB_G(__ruby_stmt_err_state), 0, SQL_SQLSTATE_SIZE + 1);
|
1452
|
+
memset(IBM_DB_G(__ruby_stmt_err_msg), '\0', DB2_MAX_ERR_MSG_LEN);
|
1453
|
+
memset(IBM_DB_G(__ruby_stmt_err_state), '\0', SQL_SQLSTATE_SIZE + 1);
|
1386
1454
|
}
|
1387
1455
|
|
1388
1456
|
/* static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data )
|
@@ -1397,7 +1465,7 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1397
1465
|
connect_args *conn_args = data->conn_args;
|
1398
1466
|
VALUE *options = data->options;
|
1399
1467
|
int isPersistent = data->isPersistent;
|
1400
|
-
|
1468
|
+
VALUE *error = data->error;
|
1401
1469
|
|
1402
1470
|
int rc = 0;
|
1403
1471
|
int reused = 0;
|
@@ -1412,7 +1480,7 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1412
1480
|
|
1413
1481
|
conn_alive = 1;
|
1414
1482
|
|
1415
|
-
handleAttr_args =
|
1483
|
+
handleAttr_args = ALLOC( set_handle_attr_args );
|
1416
1484
|
memset(handleAttr_args,'\0',sizeof(struct _ibm_db_set_handle_attr_struct));
|
1417
1485
|
|
1418
1486
|
do {
|
@@ -1427,7 +1495,7 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1427
1495
|
Data_Get_Struct(entry, conn_handle, conn_res);
|
1428
1496
|
#ifndef PASE /* i5/OS server mode is persistant */
|
1429
1497
|
/* Need to reinitialize connection? */
|
1430
|
-
get_handleAttr_args =
|
1498
|
+
get_handleAttr_args = ALLOC( get_handle_attr_args );
|
1431
1499
|
memset(get_handleAttr_args,'\0',sizeof(struct _ibm_db_get_handle_attr_struct));
|
1432
1500
|
|
1433
1501
|
get_handleAttr_args->handle = &( conn_res->hdbc );
|
@@ -1439,6 +1507,7 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1439
1507
|
rc = _ruby_ibm_db_SQLGetConnectAttr_helper( get_handleAttr_args );
|
1440
1508
|
|
1441
1509
|
ruby_xfree( get_handleAttr_args );
|
1510
|
+
get_handleAttr_args = NULL;
|
1442
1511
|
|
1443
1512
|
if ( (rc == SQL_SUCCESS) && conn_alive ) {
|
1444
1513
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
@@ -1453,9 +1522,12 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1453
1522
|
|
1454
1523
|
if ( conn_res == NULL ) {
|
1455
1524
|
conn_res = ALLOC(conn_handle);
|
1456
|
-
memset(conn_res, 0, sizeof(conn_handle));
|
1525
|
+
memset(conn_res, '\0', sizeof(conn_handle));
|
1457
1526
|
}
|
1458
1527
|
|
1528
|
+
/* handle not active as of yet */
|
1529
|
+
conn_res->handle_active = 0;
|
1530
|
+
|
1459
1531
|
/* We need to set this early, in case we get an error below,
|
1460
1532
|
so we know how to free the connection */
|
1461
1533
|
conn_res->flag_pconnect = isPersistent;
|
@@ -1469,7 +1541,12 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1469
1541
|
if (rc != SQL_SUCCESS) {
|
1470
1542
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->henv, SQL_HANDLE_ENV, rc, 1, NULL, -1, 1, 0 );
|
1471
1543
|
ruby_xfree( handleAttr_args );
|
1472
|
-
|
1544
|
+
handleAttr_args = NULL;
|
1545
|
+
if( conn_res != NULL && conn_res->ruby_error_msg != NULL ) {
|
1546
|
+
*error = rb_str_cat2(rb_str_new2("Allocation of environment handle failed: "), conn_res->ruby_error_msg);
|
1547
|
+
} else {
|
1548
|
+
*error = rb_str_new2("Allocation of environment handle failed: <error message could not be retrieved>");
|
1549
|
+
}
|
1473
1550
|
return Qnil;
|
1474
1551
|
break;
|
1475
1552
|
}
|
@@ -1490,8 +1567,14 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1490
1567
|
|
1491
1568
|
if (rc != SQL_SUCCESS) {
|
1492
1569
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->henv, SQL_HANDLE_ENV, rc, 1, NULL, -1, 1, 0 );
|
1493
|
-
|
1570
|
+
if( conn_res != NULL && conn_res->ruby_error_msg != NULL ) {
|
1571
|
+
*error = rb_str_cat2(rb_str_new2("Setting of Environemnt Attribute during connection failed: "),conn_res->ruby_error_msg);
|
1572
|
+
} else {
|
1573
|
+
*error = rb_str_new2("Setting of Environemnt Attribute during connection failed: <error message could not be retrieved>");
|
1574
|
+
}
|
1494
1575
|
ruby_xfree( handleAttr_args );
|
1576
|
+
handleAttr_args = NULL;
|
1577
|
+
rc = SQLFreeHandle(SQL_HANDLE_ENV, conn_res->henv );
|
1495
1578
|
_ruby_ibm_db_free_conn_struct( conn_res );
|
1496
1579
|
return Qnil;
|
1497
1580
|
break;
|
@@ -1503,8 +1586,14 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1503
1586
|
rc = SQLAllocHandle( SQL_HANDLE_DBC, conn_res->henv, &(conn_res->hdbc) );
|
1504
1587
|
if (rc != SQL_SUCCESS) {
|
1505
1588
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->henv, SQL_HANDLE_ENV, rc, 1, NULL, -1, 1, 0 );
|
1506
|
-
|
1589
|
+
if( conn_res != NULL && conn_res->ruby_error_msg != NULL ) {
|
1590
|
+
*error = rb_str_cat2(rb_str_new2("Allocation of connection handle failed: "),conn_res->ruby_error_msg);
|
1591
|
+
} else {
|
1592
|
+
*error = rb_str_new2("Allocation of connection handle failed: <error message could not be retrieved>");
|
1593
|
+
}
|
1507
1594
|
ruby_xfree( handleAttr_args );
|
1595
|
+
handleAttr_args = NULL;
|
1596
|
+
rc = SQLFreeHandle(SQL_HANDLE_ENV, conn_res->henv );
|
1508
1597
|
_ruby_ibm_db_free_conn_struct( conn_res );
|
1509
1598
|
return Qnil;
|
1510
1599
|
break;
|
@@ -1554,14 +1643,14 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1554
1643
|
|
1555
1644
|
conn_res->errorType = 1;
|
1556
1645
|
|
1557
|
-
/* handle not active as of yet */
|
1558
|
-
conn_res->handle_active = 0;
|
1559
|
-
|
1560
1646
|
/* Set Options */
|
1561
1647
|
if ( !NIL_P(*options) ) {
|
1562
1648
|
rc = _ruby_ibm_db_parse_options( *options, SQL_HANDLE_DBC, conn_res, error );
|
1563
1649
|
if (rc != SQL_SUCCESS) {
|
1564
1650
|
ruby_xfree( handleAttr_args );
|
1651
|
+
handleAttr_args = NULL;
|
1652
|
+
rc = SQLFreeHandle(SQL_HANDLE_DBC, conn_res->hdbc );
|
1653
|
+
rc = SQLFreeHandle(SQL_HANDLE_ENV, conn_res->henv );
|
1565
1654
|
_ruby_ibm_db_free_conn_struct( conn_res );
|
1566
1655
|
return Qnil;
|
1567
1656
|
}
|
@@ -1582,8 +1671,13 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1582
1671
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
1583
1672
|
SQLFreeHandle( SQL_HANDLE_DBC, conn_res->hdbc );
|
1584
1673
|
SQLFreeHandle( SQL_HANDLE_ENV, conn_res->henv );
|
1585
|
-
|
1674
|
+
if( conn_res != NULL && conn_res->ruby_error_msg != NULL ) {
|
1675
|
+
*error = rb_str_cat2(rb_str_new2("Connection failed: "),conn_res->ruby_error_msg);
|
1676
|
+
} else {
|
1677
|
+
*error = rb_str_new2("Connection failed: <error message could not be retrieved>");
|
1678
|
+
}
|
1586
1679
|
ruby_xfree( handleAttr_args );
|
1680
|
+
handleAttr_args = NULL;
|
1587
1681
|
_ruby_ibm_db_free_conn_struct( conn_res );
|
1588
1682
|
return Qnil;
|
1589
1683
|
break;
|
@@ -1604,7 +1698,7 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1604
1698
|
server = ALLOC_N(char, 2048);
|
1605
1699
|
memset(server, 0, sizeof(server));
|
1606
1700
|
|
1607
|
-
getInfo_args =
|
1701
|
+
getInfo_args = ALLOC( get_info_args );
|
1608
1702
|
memset(getInfo_args,'\0',sizeof(struct _ibm_db_get_info_struct));
|
1609
1703
|
|
1610
1704
|
getInfo_args->conn_res = conn_res;
|
@@ -1624,6 +1718,10 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1624
1718
|
|
1625
1719
|
ruby_xfree( getInfo_args );
|
1626
1720
|
ruby_xfree( server );
|
1721
|
+
getInfo_args = NULL;
|
1722
|
+
server = NULL;
|
1723
|
+
|
1724
|
+
rc = SQL_SUCCESS; /*Setting rc to SQL_SUCCESS, because the below block may or may not be executed*/
|
1627
1725
|
|
1628
1726
|
/* Set SQL_ATTR_REPLACE_QUOTED_LITERALS connection attribute to
|
1629
1727
|
* enable CLI numeric literal feature. This is equivalent to
|
@@ -1634,7 +1732,7 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1634
1732
|
*/
|
1635
1733
|
#ifndef PASE
|
1636
1734
|
/* Only enable this feature if we are not connected to an Informix data server */
|
1637
|
-
if (!is_informix) {
|
1735
|
+
if (!is_informix && data->literal_replacement == SET_QUOTED_LITERAL_REPLACEMENT_ON ) {
|
1638
1736
|
handleAttr_args->handle = &( conn_res->hdbc );
|
1639
1737
|
handleAttr_args->strLength = SQL_IS_INTEGER;
|
1640
1738
|
handleAttr_args->attribute = SQL_ATTR_REPLACE_QUOTED_LITERALS;
|
@@ -1648,7 +1746,7 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1648
1746
|
}
|
1649
1747
|
#else
|
1650
1748
|
/* Only enable this feature if we are not connected to an Informix data server */
|
1651
|
-
if (!is_informix) {
|
1749
|
+
if (!is_informix && data->literal_replacement == SET_QUOTED_LITERAL_REPLACEMENT_ON ) {
|
1652
1750
|
handleAttr_args->handle = &( conn_res->hdbc );
|
1653
1751
|
handleAttr_args->strLength = SQL_IS_INTEGER;
|
1654
1752
|
handleAttr_args->attribute = SQL_ATTR_REPLACE_QUOTED_LITERALS;
|
@@ -1682,15 +1780,18 @@ static VALUE _ruby_ibm_db_connect_helper2( connect_helper_args *data ) {
|
|
1682
1780
|
rb_hash_aset(persistent_list, rb_str_new2(hKey), entry);
|
1683
1781
|
}
|
1684
1782
|
ruby_xfree( hKey );
|
1783
|
+
hKey = NULL;
|
1685
1784
|
}
|
1686
1785
|
|
1687
1786
|
if ( rc < SQL_SUCCESS ) {
|
1688
1787
|
if (conn_res != NULL && conn_res->handle_active) {
|
1689
1788
|
rc = SQLFreeHandle( SQL_HANDLE_DBC, conn_res->hdbc);
|
1789
|
+
rc = SQLFreeHandle(SQL_HANDLE_ENV, conn_res->henv );
|
1690
1790
|
}
|
1691
1791
|
|
1692
1792
|
/* free memory */
|
1693
1793
|
if (conn_res != NULL) {
|
1794
|
+
conn_res->handle_active = 0;
|
1694
1795
|
_ruby_ibm_db_free_conn_struct(conn_res);
|
1695
1796
|
}
|
1696
1797
|
|
@@ -1718,28 +1819,34 @@ static VALUE _ruby_ibm_db_connect_helper( int argc, VALUE *argv, int isPersisten
|
|
1718
1819
|
connect_helper_args *helper_args = NULL;
|
1719
1820
|
|
1720
1821
|
VALUE r_db, r_uid, r_passwd, options,return_value;
|
1822
|
+
VALUE r_literal_replacement = Qnil;
|
1721
1823
|
|
1722
|
-
|
1824
|
+
VALUE error = Qnil;
|
1723
1825
|
|
1724
|
-
rb_scan_args(argc, argv, "
|
1826
|
+
rb_scan_args(argc, argv, "32", &r_db, &r_uid, &r_passwd, &options, &r_literal_replacement );
|
1725
1827
|
|
1726
|
-
memset( error,'\0',DB2_MAX_ERR_MSG_LEN + 28 );
|
1727
1828
|
/* Allocate the mwmory for necessary components */
|
1728
1829
|
|
1729
|
-
conn_args =
|
1830
|
+
conn_args = ALLOC( connect_args );
|
1730
1831
|
memset(conn_args,'\0',sizeof(struct _ibm_db_connect_args_struct));
|
1731
1832
|
|
1732
1833
|
conn_args->database = rb_str2cstr(r_db, &(conn_args->database_len));
|
1733
1834
|
conn_args->uid = rb_str2cstr(r_uid, &(conn_args->uid_len));
|
1734
1835
|
conn_args->password = rb_str2cstr(r_passwd, &(conn_args->password_len));
|
1735
1836
|
|
1736
|
-
helper_args =
|
1837
|
+
helper_args = ALLOC( connect_helper_args );
|
1737
1838
|
memset(helper_args,'\0',sizeof(struct _ibm_db_connect_helper_args_struct));
|
1738
1839
|
|
1739
|
-
helper_args->conn_args
|
1740
|
-
helper_args->isPersistent
|
1741
|
-
helper_args->options
|
1742
|
-
helper_args->error
|
1840
|
+
helper_args->conn_args = conn_args;
|
1841
|
+
helper_args->isPersistent = isPersistent;
|
1842
|
+
helper_args->options = &options;
|
1843
|
+
helper_args->error = &error;
|
1844
|
+
|
1845
|
+
if( !NIL_P(r_literal_replacement) ) {
|
1846
|
+
helper_args->literal_replacement = NUM2INT(r_literal_replacement);
|
1847
|
+
} else {
|
1848
|
+
helper_args->literal_replacement = SET_QUOTED_LITERAL_REPLACEMENT_ON; /*QUOTED LITERAL replacemnt is ON by default*/
|
1849
|
+
}
|
1743
1850
|
|
1744
1851
|
/* Call the function where the actual logic is being run*/
|
1745
1852
|
#ifdef GIL_RELEASE_VERSION
|
@@ -1751,7 +1858,7 @@ static VALUE _ruby_ibm_db_connect_helper( int argc, VALUE *argv, int isPersisten
|
|
1751
1858
|
|
1752
1859
|
/* Free the memory allocated */
|
1753
1860
|
if(conn_args != NULL) {
|
1754
|
-
/* Memory to structure elements is not allocated explicitly hence it is automatically freed by Ruby
|
1861
|
+
/* Memory to structure elements of helper_args is not allocated explicitly hence it is automatically freed by Ruby.
|
1755
1862
|
Dont try to explicitly free it, else a double free exception is thrown and the application will crash
|
1756
1863
|
with memory dump.
|
1757
1864
|
*/
|
@@ -1766,7 +1873,7 @@ static VALUE _ruby_ibm_db_connect_helper( int argc, VALUE *argv, int isPersisten
|
|
1766
1873
|
}
|
1767
1874
|
|
1768
1875
|
if( return_value == Qnil ){
|
1769
|
-
rb_throw( error, Qnil );
|
1876
|
+
rb_throw( RSTRING_PTR(error), Qnil );
|
1770
1877
|
}
|
1771
1878
|
return return_value;
|
1772
1879
|
}
|
@@ -1788,7 +1895,7 @@ static int _ruby_ibm_db_set_decfloat_rounding_mode_client_helper(_rounding_mode
|
|
1788
1895
|
|
1789
1896
|
SQLCHAR *stmt = (SQLCHAR *)"values current decfloat rounding mode";
|
1790
1897
|
|
1791
|
-
exec_direct_args =
|
1898
|
+
exec_direct_args = ALLOC( exec_cum_prepare_args );
|
1792
1899
|
memset(exec_direct_args,'\0',sizeof(struct _ibm_db_exec_direct_args_struct));
|
1793
1900
|
|
1794
1901
|
exec_direct_args->stmt_string = stmt;
|
@@ -1799,15 +1906,15 @@ static int _ruby_ibm_db_set_decfloat_rounding_mode_client_helper(_rounding_mode
|
|
1799
1906
|
|
1800
1907
|
if ( rc == SQL_ERROR ) {
|
1801
1908
|
if( conn_res->ruby_error_msg == NULL){
|
1802
|
-
conn_res->ruby_error_msg = ALLOC_N( char, DB2_MAX_ERR_MSG_LEN );
|
1909
|
+
conn_res->ruby_error_msg = ALLOC_N( char, DB2_MAX_ERR_MSG_LEN+1 );
|
1803
1910
|
}
|
1804
|
-
memset(conn_res->ruby_error_msg, '\0', DB2_MAX_ERR_MSG_LEN );
|
1911
|
+
memset(conn_res->ruby_error_msg, '\0', DB2_MAX_ERR_MSG_LEN+1 );
|
1805
1912
|
|
1806
1913
|
_ruby_ibm_db_check_sql_errors( conn_res , DB_CONN, (SQLHSTMT) rnd_mode->stmt_res->hstmt,
|
1807
1914
|
SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
1808
1915
|
} else {
|
1809
1916
|
|
1810
|
-
bindCol_args =
|
1917
|
+
bindCol_args = ALLOC( bind_col_args );
|
1811
1918
|
memset(bindCol_args,'\0',sizeof(struct _ibm_db_bind_col_struct));
|
1812
1919
|
|
1813
1920
|
bindCol_args->stmt_res = rnd_mode->stmt_res;
|
@@ -1821,16 +1928,16 @@ static int _ruby_ibm_db_set_decfloat_rounding_mode_client_helper(_rounding_mode
|
|
1821
1928
|
|
1822
1929
|
if ( rc == SQL_ERROR ) {
|
1823
1930
|
if( conn_res->ruby_error_msg == NULL){
|
1824
|
-
conn_res->ruby_error_msg = ALLOC_N( char, DB2_MAX_ERR_MSG_LEN );
|
1931
|
+
conn_res->ruby_error_msg = ALLOC_N( char, DB2_MAX_ERR_MSG_LEN+1 );
|
1825
1932
|
}
|
1826
|
-
memset(conn_res->ruby_error_msg, '\0', DB2_MAX_ERR_MSG_LEN );
|
1933
|
+
memset(conn_res->ruby_error_msg, '\0', DB2_MAX_ERR_MSG_LEN+1 );
|
1827
1934
|
|
1828
1935
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, (SQLHSTMT)rnd_mode->stmt_res->hstmt,
|
1829
1936
|
SQL_HANDLE_STMT, rc, 1, NULL ,-1, 1, 0);
|
1830
1937
|
|
1831
1938
|
} else {
|
1832
1939
|
|
1833
|
-
fetch_args =
|
1940
|
+
fetch_args = ALLOC( fetch_data_args );
|
1834
1941
|
memset(fetch_args,'\0',sizeof(struct _ibm_db_fetch_data_struct));
|
1835
1942
|
|
1836
1943
|
fetch_args->stmt_res = rnd_mode->stmt_res;
|
@@ -1839,9 +1946,9 @@ static int _ruby_ibm_db_set_decfloat_rounding_mode_client_helper(_rounding_mode
|
|
1839
1946
|
|
1840
1947
|
if ( rc == SQL_ERROR ) {
|
1841
1948
|
if( conn_res->ruby_error_msg == NULL){
|
1842
|
-
conn_res->ruby_error_msg = ALLOC_N( char, DB2_MAX_ERR_MSG_LEN );
|
1949
|
+
conn_res->ruby_error_msg = ALLOC_N( char, DB2_MAX_ERR_MSG_LEN+1 );
|
1843
1950
|
}
|
1844
|
-
memset(conn_res->ruby_error_msg, '\0', DB2_MAX_ERR_MSG_LEN );
|
1951
|
+
memset(conn_res->ruby_error_msg, '\0', DB2_MAX_ERR_MSG_LEN+1 );
|
1845
1952
|
|
1846
1953
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, (SQLHSTMT) rnd_mode->stmt_res->hstmt,
|
1847
1954
|
SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
@@ -1892,7 +1999,7 @@ static int _ruby_ibm_db_set_decfloat_rounding_mode_client( set_handle_attr_args
|
|
1892
1999
|
|
1893
2000
|
SQLHANDLE hdbc = *(data->handle);
|
1894
2001
|
|
1895
|
-
rnd_mode =
|
2002
|
+
rnd_mode = ALLOC( _rounding_mode );
|
1896
2003
|
memset(rnd_mode,'\0',sizeof(struct _rounding_mode_struct));
|
1897
2004
|
|
1898
2005
|
stmt_res = _ibm_db_new_stmt_struct(conn_res);
|
@@ -1903,12 +2010,20 @@ static int _ruby_ibm_db_set_decfloat_rounding_mode_client( set_handle_attr_args
|
|
1903
2010
|
if (rc == SQL_ERROR) {
|
1904
2011
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, hdbc, SQL_HANDLE_DBC, rc, 1,
|
1905
2012
|
NULL, -1, 1, 0 );
|
2013
|
+
ruby_xfree( rnd_mode );
|
2014
|
+
ruby_xfree( stmt_res );
|
2015
|
+
rnd_mode = NULL;
|
2016
|
+
stmt_res = NULL;
|
1906
2017
|
return rc;
|
1907
2018
|
}
|
1908
2019
|
|
2020
|
+
rnd_mode->stmt_res = stmt_res;
|
2021
|
+
|
1909
2022
|
_ruby_ibm_db_set_decfloat_rounding_mode_client_helper(rnd_mode, conn_res);
|
1910
2023
|
|
1911
2024
|
_ruby_ibm_db_free_stmt_struct( rnd_mode->stmt_res );
|
2025
|
+
rnd_mode->stmt_res = NULL;
|
2026
|
+
stmt_res = NULL;
|
1912
2027
|
|
1913
2028
|
data->strLength = SQL_NTS;
|
1914
2029
|
data->attribute = SQL_ATTR_DECFLOAT_ROUNDING_MODE;
|
@@ -1921,6 +2036,9 @@ static int _ruby_ibm_db_set_decfloat_rounding_mode_client( set_handle_attr_args
|
|
1921
2036
|
|
1922
2037
|
rc = _ruby_ibm_db_SQLSetConnectAttr_helper( data );
|
1923
2038
|
|
2039
|
+
ruby_xfree( rnd_mode );
|
2040
|
+
rnd_mode = NULL;
|
2041
|
+
|
1924
2042
|
return rc;
|
1925
2043
|
}
|
1926
2044
|
#endif
|
@@ -1933,8 +2051,8 @@ static int _ruby_ibm_db_set_decfloat_rounding_mode_client( set_handle_attr_args
|
|
1933
2051
|
static void _ruby_ibm_db_clear_conn_err_cache()
|
1934
2052
|
{
|
1935
2053
|
/* Clear out the cached conn messages */
|
1936
|
-
memset(IBM_DB_G(__ruby_conn_err_msg), 0, DB2_MAX_ERR_MSG_LEN);
|
1937
|
-
memset(IBM_DB_G(__ruby_conn_err_state), 0, SQL_SQLSTATE_SIZE + 1);
|
2054
|
+
memset(IBM_DB_G(__ruby_conn_err_msg), '\0', DB2_MAX_ERR_MSG_LEN);
|
2055
|
+
memset(IBM_DB_G(__ruby_conn_err_state), '\0', SQL_SQLSTATE_SIZE + 1);
|
1938
2056
|
}
|
1939
2057
|
/* */
|
1940
2058
|
|
@@ -1942,7 +2060,7 @@ static void _ruby_ibm_db_clear_conn_err_cache()
|
|
1942
2060
|
*
|
1943
2061
|
* ===Description
|
1944
2062
|
*
|
1945
|
-
* resource IBM_DB.connect ( string database, string username, string password [, array options] )
|
2063
|
+
* resource IBM_DB.connect ( string database, string username, string password [, array options, int set_replace_quoted_literal] )
|
1946
2064
|
*
|
1947
2065
|
* Creates a new connection to an IBM DB2 Universal Database, IBM Cloudscape, or Apache Derby database.
|
1948
2066
|
* ==Parameters
|
@@ -1983,6 +2101,12 @@ static void _ruby_ibm_db_clear_conn_err_cache()
|
|
1983
2101
|
* Passing the SQL_CURSOR_KEYSET_DRIVEN value specifies a scrollable cursor for a statement resource.
|
1984
2102
|
* This mode enables random access to rows in a result set, but currently is supported
|
1985
2103
|
* only by IBM DB2 Universal Database.
|
2104
|
+
* ====<em>set_replace_quoted_literal</em>
|
2105
|
+
* This variable indicates if the CLI Connection attribute SQL_ATTR_REPLACE_QUOTED_LITERAL is to be set or not
|
2106
|
+
* To turn it ON pass IBM_DB::SET_QUOTED_LITERAL_REPLACEMENT_ON
|
2107
|
+
* To turn it OFF pass IBM_DB::SET_QUOTED_LITERAL_REPLACEMENT_OFF
|
2108
|
+
*
|
2109
|
+
* Default Setting: - IBM_DB::SET_QUOTED_LITERAL_REPLACEMENT_ON
|
1986
2110
|
*
|
1987
2111
|
* ==Return Values
|
1988
2112
|
* Returns a connection handle resource if the connection attempt is successful.
|
@@ -2001,7 +2125,7 @@ VALUE ibm_db_connect(int argc, VALUE *argv, VALUE self)
|
|
2001
2125
|
* IBM_DB.pconnect -- Returns a persistent connection to a database
|
2002
2126
|
*
|
2003
2127
|
* ===Description
|
2004
|
-
* resource IBM_DB.pconnect ( string database, string username, string password [, array options] )
|
2128
|
+
* resource IBM_DB.pconnect ( string database, string username, string password [, array options, int set_replace_quoted_literal] )
|
2005
2129
|
*
|
2006
2130
|
* Returns a persistent connection to an IBM DB2 Universal Database, IBM Cloudscape,
|
2007
2131
|
* or Apache Derby database.
|
@@ -2039,6 +2163,12 @@ VALUE ibm_db_connect(int argc, VALUE *argv, VALUE self)
|
|
2039
2163
|
* Passing the SQL_CURSOR_KEYSET_DRIVEN value specifies a scrollable cursor for a statement resource.
|
2040
2164
|
* This mode enables random access to rows in a result set, but currently is supported only
|
2041
2165
|
* by IBM DB2 Universal Database.
|
2166
|
+
* ====<em>set_replace_quoted_literal</em>
|
2167
|
+
* This variable indicates if the CLI Connection attribute SQL_ATTR_REPLACE_QUOTED_LITERAL is to be set or not
|
2168
|
+
* To turn it ON pass IBM_DB::SET_QUOTED_LITERAL_REPLACEMENT_ON
|
2169
|
+
* To turn it OFF pass IBM_DB::SET_QUOTED_LITERAL_REPLACEMENT_OFF
|
2170
|
+
*
|
2171
|
+
* Default Setting: - IBM_DB::SET_QUOTED_LITERAL_REPLACEMENT_ON
|
2042
2172
|
*
|
2043
2173
|
* ===Return Values
|
2044
2174
|
*
|
@@ -2112,7 +2242,7 @@ VALUE ibm_db_autocommit(int argc, VALUE *argv, VALUE self)
|
|
2112
2242
|
if (argc == 2) {
|
2113
2243
|
autocommit = FIX2INT(value);
|
2114
2244
|
if(autocommit != (conn_res->auto_commit)) {
|
2115
|
-
handleAttr_args =
|
2245
|
+
handleAttr_args = ALLOC( set_handle_attr_args );
|
2116
2246
|
memset(handleAttr_args,'\0',sizeof(struct _ibm_db_set_handle_attr_struct));
|
2117
2247
|
|
2118
2248
|
handleAttr_args->handle = &( conn_res->hdbc );
|
@@ -2166,7 +2296,7 @@ static void _ruby_ibm_db_add_param_cache( stmt_handle *stmt_res, int param_no, c
|
|
2166
2296
|
if ( curr == NULL || curr->param_num != param_no ) {
|
2167
2297
|
/* Allocate memory and make new node to be added */
|
2168
2298
|
tmp_curr = ALLOC(param_node);
|
2169
|
-
memset(tmp_curr, 0, sizeof(param_node));
|
2299
|
+
memset(tmp_curr, '\0', sizeof(param_node));
|
2170
2300
|
|
2171
2301
|
/* assign values */
|
2172
2302
|
tmp_curr->data_type = data_type;
|
@@ -2177,6 +2307,8 @@ static void _ruby_ibm_db_add_param_cache( stmt_handle *stmt_res, int param_no, c
|
|
2177
2307
|
tmp_curr->file_options = SQL_FILE_READ;
|
2178
2308
|
tmp_curr->param_type = param_type;
|
2179
2309
|
tmp_curr->size = size;
|
2310
|
+
tmp_curr->varname = NULL;
|
2311
|
+
tmp_curr->svalue = NULL;
|
2180
2312
|
|
2181
2313
|
/* Set this flag in stmt_res if a FILE INPUT is present */
|
2182
2314
|
if ( param_type == PARAM_FILE) {
|
@@ -2209,6 +2341,16 @@ static void _ruby_ibm_db_add_param_cache( stmt_handle *stmt_res, int param_no, c
|
|
2209
2341
|
curr->param_type = param_type;
|
2210
2342
|
curr->size = size;
|
2211
2343
|
|
2344
|
+
if( curr->varname != NULL ) {
|
2345
|
+
ruby_xfree( curr->varname );
|
2346
|
+
}
|
2347
|
+
curr->varname = NULL;
|
2348
|
+
|
2349
|
+
if( curr->svalue != NULL ) {
|
2350
|
+
ruby_xfree( curr->svalue );
|
2351
|
+
}
|
2352
|
+
curr->svalue = NULL;
|
2353
|
+
|
2212
2354
|
/* Set this flag in stmt_res if a FILE INPUT is present */
|
2213
2355
|
if ( param_type == PARAM_FILE) {
|
2214
2356
|
stmt_res->file_param = 1;
|
@@ -2218,7 +2360,6 @@ static void _ruby_ibm_db_add_param_cache( stmt_handle *stmt_res, int param_no, c
|
|
2218
2360
|
/* Var lengths can be variable and different in both cases. */
|
2219
2361
|
/* This shouldn't happen often anyway */
|
2220
2362
|
if ( varname != NULL) {
|
2221
|
-
ruby_xfree( curr->varname );
|
2222
2363
|
curr->varname = estrndup(varname, varname_len);
|
2223
2364
|
}
|
2224
2365
|
}
|
@@ -2233,7 +2374,6 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
2233
2374
|
int rc = 0;
|
2234
2375
|
VALUE return_value = Qtrue;
|
2235
2376
|
|
2236
|
-
char error[DB2_MAX_ERR_MSG_LEN + 13];
|
2237
2377
|
|
2238
2378
|
/* Check for Param options */
|
2239
2379
|
switch (argc) {
|
@@ -2250,8 +2390,7 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
2250
2390
|
|
2251
2391
|
if ( rc == SQL_ERROR ) {
|
2252
2392
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
2253
|
-
|
2254
|
-
rb_warn( error );
|
2393
|
+
rb_warn("Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
|
2255
2394
|
return_value = Qfalse;
|
2256
2395
|
break;
|
2257
2396
|
}
|
@@ -2272,8 +2411,7 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
2272
2411
|
|
2273
2412
|
if ( rc == SQL_ERROR ) {
|
2274
2413
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
2275
|
-
|
2276
|
-
rb_warn( error );
|
2414
|
+
rb_warn("Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
|
2277
2415
|
return_value = Qfalse;
|
2278
2416
|
break;
|
2279
2417
|
}
|
@@ -2294,8 +2432,7 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
2294
2432
|
|
2295
2433
|
if ( rc == SQL_ERROR ) {
|
2296
2434
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
2297
|
-
|
2298
|
-
rb_warn( error );
|
2435
|
+
rb_warn("Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
|
2299
2436
|
return_value = Qfalse;
|
2300
2437
|
break;
|
2301
2438
|
}
|
@@ -2317,8 +2454,7 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
2317
2454
|
|
2318
2455
|
if ( rc == SQL_ERROR ) {
|
2319
2456
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
2320
|
-
|
2321
|
-
rb_warn( error );
|
2457
|
+
rb_warn("Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
|
2322
2458
|
return_value = Qfalse;
|
2323
2459
|
break;
|
2324
2460
|
}
|
@@ -2445,7 +2581,7 @@ VALUE ibm_db_bind_param(int argc, VALUE *argv, VALUE self)
|
|
2445
2581
|
if (!NIL_P(stmt)) {
|
2446
2582
|
Data_Get_Struct(stmt, stmt_handle, stmt_res);
|
2447
2583
|
|
2448
|
-
desc_param_args =
|
2584
|
+
desc_param_args = ALLOC( describeparam_args );
|
2449
2585
|
memset(desc_param_args,'\0',sizeof(struct _ibm_db_describeparam_args_struct));
|
2450
2586
|
|
2451
2587
|
desc_param_args->param_no = NUM2INT(r_param_no);
|
@@ -2515,7 +2651,7 @@ VALUE ibm_db_close(int argc, VALUE *argv, VALUE self)
|
|
2515
2651
|
if ( conn_res->handle_active && !conn_res->flag_pconnect ) {
|
2516
2652
|
/* Disconnect from DB. If stmt is allocated, it is freed automatically */
|
2517
2653
|
if (conn_res->auto_commit == 0) {
|
2518
|
-
end_X_args =
|
2654
|
+
end_X_args = ALLOC( end_tran_args );
|
2519
2655
|
memset(end_X_args,'\0',sizeof(struct _ibm_db_end_tran_args_struct));
|
2520
2656
|
|
2521
2657
|
end_X_args->hdbc = &(conn_res->hdbc);
|
@@ -2561,6 +2697,8 @@ VALUE ibm_db_close(int argc, VALUE *argv, VALUE self)
|
|
2561
2697
|
|
2562
2698
|
connection = Qnil;
|
2563
2699
|
|
2700
|
+
rc = SQLFreeHandle(SQL_HANDLE_ENV, conn_res->henv );
|
2701
|
+
|
2564
2702
|
return_value = Qtrue;
|
2565
2703
|
}
|
2566
2704
|
}
|
@@ -2638,7 +2776,7 @@ VALUE ibm_db_column_privileges(int argc, VALUE *argv, VALUE self)
|
|
2638
2776
|
rb_scan_args(argc, argv, "14", &connection,
|
2639
2777
|
&r_qualifier, &r_owner, &r_table_name, &r_column_name);
|
2640
2778
|
|
2641
|
-
col_privileges_args =
|
2779
|
+
col_privileges_args = ALLOC( metadata_args );
|
2642
2780
|
memset(col_privileges_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
2643
2781
|
|
2644
2782
|
col_privileges_args->qualifier = NULL;
|
@@ -2688,6 +2826,7 @@ VALUE ibm_db_column_privileges(int argc, VALUE *argv, VALUE self)
|
|
2688
2826
|
NULL, -1, 1, 1 );
|
2689
2827
|
|
2690
2828
|
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
2829
|
+
stmt_res = NULL;
|
2691
2830
|
|
2692
2831
|
return_value = Qfalse;
|
2693
2832
|
} else {
|
@@ -2778,7 +2917,7 @@ VALUE ibm_db_columns(int argc, VALUE *argv, VALUE self)
|
|
2778
2917
|
rb_scan_args(argc, argv, "14", &connection,
|
2779
2918
|
&r_qualifier, &r_owner, &r_table_name, &r_column_name);
|
2780
2919
|
|
2781
|
-
col_metadata_args =
|
2920
|
+
col_metadata_args = ALLOC( metadata_args );
|
2782
2921
|
memset(col_metadata_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
2783
2922
|
|
2784
2923
|
col_metadata_args->qualifier = NULL;
|
@@ -2798,6 +2937,8 @@ VALUE ibm_db_columns(int argc, VALUE *argv, VALUE self)
|
|
2798
2937
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
2799
2938
|
if (rc == SQL_ERROR) {
|
2800
2939
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
2940
|
+
ruby_xfree( stmt_res );
|
2941
|
+
stmt_res = NULL;
|
2801
2942
|
return_value = Qfalse;
|
2802
2943
|
} else {
|
2803
2944
|
if (!NIL_P(r_qualifier)) {
|
@@ -2827,6 +2968,7 @@ VALUE ibm_db_columns(int argc, VALUE *argv, VALUE self)
|
|
2827
2968
|
NULL, -1, 1, 1 );
|
2828
2969
|
|
2829
2970
|
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
2971
|
+
stmt_res = NULL;
|
2830
2972
|
|
2831
2973
|
return_value = Qfalse;
|
2832
2974
|
} else {
|
@@ -2914,7 +3056,7 @@ VALUE ibm_db_foreign_keys(int argc, VALUE *argv, VALUE self)
|
|
2914
3056
|
rb_scan_args(argc, argv, "4", &connection,
|
2915
3057
|
&r_qualifier, &r_owner, &r_table_name);
|
2916
3058
|
|
2917
|
-
col_metadata_args =
|
3059
|
+
col_metadata_args = ALLOC( metadata_args );
|
2918
3060
|
memset(col_metadata_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
2919
3061
|
|
2920
3062
|
col_metadata_args->qualifier = NULL;
|
@@ -2934,6 +3076,8 @@ VALUE ibm_db_foreign_keys(int argc, VALUE *argv, VALUE self)
|
|
2934
3076
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
2935
3077
|
if (rc == SQL_ERROR) {
|
2936
3078
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
3079
|
+
ruby_xfree( stmt_res );
|
3080
|
+
stmt_res = NULL;
|
2937
3081
|
return_value = Qfalse;
|
2938
3082
|
} else {
|
2939
3083
|
if (!NIL_P(r_qualifier)) {
|
@@ -2961,6 +3105,7 @@ VALUE ibm_db_foreign_keys(int argc, VALUE *argv, VALUE self)
|
|
2961
3105
|
NULL, -1, 1, 1 );
|
2962
3106
|
|
2963
3107
|
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
3108
|
+
stmt_res = NULL;
|
2964
3109
|
|
2965
3110
|
return_value = Qfalse;
|
2966
3111
|
} else {
|
@@ -3039,7 +3184,7 @@ VALUE ibm_db_primary_keys(int argc, VALUE *argv, VALUE self)
|
|
3039
3184
|
rb_scan_args(argc, argv, "4", &connection,
|
3040
3185
|
&r_qualifier, &r_owner, &r_table_name);
|
3041
3186
|
|
3042
|
-
col_metadata_args =
|
3187
|
+
col_metadata_args = ALLOC( metadata_args );
|
3043
3188
|
memset(col_metadata_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
3044
3189
|
|
3045
3190
|
col_metadata_args->qualifier = NULL;
|
@@ -3059,6 +3204,8 @@ VALUE ibm_db_primary_keys(int argc, VALUE *argv, VALUE self)
|
|
3059
3204
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
3060
3205
|
if (rc == SQL_ERROR) {
|
3061
3206
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
3207
|
+
ruby_xfree( stmt_res );
|
3208
|
+
stmt_res = NULL;
|
3062
3209
|
return_value = Qfalse;
|
3063
3210
|
} else {
|
3064
3211
|
if (!NIL_P(r_qualifier)) {
|
@@ -3085,6 +3232,7 @@ VALUE ibm_db_primary_keys(int argc, VALUE *argv, VALUE self)
|
|
3085
3232
|
NULL, -1, 1, 1 );
|
3086
3233
|
|
3087
3234
|
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
3235
|
+
stmt_res = NULL;
|
3088
3236
|
|
3089
3237
|
return_value = Qfalse;
|
3090
3238
|
} else {
|
@@ -3184,7 +3332,7 @@ VALUE ibm_db_procedure_columns(int argc, VALUE *argv, VALUE self)
|
|
3184
3332
|
rb_scan_args(argc, argv, "5", &connection,
|
3185
3333
|
&r_qualifier, &r_owner, &r_proc_name, &r_column_name);
|
3186
3334
|
|
3187
|
-
col_metadata_args =
|
3335
|
+
col_metadata_args = ALLOC( metadata_args );
|
3188
3336
|
memset(col_metadata_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
3189
3337
|
|
3190
3338
|
col_metadata_args->qualifier = NULL;
|
@@ -3204,6 +3352,8 @@ VALUE ibm_db_procedure_columns(int argc, VALUE *argv, VALUE self)
|
|
3204
3352
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
3205
3353
|
if (rc == SQL_ERROR) {
|
3206
3354
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
3355
|
+
ruby_xfree( stmt_res );
|
3356
|
+
stmt_res = NULL;
|
3207
3357
|
return_value = Qfalse;
|
3208
3358
|
} else {
|
3209
3359
|
if (!NIL_P(r_qualifier)) {
|
@@ -3233,6 +3383,7 @@ VALUE ibm_db_procedure_columns(int argc, VALUE *argv, VALUE self)
|
|
3233
3383
|
NULL, -1, 1, 1 );
|
3234
3384
|
|
3235
3385
|
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
3386
|
+
stmt_res = NULL;
|
3236
3387
|
|
3237
3388
|
return_value = Qfalse;
|
3238
3389
|
} else {
|
@@ -3311,7 +3462,7 @@ VALUE ibm_db_procedures(int argc, VALUE *argv, VALUE self)
|
|
3311
3462
|
rb_scan_args(argc, argv, "4", &connection,
|
3312
3463
|
&r_qualifier, &r_owner, &r_proc_name);
|
3313
3464
|
|
3314
|
-
proc_metadata_args =
|
3465
|
+
proc_metadata_args = ALLOC( metadata_args );
|
3315
3466
|
memset(proc_metadata_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
3316
3467
|
|
3317
3468
|
proc_metadata_args->qualifier = NULL;
|
@@ -3330,6 +3481,8 @@ VALUE ibm_db_procedures(int argc, VALUE *argv, VALUE self)
|
|
3330
3481
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
3331
3482
|
if (rc == SQL_ERROR) {
|
3332
3483
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
3484
|
+
ruby_xfree( stmt_res );
|
3485
|
+
stmt_res = NULL;
|
3333
3486
|
return_value = Qfalse;
|
3334
3487
|
} else {
|
3335
3488
|
if (!NIL_P(r_qualifier)) {
|
@@ -3355,6 +3508,9 @@ VALUE ibm_db_procedures(int argc, VALUE *argv, VALUE self)
|
|
3355
3508
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1,
|
3356
3509
|
NULL, -1, 1, 1 );
|
3357
3510
|
|
3511
|
+
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
3512
|
+
stmt_res = NULL;
|
3513
|
+
|
3358
3514
|
return_value = Qfalse;
|
3359
3515
|
} else {
|
3360
3516
|
return_value = Data_Wrap_Struct(le_stmt_struct,
|
@@ -3449,7 +3605,7 @@ VALUE ibm_db_special_columns(int argc, VALUE *argv, VALUE self)
|
|
3449
3605
|
rb_scan_args(argc, argv, "5", &connection, &r_qualifier,
|
3450
3606
|
&r_owner, &r_table_name, &r_scope);
|
3451
3607
|
|
3452
|
-
col_metadata_args =
|
3608
|
+
col_metadata_args = ALLOC( metadata_args );
|
3453
3609
|
memset(col_metadata_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
3454
3610
|
|
3455
3611
|
col_metadata_args->qualifier = NULL;
|
@@ -3470,6 +3626,8 @@ VALUE ibm_db_special_columns(int argc, VALUE *argv, VALUE self)
|
|
3470
3626
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
3471
3627
|
if (rc == SQL_ERROR) {
|
3472
3628
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
3629
|
+
ruby_xfree( stmt_res );
|
3630
|
+
stmt_res = NULL;
|
3473
3631
|
return_value = Qfalse;
|
3474
3632
|
} else {
|
3475
3633
|
if (!NIL_P(r_qualifier)) {
|
@@ -3499,6 +3657,7 @@ VALUE ibm_db_special_columns(int argc, VALUE *argv, VALUE self)
|
|
3499
3657
|
NULL, -1, 1, 1 );
|
3500
3658
|
|
3501
3659
|
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
3660
|
+
stmt_res = NULL;
|
3502
3661
|
|
3503
3662
|
return_value = Qfalse;
|
3504
3663
|
} else {
|
@@ -3610,7 +3769,7 @@ VALUE ibm_db_statistics(int argc, VALUE *argv, VALUE self)
|
|
3610
3769
|
|
3611
3770
|
metadata_args *col_metadata_args = NULL;
|
3612
3771
|
|
3613
|
-
col_metadata_args =
|
3772
|
+
col_metadata_args = ALLOC( metadata_args );
|
3614
3773
|
memset(col_metadata_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
3615
3774
|
|
3616
3775
|
col_metadata_args->qualifier = NULL;
|
@@ -3633,6 +3792,8 @@ VALUE ibm_db_statistics(int argc, VALUE *argv, VALUE self)
|
|
3633
3792
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
3634
3793
|
if (rc == SQL_ERROR) {
|
3635
3794
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
3795
|
+
ruby_xfree( stmt_res );
|
3796
|
+
stmt_res = NULL;
|
3636
3797
|
return_value = Qfalse;
|
3637
3798
|
} else {
|
3638
3799
|
if (!NIL_P(r_qualifier)) {
|
@@ -3661,6 +3822,9 @@ VALUE ibm_db_statistics(int argc, VALUE *argv, VALUE self)
|
|
3661
3822
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1,
|
3662
3823
|
NULL, -1, 1, 1 );
|
3663
3824
|
|
3825
|
+
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
3826
|
+
stmt_res = NULL;
|
3827
|
+
|
3664
3828
|
return_value = Qfalse;
|
3665
3829
|
} else {
|
3666
3830
|
return_value = Data_Wrap_Struct(le_stmt_struct,
|
@@ -3741,7 +3905,7 @@ VALUE ibm_db_table_privileges(int argc, VALUE *argv, VALUE self)
|
|
3741
3905
|
rb_scan_args(argc, argv, "13", &connection, &r_qualifier,
|
3742
3906
|
&r_owner, &r_table_name);
|
3743
3907
|
|
3744
|
-
table_privileges_args =
|
3908
|
+
table_privileges_args = ALLOC( metadata_args );
|
3745
3909
|
memset(table_privileges_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
3746
3910
|
|
3747
3911
|
table_privileges_args->qualifier = NULL;
|
@@ -3760,6 +3924,8 @@ VALUE ibm_db_table_privileges(int argc, VALUE *argv, VALUE self)
|
|
3760
3924
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
3761
3925
|
if (rc == SQL_ERROR) {
|
3762
3926
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
3927
|
+
ruby_xfree( stmt_res );
|
3928
|
+
stmt_res = NULL;
|
3763
3929
|
return_value = Qfalse;
|
3764
3930
|
} else {
|
3765
3931
|
if (!NIL_P(r_qualifier)) {
|
@@ -3786,6 +3952,9 @@ VALUE ibm_db_table_privileges(int argc, VALUE *argv, VALUE self)
|
|
3786
3952
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1,
|
3787
3953
|
NULL, -1, 1, 1 );
|
3788
3954
|
|
3955
|
+
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
3956
|
+
stmt_res = NULL;
|
3957
|
+
|
3789
3958
|
return_value = Qfalse;
|
3790
3959
|
} else {
|
3791
3960
|
return_value = Data_Wrap_Struct(le_stmt_struct,
|
@@ -3867,7 +4036,7 @@ VALUE ibm_db_tables(int argc, VALUE *argv, VALUE self)
|
|
3867
4036
|
rb_scan_args(argc, argv, "14", &connection,
|
3868
4037
|
&r_qualifier, &r_owner, &r_table_name, &r_table_type);
|
3869
4038
|
|
3870
|
-
table_metadata_args =
|
4039
|
+
table_metadata_args = ALLOC( metadata_args );
|
3871
4040
|
memset(table_metadata_args,'\0',sizeof(struct _ibm_db_metadata_args_struct));
|
3872
4041
|
|
3873
4042
|
table_metadata_args->qualifier = NULL;
|
@@ -3888,6 +4057,8 @@ VALUE ibm_db_tables(int argc, VALUE *argv, VALUE self)
|
|
3888
4057
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
3889
4058
|
if (rc == SQL_ERROR) {
|
3890
4059
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
4060
|
+
ruby_xfree( stmt_res );
|
4061
|
+
stmt_res = NULL;
|
3891
4062
|
return_value = Qfalse;
|
3892
4063
|
} else {
|
3893
4064
|
if (!NIL_P(r_qualifier)) {
|
@@ -3917,6 +4088,9 @@ VALUE ibm_db_tables(int argc, VALUE *argv, VALUE self)
|
|
3917
4088
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1,
|
3918
4089
|
NULL, -1, 1, 1 );
|
3919
4090
|
|
4091
|
+
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
4092
|
+
stmt_res = NULL;
|
4093
|
+
|
3920
4094
|
return_value = Qfalse;
|
3921
4095
|
} else {
|
3922
4096
|
return_value = Data_Wrap_Struct(le_stmt_struct,
|
@@ -3977,7 +4151,7 @@ VALUE ibm_db_commit(int argc, VALUE *argv, VALUE self)
|
|
3977
4151
|
return Qfalse;
|
3978
4152
|
}
|
3979
4153
|
|
3980
|
-
end_X_args =
|
4154
|
+
end_X_args = ALLOC( end_tran_args );
|
3981
4155
|
memset(end_X_args,'\0',sizeof(struct _ibm_db_end_tran_args_struct));
|
3982
4156
|
|
3983
4157
|
end_X_args->hdbc = &(conn_res->hdbc);
|
@@ -4016,19 +4190,20 @@ static int _ruby_ibm_db_do_prepare(conn_handle *conn_res, VALUE stmt, stmt_handl
|
|
4016
4190
|
VALUE options)
|
4017
4191
|
{
|
4018
4192
|
int rc;
|
4019
|
-
|
4193
|
+
|
4194
|
+
VALUE error = Qnil;
|
4020
4195
|
|
4021
4196
|
exec_cum_prepare_args *prepare_args = NULL;
|
4022
4197
|
|
4023
4198
|
/* get the string and its length */
|
4024
4199
|
if ( !NIL_P(stmt) ) {
|
4025
|
-
prepare_args =
|
4200
|
+
prepare_args = ALLOC( exec_cum_prepare_args );
|
4026
4201
|
memset(prepare_args,'\0',sizeof(struct _ibm_db_exec_direct_args_struct));
|
4027
4202
|
|
4028
4203
|
prepare_args->stmt_string = (SQLCHAR*)rb_str2cstr(stmt, &(prepare_args->stmt_string_len));
|
4029
4204
|
} else {
|
4030
|
-
ruby_xfree( stmt_res );
|
4031
4205
|
rb_warn("Supplied parameter is invalid");
|
4206
|
+
stmt_res->is_freed = 1; /* At this point there is no handle allocated or resource used hence is_freed is set to 1*/
|
4032
4207
|
return SQL_ERROR;
|
4033
4208
|
}
|
4034
4209
|
|
@@ -4041,11 +4216,11 @@ static int _ruby_ibm_db_do_prepare(conn_handle *conn_res, VALUE stmt, stmt_handl
|
|
4041
4216
|
} else {
|
4042
4217
|
|
4043
4218
|
if ( !NIL_P(options) ) {
|
4044
|
-
rc = _ruby_ibm_db_parse_options( options, SQL_HANDLE_STMT, stmt_res, error );
|
4219
|
+
rc = _ruby_ibm_db_parse_options( options, SQL_HANDLE_STMT, stmt_res, &error );
|
4045
4220
|
if ( rc == SQL_ERROR ) {
|
4046
4221
|
ruby_xfree( prepare_args );
|
4047
|
-
|
4048
|
-
rb_warn( error );
|
4222
|
+
prepare_args = NULL;
|
4223
|
+
rb_warn( RSTRING_PTR(error) );
|
4049
4224
|
return rc;
|
4050
4225
|
}
|
4051
4226
|
}
|
@@ -4127,7 +4302,7 @@ VALUE ibm_db_exec(int argc, VALUE *argv, VALUE self)
|
|
4127
4302
|
exec_cum_prepare_args *exec_direct_args = NULL;
|
4128
4303
|
|
4129
4304
|
int rc;
|
4130
|
-
|
4305
|
+
VALUE error = Qnil;
|
4131
4306
|
|
4132
4307
|
/* This function basically is a wrap of the _ruby_ibm_db_do_prepare and _ruby_ibm_db_execute_stmt */
|
4133
4308
|
/* After completing statement execution, it returns the statement resource */
|
@@ -4142,7 +4317,7 @@ VALUE ibm_db_exec(int argc, VALUE *argv, VALUE self)
|
|
4142
4317
|
}
|
4143
4318
|
|
4144
4319
|
if (!NIL_P(stmt)) {
|
4145
|
-
exec_direct_args =
|
4320
|
+
exec_direct_args = ALLOC( exec_cum_prepare_args );
|
4146
4321
|
memset(exec_direct_args,'\0',sizeof(struct _ibm_db_exec_direct_args_struct));
|
4147
4322
|
|
4148
4323
|
exec_direct_args->stmt_string = (SQLCHAR*)rb_str2cstr(stmt, &(exec_direct_args->stmt_string_len));
|
@@ -4161,15 +4336,19 @@ VALUE ibm_db_exec(int argc, VALUE *argv, VALUE self)
|
|
4161
4336
|
rc = SQLAllocHandle(SQL_HANDLE_STMT, conn_res->hdbc, &(stmt_res->hstmt));
|
4162
4337
|
if ( rc < SQL_SUCCESS ) {
|
4163
4338
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
4339
|
+
ruby_xfree( stmt_res );
|
4340
|
+
stmt_res = NULL;
|
4164
4341
|
return_value = Qfalse;
|
4165
4342
|
} else {
|
4166
4343
|
|
4167
4344
|
if (!NIL_P(options)) {
|
4168
|
-
rc = _ruby_ibm_db_parse_options( options, SQL_HANDLE_STMT, stmt_res, error );
|
4345
|
+
rc = _ruby_ibm_db_parse_options( options, SQL_HANDLE_STMT, stmt_res, &error );
|
4169
4346
|
if ( rc == SQL_ERROR ) {
|
4170
4347
|
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
4348
|
+
stmt_res = NULL;
|
4171
4349
|
ruby_xfree( exec_direct_args );
|
4172
|
-
|
4350
|
+
exec_direct_args = NULL;
|
4351
|
+
rb_warn( RSTRING_PTR(error) );
|
4173
4352
|
return Qfalse;
|
4174
4353
|
}
|
4175
4354
|
}
|
@@ -4189,6 +4368,7 @@ VALUE ibm_db_exec(int argc, VALUE *argv, VALUE self)
|
|
4189
4368
|
SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
4190
4369
|
|
4191
4370
|
_ruby_ibm_db_free_stmt_struct( stmt_res );
|
4371
|
+
stmt_res = NULL;
|
4192
4372
|
|
4193
4373
|
return_value = Qfalse;
|
4194
4374
|
} else {
|
@@ -4229,10 +4409,8 @@ VALUE ibm_db_exec(int argc, VALUE *argv, VALUE self)
|
|
4229
4409
|
*/
|
4230
4410
|
VALUE ibm_db_free_result(int argc, VALUE *argv, VALUE self)
|
4231
4411
|
{
|
4232
|
-
VALUE stmt
|
4233
|
-
int
|
4234
|
-
|
4235
|
-
char error[DB2_MAX_ERR_MSG_LEN + 16];
|
4412
|
+
VALUE stmt = Qnil;
|
4413
|
+
int rc = 0;
|
4236
4414
|
|
4237
4415
|
stmt_handle *stmt_res = NULL;
|
4238
4416
|
free_stmt_args *freeStmt_args = NULL;
|
@@ -4242,7 +4420,7 @@ VALUE ibm_db_free_result(int argc, VALUE *argv, VALUE self)
|
|
4242
4420
|
if (!NIL_P(stmt)) {
|
4243
4421
|
Data_Get_Struct(stmt, stmt_handle, stmt_res);
|
4244
4422
|
if ( stmt_res->hstmt ) {
|
4245
|
-
freeStmt_args =
|
4423
|
+
freeStmt_args = ALLOC( free_stmt_args );
|
4246
4424
|
memset(freeStmt_args, '\0', sizeof( struct _ibm_db_free_stmt_struct ) );
|
4247
4425
|
|
4248
4426
|
freeStmt_args->stmt_res = stmt_res;
|
@@ -4256,15 +4434,15 @@ VALUE ibm_db_free_result(int argc, VALUE *argv, VALUE self)
|
|
4256
4434
|
#endif
|
4257
4435
|
|
4258
4436
|
ruby_xfree( freeStmt_args );
|
4437
|
+
freeStmt_args = NULL;
|
4259
4438
|
|
4260
4439
|
if ( rc == SQL_ERROR ) {
|
4261
4440
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
4262
|
-
|
4263
|
-
rb_warn( error );
|
4441
|
+
rb_warn( "Statement Free Failed: %s", stmt_res->ruby_stmt_err_msg);
|
4264
4442
|
return Qfalse;
|
4265
4443
|
}
|
4266
4444
|
}
|
4267
|
-
_ruby_ibm_db_free_result_struct(stmt_res);
|
4445
|
+
_ruby_ibm_db_free_result_struct( stmt_res );
|
4268
4446
|
} else {
|
4269
4447
|
rb_warn("Supplied parameter is invalid");
|
4270
4448
|
return Qfalse;
|
@@ -4331,7 +4509,6 @@ VALUE ibm_db_prepare(int argc, VALUE *argv, VALUE self)
|
|
4331
4509
|
stmt_handle *stmt_res;
|
4332
4510
|
|
4333
4511
|
int rc;
|
4334
|
-
char error[DB2_MAX_ERR_MSG_LEN + 16];
|
4335
4512
|
|
4336
4513
|
rb_scan_args(argc, argv, "21", &connection, &stmt, &options);
|
4337
4514
|
|
@@ -4357,9 +4534,9 @@ VALUE ibm_db_prepare(int argc, VALUE *argv, VALUE self)
|
|
4357
4534
|
|
4358
4535
|
if ( rc < SQL_SUCCESS ) {
|
4359
4536
|
_ruby_ibm_db_free_stmt_struct(stmt_res);
|
4537
|
+
stmt_res = NULL;
|
4360
4538
|
|
4361
|
-
|
4362
|
-
rb_warn( error );
|
4539
|
+
rb_warn("Statement Prepare Failed: %s", conn_res->ruby_error_msg);
|
4363
4540
|
|
4364
4541
|
return_value = Qfalse;
|
4365
4542
|
} else {
|
@@ -4381,7 +4558,7 @@ static param_node* build_list( stmt_handle *stmt_res, int param_no, SQLSMALLINT
|
|
4381
4558
|
|
4382
4559
|
/* Allocate memory and make new node to be added */
|
4383
4560
|
tmp_curr = ALLOC(param_node);
|
4384
|
-
memset(tmp_curr,0,sizeof(param_node));
|
4561
|
+
memset(tmp_curr,'\0',sizeof(param_node));
|
4385
4562
|
/* assign values */
|
4386
4563
|
tmp_curr->data_type = data_type;
|
4387
4564
|
tmp_curr->param_size = precision;
|
@@ -4390,6 +4567,8 @@ static param_node* build_list( stmt_handle *stmt_res, int param_no, SQLSMALLINT
|
|
4390
4567
|
tmp_curr->param_num = param_no;
|
4391
4568
|
tmp_curr->file_options = SQL_FILE_READ;
|
4392
4569
|
tmp_curr->param_type = SQL_PARAM_INPUT;
|
4570
|
+
tmp_curr->varname = NULL;
|
4571
|
+
tmp_curr->svalue = NULL;
|
4393
4572
|
|
4394
4573
|
while ( curr != NULL ) {
|
4395
4574
|
prev = curr;
|
@@ -4417,12 +4596,13 @@ static int _ruby_ibm_db_bind_parameter_helper(stmt_handle *stmt_res, param_node
|
|
4417
4596
|
int origlen = 0;
|
4418
4597
|
int is_known_type = 1;
|
4419
4598
|
|
4599
|
+
SQLCHAR *tmp_str;
|
4420
4600
|
SQLSMALLINT valueType;
|
4421
4601
|
SQLPOINTER paramValuePtr;
|
4422
4602
|
|
4423
4603
|
bind_parameter_args *bindParameter_args = NULL;
|
4424
4604
|
|
4425
|
-
bindParameter_args =
|
4605
|
+
bindParameter_args = ALLOC( bind_parameter_args );
|
4426
4606
|
memset(bindParameter_args,'\0',sizeof(struct _ibm_db_bind_parameter_struct));
|
4427
4607
|
|
4428
4608
|
bindParameter_args->stmt_res = stmt_res;
|
@@ -4434,7 +4614,11 @@ static int _ruby_ibm_db_bind_parameter_helper(stmt_handle *stmt_res, param_node
|
|
4434
4614
|
|
4435
4615
|
switch(TYPE(*bind_data)) {
|
4436
4616
|
case T_BIGNUM:
|
4437
|
-
|
4617
|
+
tmp_str = (SQLCHAR *) rb_str2cstr( rb_big2str(*bind_data,10), (long*)&curr->ivalue );
|
4618
|
+
|
4619
|
+
curr->svalue = (SQLCHAR *) ALLOC_N(char, curr->ivalue+1);
|
4620
|
+
memset(curr->svalue, '\0', curr->ivalue+1);
|
4621
|
+
memcpy(curr->svalue, tmp_str, curr->ivalue);
|
4438
4622
|
|
4439
4623
|
bindParameter_args->valueType = SQL_C_CHAR;
|
4440
4624
|
bindParameter_args->paramValPtr = curr->svalue;
|
@@ -4450,7 +4634,7 @@ static int _ruby_ibm_db_bind_parameter_helper(stmt_handle *stmt_res, param_node
|
|
4450
4634
|
if(curr->data_type == SQL_BIGINT) {
|
4451
4635
|
valueType = SQL_C_DEFAULT;
|
4452
4636
|
} else {
|
4453
|
-
valueType =
|
4637
|
+
valueType = SQL_C_SBIGINT;
|
4454
4638
|
}
|
4455
4639
|
|
4456
4640
|
bindParameter_args->valueType = valueType;
|
@@ -4467,7 +4651,7 @@ static int _ruby_ibm_db_bind_parameter_helper(stmt_handle *stmt_res, param_node
|
|
4467
4651
|
case T_FALSE:
|
4468
4652
|
curr->ivalue = 0;
|
4469
4653
|
|
4470
|
-
bindParameter_args->valueType =
|
4654
|
+
bindParameter_args->valueType = SQL_C_SBIGINT;
|
4471
4655
|
bindParameter_args->paramValPtr = &curr->ivalue;
|
4472
4656
|
bindParameter_args->buff_length = 0;
|
4473
4657
|
bindParameter_args->out_length = NULL;
|
@@ -4480,7 +4664,7 @@ static int _ruby_ibm_db_bind_parameter_helper(stmt_handle *stmt_res, param_node
|
|
4480
4664
|
case T_TRUE:
|
4481
4665
|
curr->ivalue = 1;
|
4482
4666
|
|
4483
|
-
bindParameter_args->valueType =
|
4667
|
+
bindParameter_args->valueType = SQL_C_SBIGINT;
|
4484
4668
|
bindParameter_args->paramValPtr = &curr->ivalue;
|
4485
4669
|
bindParameter_args->buff_length = 0;
|
4486
4670
|
bindParameter_args->out_length = NULL;
|
@@ -4504,7 +4688,7 @@ static int _ruby_ibm_db_bind_parameter_helper(stmt_handle *stmt_res, param_node
|
|
4504
4688
|
break;
|
4505
4689
|
|
4506
4690
|
case T_STRING:
|
4507
|
-
|
4691
|
+
tmp_str = (SQLCHAR *) rb_str2cstr( *bind_data, (long*) &curr->ivalue );
|
4508
4692
|
origlen = curr->ivalue;
|
4509
4693
|
/*
|
4510
4694
|
* An extra parameter is given by the client to pick the size of the string
|
@@ -4520,11 +4704,15 @@ static int _ruby_ibm_db_bind_parameter_helper(stmt_handle *stmt_res, param_node
|
|
4520
4704
|
curr->ivalue = curr->param_size;
|
4521
4705
|
}
|
4522
4706
|
}
|
4523
|
-
curr->svalue =
|
4707
|
+
curr->svalue = (SQLCHAR *) ALLOC_N(char, curr->ivalue+1);
|
4708
|
+
memset(curr->svalue, '\0', origlen);
|
4709
|
+
memcpy(curr->svalue, tmp_str, origlen);
|
4524
4710
|
curr->svalue[origlen] = '\0';
|
4525
4711
|
}
|
4526
4712
|
else {
|
4527
|
-
curr->svalue =
|
4713
|
+
curr->svalue = (SQLCHAR *) ALLOC_N(char, curr->ivalue+1);
|
4714
|
+
memset(curr->svalue, '\0', origlen);
|
4715
|
+
memcpy(curr->svalue, tmp_str, curr->ivalue);
|
4528
4716
|
curr->svalue[curr->ivalue] = '\0';
|
4529
4717
|
}
|
4530
4718
|
|
@@ -4639,7 +4827,7 @@ static int _ruby_ibm_db_bind_data( stmt_handle *stmt_res, param_node *curr, VALU
|
|
4639
4827
|
return SQL_ERROR;
|
4640
4828
|
}
|
4641
4829
|
curr->bind_indicator = 0;
|
4642
|
-
curr->svalue = rb_str2cstr(*bind_data, &curr->ivalue);
|
4830
|
+
curr->svalue = (SQLCHAR *) rb_str2cstr(*bind_data, (long*) &curr->ivalue);
|
4643
4831
|
|
4644
4832
|
/* Bind file name string */
|
4645
4833
|
rc = _ruby_ibm_db_SQLBindFileToParam_helper(stmt_res, curr);
|
@@ -4656,9 +4844,9 @@ static int _ruby_ibm_db_bind_data( stmt_handle *stmt_res, param_node *curr, VALU
|
|
4656
4844
|
return rc;
|
4657
4845
|
}
|
4658
4846
|
/*
|
4659
|
-
static int _ruby_ibm_db_bind_param_list(stmt_handle *stmt_res)
|
4847
|
+
static int _ruby_ibm_db_bind_param_list(stmt_handle *stmt_res, VALUE *error)
|
4660
4848
|
*/
|
4661
|
-
static int _ruby_ibm_db_bind_param_list(stmt_handle *stmt_res,
|
4849
|
+
static int _ruby_ibm_db_bind_param_list(stmt_handle *stmt_res, VALUE *error ) {
|
4662
4850
|
int rc;
|
4663
4851
|
VALUE bind_data; /* Data value from symbol table */
|
4664
4852
|
param_node *curr = NULL; /* To traverse the list */
|
@@ -4674,7 +4862,11 @@ static int _ruby_ibm_db_bind_param_list(stmt_handle *stmt_res, char *error ) {
|
|
4674
4862
|
rc = _ruby_ibm_db_bind_data( stmt_res, curr, &bind_data);
|
4675
4863
|
|
4676
4864
|
if ( rc == SQL_ERROR ) {
|
4677
|
-
|
4865
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
4866
|
+
*error = rb_str_cat2(rb_str_new2("Binding Error 1: "), stmt_res->ruby_stmt_err_msg );
|
4867
|
+
} else {
|
4868
|
+
*error = rb_str_new2("Binding Error 1: <error message could not be retrieved>");
|
4869
|
+
}
|
4678
4870
|
return rc;
|
4679
4871
|
}
|
4680
4872
|
curr = curr->next;
|
@@ -4684,10 +4876,10 @@ static int _ruby_ibm_db_bind_param_list(stmt_handle *stmt_res, char *error ) {
|
|
4684
4876
|
}
|
4685
4877
|
/* */
|
4686
4878
|
|
4687
|
-
/* static int _ruby_ibm_db_execute_helper2(stmt_res, data, int bind_cmp_list, int bind_params,
|
4879
|
+
/* static int _ruby_ibm_db_execute_helper2(stmt_res, data, int bind_cmp_list, int bind_params, VALUE *error )
|
4688
4880
|
*/
|
4689
4881
|
static int _ruby_ibm_db_execute_helper2(stmt_handle *stmt_res, VALUE *data, int bind_cmp_list,
|
4690
|
-
int bind_params,
|
4882
|
+
int bind_params, VALUE *error )
|
4691
4883
|
{
|
4692
4884
|
int rc = SQL_SUCCESS;
|
4693
4885
|
param_node *curr = NULL; /* To traverse the list */
|
@@ -4714,7 +4906,7 @@ static int _ruby_ibm_db_execute_helper2(stmt_handle *stmt_res, VALUE *data, int
|
|
4714
4906
|
parameter and then bind it.
|
4715
4907
|
*/
|
4716
4908
|
|
4717
|
-
desc_param_args =
|
4909
|
+
desc_param_args = ALLOC( describeparam_args );
|
4718
4910
|
memset(desc_param_args,'\0',sizeof(struct _ibm_db_describeparam_args_struct));
|
4719
4911
|
|
4720
4912
|
desc_param_args->param_no = ++stmt_res->num_params;
|
@@ -4729,7 +4921,11 @@ static int _ruby_ibm_db_execute_helper2(stmt_handle *stmt_res, VALUE *data, int
|
|
4729
4921
|
|
4730
4922
|
if ( rc == SQL_ERROR ) {
|
4731
4923
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
4732
|
-
|
4924
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
4925
|
+
*error = rb_str_cat2(rb_str_new2("Describe Param Failed: "), stmt_res->ruby_stmt_err_msg );
|
4926
|
+
} else {
|
4927
|
+
*error = rb_str_new2("Describe Param Failed: <error message could not be retrieved>");
|
4928
|
+
}
|
4733
4929
|
|
4734
4930
|
if(desc_param_args != NULL) {
|
4735
4931
|
ruby_xfree( desc_param_args );
|
@@ -4750,7 +4946,11 @@ static int _ruby_ibm_db_execute_helper2(stmt_handle *stmt_res, VALUE *data, int
|
|
4750
4946
|
rc = _ruby_ibm_db_bind_data( stmt_res, curr, data );
|
4751
4947
|
|
4752
4948
|
if ( rc == SQL_ERROR ) {
|
4753
|
-
|
4949
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
4950
|
+
*error = rb_str_cat2(rb_str_new2("Binding Error 2: "), stmt_res->ruby_stmt_err_msg );
|
4951
|
+
} else {
|
4952
|
+
*error = rb_str_new2("Binding Error 2: <error message could not be retrieved>");
|
4953
|
+
}
|
4754
4954
|
return rc;
|
4755
4955
|
}
|
4756
4956
|
} else {
|
@@ -4765,7 +4965,11 @@ static int _ruby_ibm_db_execute_helper2(stmt_handle *stmt_res, VALUE *data, int
|
|
4765
4965
|
rc = _ruby_ibm_db_bind_data( stmt_res, curr, data);
|
4766
4966
|
|
4767
4967
|
if ( rc == SQL_ERROR ) {
|
4768
|
-
|
4968
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
4969
|
+
*error = rb_str_cat2(rb_str_new2("Binding Error 2: "), stmt_res->ruby_stmt_err_msg );
|
4970
|
+
} else {
|
4971
|
+
*error = rb_str_new2("Binding Error 2: <error message could not be retrieved>");
|
4972
|
+
}
|
4769
4973
|
return rc;
|
4770
4974
|
}
|
4771
4975
|
stmt_res->current_node = curr->next;
|
@@ -4798,13 +5002,14 @@ void var_assign(char *name, VALUE value) {
|
|
4798
5002
|
strcat(statement, expr);
|
4799
5003
|
rb_eval_string( statement );
|
4800
5004
|
ruby_xfree( statement );
|
5005
|
+
statement = NULL;
|
4801
5006
|
#endif
|
4802
5007
|
}
|
4803
5008
|
|
4804
5009
|
/*
|
4805
|
-
static VALUE _ruby_ibm_db_desc_and_bind_param_list(stmt_bind_array *bind_array)
|
5010
|
+
static VALUE _ruby_ibm_db_desc_and_bind_param_list(stmt_bind_array *bind_array, VALUE *error)
|
4806
5011
|
*/
|
4807
|
-
static VALUE _ruby_ibm_db_desc_and_bind_param_list(stmt_bind_array *bind_array,
|
5012
|
+
static VALUE _ruby_ibm_db_desc_and_bind_param_list(stmt_bind_array *bind_array, VALUE *error ) {
|
4808
5013
|
int rc, numOpts, i = 0;
|
4809
5014
|
|
4810
5015
|
VALUE data;
|
@@ -4817,13 +5022,11 @@ static VALUE _ruby_ibm_db_desc_and_bind_param_list(stmt_bind_array *bind_array,
|
|
4817
5022
|
|
4818
5023
|
if (numOpts > bind_array->num) {
|
4819
5024
|
/* More are passed in -- Warning - Use the max number present */
|
4820
|
-
|
4821
|
-
rb_warn(error);
|
4822
|
-
memset( error, '\0', DB2_MAX_ERR_MSG_LEN + 23 );
|
5025
|
+
rb_warn("Number of params passed in are more than bound parameters");
|
4823
5026
|
numOpts = bind_array->num;
|
4824
5027
|
} else if (numOpts < bind_array->num) {
|
4825
5028
|
/* If there are less params passed in, than are present -- Error */
|
4826
|
-
|
5029
|
+
*error = rb_str_new2("Number of params passed in are less than bound parameters");
|
4827
5030
|
return Qnil;
|
4828
5031
|
}
|
4829
5032
|
|
@@ -4852,7 +5055,7 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4852
5055
|
VALUE ret_value = Qtrue;
|
4853
5056
|
stmt_handle *stmt_res = NULL;
|
4854
5057
|
|
4855
|
-
|
5058
|
+
VALUE *error;
|
4856
5059
|
int rc = 0;
|
4857
5060
|
|
4858
5061
|
SQLSMALLINT num = 0;
|
@@ -4865,7 +5068,7 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4865
5068
|
|
4866
5069
|
/* Free any cursors that might have been allocated in a previous call to SQLExecute */
|
4867
5070
|
|
4868
|
-
freeStmt_args =
|
5071
|
+
freeStmt_args = ALLOC( free_stmt_args );
|
4869
5072
|
memset(freeStmt_args, '\0', sizeof( struct _ibm_db_free_stmt_struct ) );
|
4870
5073
|
|
4871
5074
|
freeStmt_args->stmt_res = stmt_res;
|
@@ -4874,8 +5077,9 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4874
5077
|
_ruby_ibm_db_SQLFreeStmt_helper( freeStmt_args );
|
4875
5078
|
|
4876
5079
|
ruby_xfree( freeStmt_args );
|
5080
|
+
freeStmt_args = NULL;
|
4877
5081
|
|
4878
|
-
num_params_args =
|
5082
|
+
num_params_args = ALLOC( row_col_count_args );
|
4879
5083
|
memset(num_params_args,'\0',sizeof(struct _ibm_db_row_col_count_struct));
|
4880
5084
|
|
4881
5085
|
num_params_args->stmt_res = stmt_res;
|
@@ -4886,13 +5090,19 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4886
5090
|
if ( rc == SQL_ERROR ) {
|
4887
5091
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
4888
5092
|
ruby_xfree( num_params_args );
|
4889
|
-
|
5093
|
+
num_params_args = NULL;
|
5094
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
5095
|
+
*error = rb_str_cat2(rb_str_new2("Execute Failed due to: "), stmt_res->ruby_stmt_err_msg );
|
5096
|
+
} else {
|
5097
|
+
*error = rb_str_new2("Execute Failed due to: <error message could not be retrieved>");
|
5098
|
+
}
|
4890
5099
|
return Qnil;
|
4891
5100
|
}
|
4892
5101
|
|
4893
5102
|
num = num_params_args->count;
|
4894
5103
|
|
4895
5104
|
ruby_xfree( num_params_args );
|
5105
|
+
num_params_args = NULL;
|
4896
5106
|
|
4897
5107
|
if ( num != 0 ) {
|
4898
5108
|
|
@@ -4903,7 +5113,7 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4903
5113
|
/* Make sure IBM_DB.bind_param has been called */
|
4904
5114
|
/* If the param list is NULL -- ERROR */
|
4905
5115
|
if (TYPE( *(bind_array->parameters_array) ) != T_ARRAY) {
|
4906
|
-
|
5116
|
+
*error = rb_str_new2("Param is not an array");
|
4907
5117
|
return Qnil;
|
4908
5118
|
}
|
4909
5119
|
|
@@ -4913,7 +5123,7 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4913
5123
|
return Qnil;
|
4914
5124
|
}
|
4915
5125
|
if(ret_value == Qfalse) {
|
4916
|
-
|
5126
|
+
return Qfalse;
|
4917
5127
|
}
|
4918
5128
|
|
4919
5129
|
} else {
|
@@ -4921,17 +5131,17 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4921
5131
|
/* No additional params passed in. Use values already bound. */
|
4922
5132
|
if ( num > stmt_res->num_params ) {
|
4923
5133
|
/* More parameters than we expected */
|
4924
|
-
|
5134
|
+
*error = rb_str_new2("Number of params passed are more than bound parameters");
|
4925
5135
|
return Qnil;
|
4926
5136
|
} else if ( num < stmt_res->num_params ) {
|
4927
5137
|
/* Fewer parameters than we expected */
|
4928
|
-
|
5138
|
+
*error = rb_str_new2("Number of params passed are less than bound parameters");
|
4929
5139
|
return Qnil;
|
4930
5140
|
}
|
4931
5141
|
|
4932
5142
|
/* Param cache node list is empty -- No params bound */
|
4933
5143
|
if ( stmt_res->head_cache_list == NULL ) {
|
4934
|
-
|
5144
|
+
*error = rb_str_new2("Parameters not bound");
|
4935
5145
|
return Qnil;
|
4936
5146
|
} else {
|
4937
5147
|
/* The 1 denotes that you work with the whole list */
|
@@ -4951,13 +5161,17 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4951
5161
|
|
4952
5162
|
if ( rc == SQL_ERROR ) {
|
4953
5163
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
4954
|
-
|
5164
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
5165
|
+
*error = rb_str_cat2(rb_str_new2("Statement Execute Failed: "), stmt_res->ruby_stmt_err_msg );
|
5166
|
+
} else {
|
5167
|
+
*error = rb_str_new2("Statement Execute Failed: <error message could not be retrieved>");
|
5168
|
+
}
|
4955
5169
|
return Qnil;
|
4956
5170
|
}
|
4957
5171
|
|
4958
5172
|
if ( rc == SQL_NEED_DATA ) {
|
4959
5173
|
|
4960
|
-
put_param_data_args =
|
5174
|
+
put_param_data_args = ALLOC( param_cum_put_data_args );
|
4961
5175
|
memset(put_param_data_args,'\0',sizeof(struct _ibm_db_param_and_put_data_struct));
|
4962
5176
|
|
4963
5177
|
put_param_data_args->stmt_res = stmt_res;
|
@@ -4969,7 +5183,11 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
4969
5183
|
|
4970
5184
|
if ( rc == SQL_ERROR ) {
|
4971
5185
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
4972
|
-
|
5186
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
5187
|
+
*error = rb_str_cat2(rb_str_new2("Sending data failed: "), stmt_res->ruby_stmt_err_msg );
|
5188
|
+
} else {
|
5189
|
+
*error = rb_str_new2("Sending data failed: <error message could not be retrieved>");
|
5190
|
+
}
|
4973
5191
|
|
4974
5192
|
if (put_param_data_args != NULL) {
|
4975
5193
|
ruby_xfree( put_param_data_args );
|
@@ -5022,7 +5240,7 @@ VALUE ibm_db_execute(int argc, VALUE *argv, VALUE self)
|
|
5022
5240
|
/* This is used to loop over the param cache */
|
5023
5241
|
param_node *tmp_curr, *prev_ptr, *curr_ptr;
|
5024
5242
|
|
5025
|
-
|
5243
|
+
VALUE error = Qnil;
|
5026
5244
|
|
5027
5245
|
rb_scan_args(argc, argv, "11", &stmt, ¶meters_array);
|
5028
5246
|
|
@@ -5039,14 +5257,14 @@ VALUE ibm_db_execute(int argc, VALUE *argv, VALUE self)
|
|
5039
5257
|
/* This ensures that each call to IBM_DB.execute start from scratch */
|
5040
5258
|
stmt_res->current_node = stmt_res->head_cache_list;
|
5041
5259
|
|
5042
|
-
bind_array =
|
5260
|
+
bind_array = ALLOC( stmt_bind_array );
|
5043
5261
|
memset(bind_array,'\0',sizeof(struct _stmt_bind_data_array));
|
5044
5262
|
|
5045
5263
|
bind_array->parameters_array = ¶meters_array;
|
5046
5264
|
bind_array->stmt_res = stmt_res;
|
5047
5265
|
bind_array->bind_params = 0;
|
5048
5266
|
bind_array->num = 0;
|
5049
|
-
bind_array->error = error;
|
5267
|
+
bind_array->error = &error;
|
5050
5268
|
|
5051
5269
|
#ifdef GIL_RELEASE_VERSION
|
5052
5270
|
ret_value = rb_thread_blocking_region( (void *)_ruby_ibm_db_execute_helper, bind_array,
|
@@ -5056,8 +5274,9 @@ VALUE ibm_db_execute(int argc, VALUE *argv, VALUE self)
|
|
5056
5274
|
#endif
|
5057
5275
|
|
5058
5276
|
if( ret_value == Qnil || ret_value == Qfalse ) {
|
5059
|
-
rb_warn( error
|
5277
|
+
rb_warn( RSTRING_PTR(error) );
|
5060
5278
|
ruby_xfree( bind_array );
|
5279
|
+
bind_array = NULL;
|
5061
5280
|
return Qfalse;
|
5062
5281
|
}
|
5063
5282
|
|
@@ -5071,8 +5290,14 @@ VALUE ibm_db_execute(int argc, VALUE *argv, VALUE self)
|
|
5071
5290
|
curr_ptr = curr_ptr->next;
|
5072
5291
|
|
5073
5292
|
/* Free Values */
|
5074
|
-
if ( prev_ptr->svalue) {
|
5293
|
+
if ( prev_ptr->svalue != NULL ) {
|
5075
5294
|
ruby_xfree( prev_ptr->svalue );
|
5295
|
+
prev_ptr->svalue = NULL;
|
5296
|
+
}
|
5297
|
+
|
5298
|
+
if ( prev_ptr->varname != NULL ) {
|
5299
|
+
ruby_xfree( prev_ptr->varname );
|
5300
|
+
prev_ptr->varname = NULL;
|
5076
5301
|
}
|
5077
5302
|
|
5078
5303
|
ruby_xfree( prev_ptr );
|
@@ -5082,6 +5307,7 @@ VALUE ibm_db_execute(int argc, VALUE *argv, VALUE self)
|
|
5082
5307
|
|
5083
5308
|
stmt_res->head_cache_list = NULL;
|
5084
5309
|
stmt_res->num_params = 0;
|
5310
|
+
stmt_res->current_node = NULL;
|
5085
5311
|
} else {
|
5086
5312
|
/* Bind the IN/OUT Params back into the active symbol table */
|
5087
5313
|
tmp_curr = stmt_res->head_cache_list;
|
@@ -5105,7 +5331,7 @@ VALUE ibm_db_execute(int argc, VALUE *argv, VALUE self)
|
|
5105
5331
|
var_assign(tmp_curr->varname, rb_float_new(tmp_curr->fvalue));
|
5106
5332
|
break;
|
5107
5333
|
default:
|
5108
|
-
var_assign(tmp_curr->varname, rb_str_new2(tmp_curr->svalue));
|
5334
|
+
var_assign(tmp_curr->varname, rb_str_new2((char *)tmp_curr->svalue));
|
5109
5335
|
break;
|
5110
5336
|
}
|
5111
5337
|
|
@@ -5162,6 +5388,7 @@ VALUE ibm_db_execute(int argc, VALUE *argv, VALUE self)
|
|
5162
5388
|
VALUE ibm_db_conn_errormsg(int argc, VALUE *argv, VALUE self)
|
5163
5389
|
{
|
5164
5390
|
VALUE connection = Qnil;
|
5391
|
+
VALUE ret_val = Qnil;
|
5165
5392
|
conn_handle *conn_res = NULL;
|
5166
5393
|
char *return_str = NULL; /* This variable is used by _ruby_ibm_db_check_sql_errors to return err strings */
|
5167
5394
|
|
@@ -5177,8 +5404,8 @@ VALUE ibm_db_conn_errormsg(int argc, VALUE *argv, VALUE self)
|
|
5177
5404
|
return Qnil;
|
5178
5405
|
}
|
5179
5406
|
|
5180
|
-
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
5181
|
-
memset(return_str, 0, DB2_MAX_ERR_MSG_LEN);
|
5407
|
+
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
5408
|
+
memset(return_str, '\0', DB2_MAX_ERR_MSG_LEN+1);
|
5182
5409
|
|
5183
5410
|
_ruby_ibm_db_check_sql_errors(conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, -1, 0, return_str, DB_ERRMSG, conn_res->errormsg_recno_tracker, 1 );
|
5184
5411
|
|
@@ -5187,7 +5414,10 @@ VALUE ibm_db_conn_errormsg(int argc, VALUE *argv, VALUE self)
|
|
5187
5414
|
|
5188
5415
|
conn_res->errormsg_recno_tracker++;
|
5189
5416
|
|
5190
|
-
|
5417
|
+
ret_val = rb_str_new2(return_str);
|
5418
|
+
ruby_xfree( return_str );
|
5419
|
+
|
5420
|
+
return ret_val;
|
5191
5421
|
} else {
|
5192
5422
|
return rb_str_new2(IBM_DB_G(__ruby_conn_err_msg));
|
5193
5423
|
}
|
@@ -5219,6 +5449,7 @@ VALUE ibm_db_conn_errormsg(int argc, VALUE *argv, VALUE self)
|
|
5219
5449
|
VALUE ibm_db_stmt_errormsg(int argc, VALUE *argv, VALUE self)
|
5220
5450
|
{
|
5221
5451
|
VALUE stmt = Qnil;
|
5452
|
+
VALUE ret_val = Qnil;
|
5222
5453
|
stmt_handle *stmt_res = NULL;
|
5223
5454
|
char *return_str = NULL; /* This variable is used by _ruby_ibm_db_check_sql_errors to return err strings */
|
5224
5455
|
|
@@ -5229,8 +5460,8 @@ VALUE ibm_db_stmt_errormsg(int argc, VALUE *argv, VALUE self)
|
|
5229
5460
|
if (!NIL_P(stmt)) {
|
5230
5461
|
Data_Get_Struct(stmt, stmt_handle, stmt_res);
|
5231
5462
|
|
5232
|
-
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
5233
|
-
memset(return_str, 0, DB2_MAX_ERR_MSG_LEN);
|
5463
|
+
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
5464
|
+
memset(return_str, '\0', DB2_MAX_ERR_MSG_LEN+1);
|
5234
5465
|
|
5235
5466
|
_ruby_ibm_db_check_sql_errors(stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, -1, 0,
|
5236
5467
|
return_str, DB_ERRMSG, stmt_res->errormsg_recno_tracker, 1);
|
@@ -5240,7 +5471,10 @@ VALUE ibm_db_stmt_errormsg(int argc, VALUE *argv, VALUE self)
|
|
5240
5471
|
|
5241
5472
|
stmt_res->errormsg_recno_tracker++;
|
5242
5473
|
|
5243
|
-
|
5474
|
+
ret_val = rb_str_new2(return_str);
|
5475
|
+
ruby_xfree( return_str );
|
5476
|
+
|
5477
|
+
return ret_val;
|
5244
5478
|
} else {
|
5245
5479
|
return rb_str_new2(IBM_DB_G(__ruby_stmt_err_msg));
|
5246
5480
|
}
|
@@ -5280,6 +5514,7 @@ VALUE ibm_db_stmt_errormsg(int argc, VALUE *argv, VALUE self)
|
|
5280
5514
|
VALUE ibm_db_conn_error(int argc, VALUE *argv, VALUE self)
|
5281
5515
|
{
|
5282
5516
|
VALUE connection = Qnil;
|
5517
|
+
VALUE ret_val = Qnil;
|
5283
5518
|
conn_handle *conn_res = NULL;
|
5284
5519
|
|
5285
5520
|
char *return_str = NULL; /* This variable is used by _ruby_ibm_db_check_sql_errors to return err strings */
|
@@ -5297,7 +5532,7 @@ VALUE ibm_db_conn_error(int argc, VALUE *argv, VALUE self)
|
|
5297
5532
|
}
|
5298
5533
|
|
5299
5534
|
return_str = ALLOC_N(char, SQL_SQLSTATE_SIZE + 1);
|
5300
|
-
memset(return_str, 0, SQL_SQLSTATE_SIZE + 1);
|
5535
|
+
memset(return_str, '\0', SQL_SQLSTATE_SIZE + 1);
|
5301
5536
|
|
5302
5537
|
_ruby_ibm_db_check_sql_errors(conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, -1, 0,
|
5303
5538
|
return_str, DB_ERR_STATE, conn_res->error_recno_tracker, 1);
|
@@ -5308,7 +5543,10 @@ VALUE ibm_db_conn_error(int argc, VALUE *argv, VALUE self)
|
|
5308
5543
|
|
5309
5544
|
conn_res->error_recno_tracker++;
|
5310
5545
|
|
5311
|
-
|
5546
|
+
ret_val = rb_str_new2(return_str);
|
5547
|
+
ruby_xfree( return_str );
|
5548
|
+
|
5549
|
+
return ret_val;
|
5312
5550
|
} else {
|
5313
5551
|
return rb_str_new2(IBM_DB_G(__ruby_conn_err_state));
|
5314
5552
|
}
|
@@ -5342,6 +5580,7 @@ VALUE ibm_db_conn_error(int argc, VALUE *argv, VALUE self)
|
|
5342
5580
|
VALUE ibm_db_stmt_error(int argc, VALUE *argv, VALUE self)
|
5343
5581
|
{
|
5344
5582
|
VALUE stmt = Qnil;
|
5583
|
+
VALUE ret_val = Qnil;
|
5345
5584
|
stmt_handle *stmt_res = NULL;
|
5346
5585
|
char *return_str = NULL; /* This variable is used by _ruby_ibm_db_check_sql_errors to return err strings */
|
5347
5586
|
|
@@ -5352,8 +5591,8 @@ VALUE ibm_db_stmt_error(int argc, VALUE *argv, VALUE self)
|
|
5352
5591
|
if (!NIL_P(stmt)) {
|
5353
5592
|
Data_Get_Struct(stmt, stmt_handle, stmt_res);
|
5354
5593
|
|
5355
|
-
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
5356
|
-
memset(return_str, 0, DB2_MAX_ERR_MSG_LEN);
|
5594
|
+
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
5595
|
+
memset(return_str, '\0', DB2_MAX_ERR_MSG_LEN+1);
|
5357
5596
|
|
5358
5597
|
_ruby_ibm_db_check_sql_errors(stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, -1, 0,
|
5359
5598
|
return_str, DB_ERR_STATE, stmt_res->error_recno_tracker, 1 );
|
@@ -5364,7 +5603,10 @@ VALUE ibm_db_stmt_error(int argc, VALUE *argv, VALUE self)
|
|
5364
5603
|
|
5365
5604
|
stmt_res->error_recno_tracker++;
|
5366
5605
|
|
5367
|
-
|
5606
|
+
ret_val = rb_str_new2(return_str);
|
5607
|
+
ruby_xfree( return_str );
|
5608
|
+
|
5609
|
+
return ret_val;
|
5368
5610
|
} else {
|
5369
5611
|
return rb_str_new2(IBM_DB_G(__ruby_stmt_err_state));
|
5370
5612
|
}
|
@@ -5435,8 +5677,8 @@ VALUE ibm_db_getErrormsg(int argc, VALUE *argv, VALUE self)
|
|
5435
5677
|
return_value = rb_str_new2( conn_res->ruby_error_msg );
|
5436
5678
|
} else {
|
5437
5679
|
|
5438
|
-
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
5439
|
-
memset(return_str, 0, DB2_MAX_ERR_MSG_LEN);
|
5680
|
+
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
5681
|
+
memset(return_str, '\0', DB2_MAX_ERR_MSG_LEN+1);
|
5440
5682
|
|
5441
5683
|
_ruby_ibm_db_check_sql_errors(conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, -1, 0, return_str,
|
5442
5684
|
DB_ERRMSG, conn_res->errormsg_recno_tracker, 1 );
|
@@ -5446,6 +5688,7 @@ VALUE ibm_db_getErrormsg(int argc, VALUE *argv, VALUE self)
|
|
5446
5688
|
}
|
5447
5689
|
|
5448
5690
|
return_value = rb_str_new2(return_str);
|
5691
|
+
ruby_xfree( return_str );
|
5449
5692
|
}
|
5450
5693
|
conn_res->errormsg_recno_tracker++;
|
5451
5694
|
}
|
@@ -5455,8 +5698,8 @@ VALUE ibm_db_getErrormsg(int argc, VALUE *argv, VALUE self)
|
|
5455
5698
|
if( stmt_res->errormsg_recno_tracker == 1 && stmt_res->ruby_stmt_err_msg != NULL ) {
|
5456
5699
|
return_value = rb_str_new2( stmt_res->ruby_stmt_err_msg );
|
5457
5700
|
} else {
|
5458
|
-
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
5459
|
-
memset(return_str, 0, DB2_MAX_ERR_MSG_LEN);
|
5701
|
+
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
5702
|
+
memset(return_str, '\0', DB2_MAX_ERR_MSG_LEN+1);
|
5460
5703
|
|
5461
5704
|
_ruby_ibm_db_check_sql_errors(stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, -1, 0,
|
5462
5705
|
return_str, DB_ERRMSG, stmt_res->errormsg_recno_tracker, 1);
|
@@ -5466,6 +5709,7 @@ VALUE ibm_db_getErrormsg(int argc, VALUE *argv, VALUE self)
|
|
5466
5709
|
}
|
5467
5710
|
|
5468
5711
|
return_value = rb_str_new2(return_str);
|
5712
|
+
ruby_xfree( return_str );
|
5469
5713
|
}
|
5470
5714
|
stmt_res->errormsg_recno_tracker++;
|
5471
5715
|
} /*End of Resource Type check */
|
@@ -5545,8 +5789,8 @@ VALUE ibm_db_getErrorstate(int argc, VALUE *argv, VALUE self)
|
|
5545
5789
|
return_value = rb_str_new2( conn_res->ruby_error_state );
|
5546
5790
|
} else {
|
5547
5791
|
|
5548
|
-
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
5549
|
-
memset(return_str, 0, DB2_MAX_ERR_MSG_LEN);
|
5792
|
+
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
5793
|
+
memset(return_str, '\0', DB2_MAX_ERR_MSG_LEN+1);
|
5550
5794
|
|
5551
5795
|
_ruby_ibm_db_check_sql_errors(conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, -1, 0, return_str,
|
5552
5796
|
DB_ERRMSG, conn_res->error_recno_tracker, 1 );
|
@@ -5556,6 +5800,7 @@ VALUE ibm_db_getErrorstate(int argc, VALUE *argv, VALUE self)
|
|
5556
5800
|
}
|
5557
5801
|
|
5558
5802
|
return_value = rb_str_new2(return_str);
|
5803
|
+
ruby_xfree( return_str );
|
5559
5804
|
}
|
5560
5805
|
conn_res->error_recno_tracker++;
|
5561
5806
|
}
|
@@ -5565,8 +5810,8 @@ VALUE ibm_db_getErrorstate(int argc, VALUE *argv, VALUE self)
|
|
5565
5810
|
if( stmt_res->error_recno_tracker == 1 && stmt_res->ruby_stmt_err_state != NULL ) {
|
5566
5811
|
return_value = rb_str_new2( stmt_res->ruby_stmt_err_state );
|
5567
5812
|
} else {
|
5568
|
-
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN);
|
5569
|
-
memset(return_str, 0, DB2_MAX_ERR_MSG_LEN);
|
5813
|
+
return_str = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1);
|
5814
|
+
memset(return_str, '\0', DB2_MAX_ERR_MSG_LEN+1);
|
5570
5815
|
|
5571
5816
|
_ruby_ibm_db_check_sql_errors(stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, -1, 0,
|
5572
5817
|
return_str, DB_ERRMSG, stmt_res->error_recno_tracker, 1);
|
@@ -5576,6 +5821,7 @@ VALUE ibm_db_getErrorstate(int argc, VALUE *argv, VALUE self)
|
|
5576
5821
|
}
|
5577
5822
|
|
5578
5823
|
return_value = rb_str_new2(return_str);
|
5824
|
+
ruby_xfree( return_str );
|
5579
5825
|
}
|
5580
5826
|
stmt_res->error_recno_tracker++;
|
5581
5827
|
} /*End of Resource Type check */
|
@@ -5630,9 +5876,9 @@ VALUE ibm_db_next_result(int argc, VALUE *argv, VALUE self)
|
|
5630
5876
|
|
5631
5877
|
if ( rc < SQL_SUCCESS ) {
|
5632
5878
|
if ( stmt_res->ruby_stmt_err_msg == NULL ) {
|
5633
|
-
stmt_res->ruby_stmt_err_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN );
|
5879
|
+
stmt_res->ruby_stmt_err_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1 );
|
5634
5880
|
}
|
5635
|
-
memset( stmt_res->ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN );
|
5881
|
+
memset( stmt_res->ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN+1 );
|
5636
5882
|
|
5637
5883
|
_ruby_ibm_db_check_sql_errors( stmt_res , DB_STMT, stmt_res->hdbc, SQL_HANDLE_DBC, rc, 0,
|
5638
5884
|
stmt_res->ruby_stmt_err_msg, 1, 1, 1 );
|
@@ -5640,7 +5886,7 @@ VALUE ibm_db_next_result(int argc, VALUE *argv, VALUE self)
|
|
5640
5886
|
ret_value = Qfalse;
|
5641
5887
|
} else {
|
5642
5888
|
|
5643
|
-
nextresultparams =
|
5889
|
+
nextresultparams = ALLOC( next_result_args );
|
5644
5890
|
memset(nextresultparams,'\0',sizeof(struct _ibm_db_next_result_args_struct));
|
5645
5891
|
|
5646
5892
|
nextresultparams->stmt_res = stmt_res;
|
@@ -5666,7 +5912,7 @@ VALUE ibm_db_next_result(int argc, VALUE *argv, VALUE self)
|
|
5666
5912
|
/* Initialize stmt resource members with default values. */
|
5667
5913
|
/* Parsing will update options if needed */
|
5668
5914
|
new_stmt_res = ALLOC(stmt_handle);
|
5669
|
-
memset(new_stmt_res, 0, sizeof(stmt_handle));
|
5915
|
+
memset(new_stmt_res, '\0', sizeof(stmt_handle));
|
5670
5916
|
|
5671
5917
|
new_stmt_res->s_bin_mode = stmt_res->s_bin_mode;
|
5672
5918
|
new_stmt_res->cursor_type = stmt_res->cursor_type;
|
@@ -5680,6 +5926,7 @@ VALUE ibm_db_next_result(int argc, VALUE *argv, VALUE self)
|
|
5680
5926
|
new_stmt_res->row_data = NULL;
|
5681
5927
|
new_stmt_res->hstmt = new_hstmt;
|
5682
5928
|
new_stmt_res->hdbc = stmt_res->hdbc;
|
5929
|
+
new_stmt_res->is_freed = 0;
|
5683
5930
|
|
5684
5931
|
ret_value = Data_Wrap_Struct(le_stmt_struct,
|
5685
5932
|
_ruby_ibm_db_mark_stmt_struct, _ruby_ibm_db_free_stmt_struct,
|
@@ -5729,14 +5976,12 @@ VALUE ibm_db_num_fields(int argc, VALUE *argv, VALUE self)
|
|
5729
5976
|
|
5730
5977
|
row_col_count_args *result_cols_args = NULL;
|
5731
5978
|
|
5732
|
-
char error[DB2_MAX_ERR_MSG_LEN + 15];
|
5733
|
-
|
5734
5979
|
rb_scan_args(argc, argv, "1", &stmt);
|
5735
5980
|
|
5736
5981
|
if (!NIL_P(stmt)) {
|
5737
5982
|
Data_Get_Struct(stmt, stmt_handle, stmt_res);
|
5738
5983
|
|
5739
|
-
result_cols_args =
|
5984
|
+
result_cols_args = ALLOC( row_col_count_args );
|
5740
5985
|
memset(result_cols_args,'\0',sizeof(struct _ibm_db_row_col_count_struct));
|
5741
5986
|
|
5742
5987
|
result_cols_args->stmt_res = stmt_res;
|
@@ -5751,9 +5996,7 @@ VALUE ibm_db_num_fields(int argc, VALUE *argv, VALUE self)
|
|
5751
5996
|
|
5752
5997
|
if ( rc == SQL_ERROR ) {
|
5753
5998
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
5754
|
-
|
5755
|
-
|
5756
|
-
rb_warn( error );
|
5999
|
+
rb_warn("Failed to retrieve the number of fields: %s", stmt_res->ruby_stmt_err_msg );
|
5757
6000
|
ret_val = Qfalse;
|
5758
6001
|
} else {
|
5759
6002
|
ret_val = INT2NUM(result_cols_args->count);
|
@@ -5813,17 +6056,15 @@ VALUE ibm_db_num_rows(int argc, VALUE *argv, VALUE self)
|
|
5813
6056
|
stmt_handle *stmt_res;
|
5814
6057
|
int rc = 0;
|
5815
6058
|
|
5816
|
-
|
5817
|
-
|
5818
|
-
char error[DB2_MAX_ERR_MSG_LEN + 10 ];
|
6059
|
+
sql_row_count_args *row_count_args = NULL;
|
5819
6060
|
|
5820
6061
|
rb_scan_args(argc, argv, "1", &stmt);
|
5821
6062
|
|
5822
6063
|
if (!NIL_P(stmt)) {
|
5823
6064
|
Data_Get_Struct(stmt, stmt_handle, stmt_res);
|
5824
6065
|
|
5825
|
-
row_count_args =
|
5826
|
-
memset(row_count_args,'\0',sizeof(struct
|
6066
|
+
row_count_args = ALLOC( sql_row_count_args );
|
6067
|
+
memset(row_count_args,'\0',sizeof(struct _ibm_db_row_count_struct));
|
5827
6068
|
|
5828
6069
|
row_count_args->stmt_res = stmt_res;
|
5829
6070
|
row_count_args->count = 0;
|
@@ -5837,9 +6078,7 @@ VALUE ibm_db_num_rows(int argc, VALUE *argv, VALUE self)
|
|
5837
6078
|
|
5838
6079
|
if ( rc == SQL_ERROR ) {
|
5839
6080
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
5840
|
-
|
5841
|
-
|
5842
|
-
rb_warn( error );
|
6081
|
+
rb_warn("Retrieval of number of rows failed: %s", stmt_res->ruby_stmt_err_msg );
|
5843
6082
|
ret_val = Qfalse;
|
5844
6083
|
} else {
|
5845
6084
|
ret_val = INT2NUM( row_count_args->count );
|
@@ -6011,7 +6250,7 @@ VALUE ibm_db_field_display_size(int argc, VALUE *argv, VALUE self)
|
|
6011
6250
|
ret_val = Qfalse;
|
6012
6251
|
} else {
|
6013
6252
|
|
6014
|
-
colattr_args =
|
6253
|
+
colattr_args = ALLOC( col_attr_args );
|
6015
6254
|
memset( colattr_args,'\0',sizeof(struct _ibm_db_col_attr_struct) );
|
6016
6255
|
|
6017
6256
|
colattr_args->stmt_res = stmt_res;
|
@@ -6357,7 +6596,7 @@ VALUE ibm_db_field_width(int argc, VALUE *argv, VALUE self)
|
|
6357
6596
|
ret_val = Qfalse;
|
6358
6597
|
} else {
|
6359
6598
|
|
6360
|
-
colattr_args =
|
6599
|
+
colattr_args = ALLOC( col_attr_args );
|
6361
6600
|
memset( colattr_args,'\0',sizeof(struct _ibm_db_col_attr_struct) );
|
6362
6601
|
|
6363
6602
|
colattr_args->stmt_res = stmt_res;
|
@@ -6464,7 +6703,7 @@ VALUE ibm_db_rollback(int argc, VALUE *argv, VALUE self)
|
|
6464
6703
|
return Qfalse;
|
6465
6704
|
}
|
6466
6705
|
|
6467
|
-
end_X_args =
|
6706
|
+
end_X_args = ALLOC( end_tran_args );
|
6468
6707
|
memset(end_X_args,'\0',sizeof(struct _ibm_db_end_tran_args_struct));
|
6469
6708
|
|
6470
6709
|
end_X_args->hdbc = &(conn_res->hdbc);
|
@@ -6497,7 +6736,7 @@ VALUE ibm_db_rollback(int argc, VALUE *argv, VALUE self)
|
|
6497
6736
|
/* */
|
6498
6737
|
|
6499
6738
|
/*
|
6500
|
-
* IBM_DB.free_stmt -- Frees resources associated with
|
6739
|
+
* IBM_DB.free_stmt -- Frees the indicated statement handle and any resources associated with it
|
6501
6740
|
*
|
6502
6741
|
* ===Description
|
6503
6742
|
* bool IBM_DB.free_stmt ( resource stmt )
|
@@ -6514,10 +6753,22 @@ VALUE ibm_db_rollback(int argc, VALUE *argv, VALUE self)
|
|
6514
6753
|
*
|
6515
6754
|
* Returns TRUE on success or FALSE on failure.
|
6516
6755
|
*
|
6517
|
-
* ===DEPRECATED
|
6518
6756
|
*/
|
6519
6757
|
VALUE ibm_db_free_stmt(int argc, VALUE *argv, VALUE self)
|
6520
6758
|
{
|
6759
|
+
VALUE stmt = Qnil;
|
6760
|
+
stmt_handle *stmt_res = NULL;
|
6761
|
+
|
6762
|
+
rb_scan_args(argc, argv, "1", &stmt);
|
6763
|
+
|
6764
|
+
if (!NIL_P(stmt)) {
|
6765
|
+
Data_Get_Struct(stmt, stmt_handle, stmt_res);
|
6766
|
+
|
6767
|
+
_ruby_ibm_db_free_stmt_handle_and_resources( stmt_res );
|
6768
|
+
|
6769
|
+
} else {
|
6770
|
+
rb_warn("Statement resource passed for freeing is not valid");
|
6771
|
+
}
|
6521
6772
|
return Qtrue;
|
6522
6773
|
}
|
6523
6774
|
/* */
|
@@ -6528,7 +6779,7 @@ static RETCODE _ruby_ibm_db_get_data(stmt_handle *stmt_res, int col_num, short c
|
|
6528
6779
|
RETCODE rc = SQL_SUCCESS;
|
6529
6780
|
get_data_args *getData_args;
|
6530
6781
|
|
6531
|
-
getData_args =
|
6782
|
+
getData_args = ALLOC( get_data_args );
|
6532
6783
|
memset(getData_args,'\0',sizeof(struct _ibm_db_get_data_args_struct));
|
6533
6784
|
|
6534
6785
|
getData_args->stmt_res = stmt_res;
|
@@ -6565,16 +6816,16 @@ static RETCODE _ruby_ibm_db_get_length(stmt_handle* stmt_res, SQLUSMALLINT col_n
|
|
6565
6816
|
|
6566
6817
|
if ( rc < SQL_SUCCESS ) {
|
6567
6818
|
if( stmt_res->ruby_stmt_err_msg == NULL ) {
|
6568
|
-
stmt_res->ruby_stmt_err_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN );
|
6819
|
+
stmt_res->ruby_stmt_err_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1 );
|
6569
6820
|
}
|
6570
|
-
memset( stmt_res->ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN );
|
6821
|
+
memset( stmt_res->ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN+1 );
|
6571
6822
|
|
6572
6823
|
_ruby_ibm_db_check_sql_errors( stmt_res , DB_STMT, stmt_res->hdbc, SQL_HANDLE_DBC, rc, 0,
|
6573
6824
|
stmt_res->ruby_stmt_err_msg, 1, 1, 0 );
|
6574
6825
|
return SQL_ERROR;
|
6575
6826
|
}
|
6576
6827
|
|
6577
|
-
getLength_args =
|
6828
|
+
getLength_args = ALLOC( get_length_args );
|
6578
6829
|
memset(getLength_args,'\0',sizeof(struct _ibm_db_get_data_length_struct));
|
6579
6830
|
|
6580
6831
|
getLength_args->new_hstmt = &( new_hstmt);
|
@@ -6611,9 +6862,9 @@ static RETCODE _ruby_ibm_db_get_data2(stmt_handle *stmt_res, SQLUSMALLINT col_nu
|
|
6611
6862
|
|
6612
6863
|
if ( rc < SQL_SUCCESS ) {
|
6613
6864
|
if( stmt_res->ruby_stmt_err_msg == NULL ) {
|
6614
|
-
stmt_res->ruby_stmt_err_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN );
|
6865
|
+
stmt_res->ruby_stmt_err_msg = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN+1 );
|
6615
6866
|
}
|
6616
|
-
memset( stmt_res->ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN );
|
6867
|
+
memset( stmt_res->ruby_stmt_err_msg, '\0', DB2_MAX_ERR_MSG_LEN+1 );
|
6617
6868
|
|
6618
6869
|
_ruby_ibm_db_check_sql_errors( stmt_res , DB_STMT, stmt_res->hdbc, SQL_HANDLE_DBC, rc, 0,
|
6619
6870
|
stmt_res->ruby_stmt_err_msg, 1, 1, 0 );
|
@@ -6621,7 +6872,7 @@ static RETCODE _ruby_ibm_db_get_data2(stmt_handle *stmt_res, SQLUSMALLINT col_nu
|
|
6621
6872
|
return SQL_ERROR;
|
6622
6873
|
}
|
6623
6874
|
|
6624
|
-
getSubString_args =
|
6875
|
+
getSubString_args = ALLOC( get_subString_args );
|
6625
6876
|
memset(getSubString_args,'\0', sizeof(struct _ibm_db_get_data_subString_struct) );
|
6626
6877
|
|
6627
6878
|
getSubString_args->new_hstmt = &new_hstmt;
|
@@ -6698,17 +6949,17 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
6698
6949
|
/* get column header info*/
|
6699
6950
|
if ( stmt_res->column_info == NULL ) {
|
6700
6951
|
if (_ruby_ibm_db_get_result_set_info(stmt_res)<0) {
|
6701
|
-
|
6702
|
-
|
6703
|
-
|
6952
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
6953
|
+
*(data->error) = rb_str_cat2(rb_str_new2("Column information cannot be retrieved: "), stmt_res->ruby_stmt_err_msg );
|
6954
|
+
} else {
|
6955
|
+
*(data->error) = rb_str_new2("Column information cannot be retrieved: <error message could not be retrieved>");
|
6956
|
+
}
|
6704
6957
|
return Qnil;
|
6705
6958
|
}
|
6706
6959
|
}
|
6707
6960
|
|
6708
6961
|
if(col_num < 0 || col_num >= stmt_res->num_columns) {
|
6709
|
-
data->error =
|
6710
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
6711
|
-
sprintf(data->error, "Column ordinal out of range" );
|
6962
|
+
*(data->error) = rb_str_new2("Column ordinal out of range" );
|
6712
6963
|
return Qnil;
|
6713
6964
|
}
|
6714
6965
|
|
@@ -6733,9 +6984,7 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
6733
6984
|
in_length = stmt_res->column_info[col_num].size+1;
|
6734
6985
|
out_ptr = (SQLPOINTER)ALLOC_N(char,in_length);
|
6735
6986
|
if ( out_ptr == NULL ) {
|
6736
|
-
|
6737
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
6738
|
-
sprintf(data->error, "Failed to Allocate Memory" );
|
6987
|
+
rb_warn( "Failed to Allocate Memory while trying to retrieve the result" );
|
6739
6988
|
return Qnil;
|
6740
6989
|
}
|
6741
6990
|
rc = _ruby_ibm_db_get_data(stmt_res, col_num+1, SQL_C_CHAR, out_ptr, in_length, &out_length);
|
@@ -6748,6 +6997,7 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
6748
6997
|
} else {
|
6749
6998
|
return_value = rb_str_new2((char*)out_ptr);
|
6750
6999
|
ruby_xfree( out_ptr );
|
7000
|
+
out_ptr = NULL;
|
6751
7001
|
return return_value;
|
6752
7002
|
}
|
6753
7003
|
break;
|
@@ -6789,9 +7039,7 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
6789
7039
|
}
|
6790
7040
|
out_char_ptr = (char*)ALLOC_N(char,in_length+1);
|
6791
7041
|
if ( out_char_ptr == NULL ) {
|
6792
|
-
|
6793
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
6794
|
-
sprintf(data->error, "Failed to Allocate Memory for LOB Data" );
|
7042
|
+
rb_warn( "Failed to Allocate Memory for LOB Data" );
|
6795
7043
|
return Qnil;
|
6796
7044
|
}
|
6797
7045
|
rc = _ruby_ibm_db_get_data2(stmt_res, col_num+1, SQL_C_CHAR, (void*)out_char_ptr, in_length, in_length+1, &out_length);
|
@@ -6799,7 +7047,11 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
6799
7047
|
return Qfalse;
|
6800
7048
|
}
|
6801
7049
|
|
6802
|
-
|
7050
|
+
return_value = rb_str_new2(out_char_ptr);
|
7051
|
+
ruby_xfree( out_char_ptr );
|
7052
|
+
out_char_ptr = NULL;
|
7053
|
+
|
7054
|
+
return return_value;
|
6803
7055
|
break;
|
6804
7056
|
|
6805
7057
|
case SQL_BLOB:
|
@@ -6830,16 +7082,18 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
6830
7082
|
case BINARY:
|
6831
7083
|
out_ptr = (SQLPOINTER)ALLOC_N(char,in_length);
|
6832
7084
|
if ( out_ptr == NULL ) {
|
6833
|
-
|
6834
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
6835
|
-
sprintf(data->error, "Failed to Allocate Memory for LOB Data" );
|
7085
|
+
rb_warn( "Failed to Allocate Memory for LOB Data" );
|
6836
7086
|
return Qnil;
|
6837
7087
|
}
|
6838
7088
|
rc = _ruby_ibm_db_get_data2(stmt_res, col_num+1, lob_bind_type, (char *)out_ptr, in_length, in_length, &out_length);
|
6839
7089
|
if (rc == SQL_ERROR) {
|
6840
7090
|
return Qfalse;
|
6841
7091
|
}
|
6842
|
-
|
7092
|
+
return_value = rb_str_new((char*)out_ptr,out_length);
|
7093
|
+
ruby_xfree( out_ptr );
|
7094
|
+
out_ptr = NULL;
|
7095
|
+
|
7096
|
+
return return_value;
|
6843
7097
|
default:
|
6844
7098
|
break;
|
6845
7099
|
}
|
@@ -6855,16 +7109,18 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
6855
7109
|
}
|
6856
7110
|
out_ptr = (SQLPOINTER)ALLOC_N(char, in_length);
|
6857
7111
|
if ( out_ptr == NULL ) {
|
6858
|
-
|
6859
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
6860
|
-
sprintf(data->error, "Failed to Allocate Memory for LOB Data" );
|
7112
|
+
rb_warn( "Failed to Allocate Memory for LOB Data" );
|
6861
7113
|
return Qnil;
|
6862
7114
|
}
|
6863
7115
|
rc = _ruby_ibm_db_get_data2(stmt_res, col_num+1, SQL_C_BINARY, (SQLPOINTER)out_ptr, in_length, in_length, &out_length);
|
6864
7116
|
if (rc == SQL_ERROR) {
|
6865
7117
|
return Qfalse;
|
6866
7118
|
}
|
6867
|
-
|
7119
|
+
return_value = rb_str_new((char*)out_ptr,out_length);
|
7120
|
+
ruby_xfree( out_ptr );
|
7121
|
+
out_ptr = NULL;
|
7122
|
+
|
7123
|
+
return return_value;
|
6868
7124
|
|
6869
7125
|
default:
|
6870
7126
|
break;
|
@@ -6900,14 +7156,14 @@ VALUE ibm_db_result(int argc, VALUE *argv, VALUE self)
|
|
6900
7156
|
VALUE ret_val = Qfalse;
|
6901
7157
|
VALUE stmt = Qnil;
|
6902
7158
|
|
6903
|
-
|
7159
|
+
VALUE error = Qnil;
|
6904
7160
|
|
6905
|
-
result_args =
|
7161
|
+
result_args = ALLOC( ibm_db_result_args );
|
6906
7162
|
memset(result_args,'\0',sizeof(struct _ibm_db_result_args_struct));
|
6907
7163
|
|
6908
7164
|
result_args->stmt_res = NULL;
|
6909
7165
|
result_args->column = Qnil;
|
6910
|
-
result_args->error =
|
7166
|
+
result_args->error = &error;
|
6911
7167
|
|
6912
7168
|
rb_scan_args(argc, argv, "2", &stmt, &(result_args->column) );
|
6913
7169
|
|
@@ -6921,8 +7177,6 @@ VALUE ibm_db_result(int argc, VALUE *argv, VALUE self)
|
|
6921
7177
|
ret_val = _ruby_ibm_db_result_helper( result_args );
|
6922
7178
|
#endif
|
6923
7179
|
|
6924
|
-
error = result_args->error;
|
6925
|
-
|
6926
7180
|
} else {
|
6927
7181
|
rb_warn("Invalid Statement resource specified");
|
6928
7182
|
ret_val = Qnil;
|
@@ -6934,9 +7188,8 @@ VALUE ibm_db_result(int argc, VALUE *argv, VALUE self)
|
|
6934
7188
|
result_args = NULL;
|
6935
7189
|
}
|
6936
7190
|
|
6937
|
-
if( error !=
|
6938
|
-
rb_warn( error );
|
6939
|
-
ruby_xfree( error );
|
7191
|
+
if( error != Qnil && ret_val == Qnil) {
|
7192
|
+
rb_warn( RSTRING_PTR(error) );
|
6940
7193
|
ret_val = Qnil;
|
6941
7194
|
}
|
6942
7195
|
|
@@ -6976,9 +7229,11 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
6976
7229
|
/* get column header info*/
|
6977
7230
|
if ( stmt_res->column_info == NULL ) {
|
6978
7231
|
if (_ruby_ibm_db_get_result_set_info(stmt_res)<0) {
|
6979
|
-
|
6980
|
-
|
6981
|
-
|
7232
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
7233
|
+
*(data->error) = rb_str_cat2(rb_str_new2("Column information cannot be retrieved: "), stmt_res->ruby_stmt_err_msg );
|
7234
|
+
} else {
|
7235
|
+
*(data->error) = rb_str_new2("Column information cannot be retrieved: <error message could not be retrieved>");
|
7236
|
+
}
|
6982
7237
|
return Qnil;
|
6983
7238
|
}
|
6984
7239
|
}
|
@@ -6987,16 +7242,18 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
6987
7242
|
if ( stmt_res->row_data == NULL ) {
|
6988
7243
|
rc = _ruby_ibm_db_bind_column_helper(stmt_res);
|
6989
7244
|
if ( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO ) {
|
6990
|
-
|
6991
|
-
|
6992
|
-
|
7245
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
7246
|
+
*(data->error) = rb_str_cat2(rb_str_new2("Column binding cannot be done: "), stmt_res->ruby_stmt_err_msg );
|
7247
|
+
} else {
|
7248
|
+
*(data->error) = rb_str_new2("Column binding cannot be done: <error message could not be retrieved>");
|
7249
|
+
}
|
6993
7250
|
return Qnil;
|
6994
7251
|
}
|
6995
7252
|
}
|
6996
7253
|
|
6997
7254
|
/* check if row_number is present */
|
6998
7255
|
if (data->arg_count == 2 && row_number > 0) {
|
6999
|
-
fetch_args =
|
7256
|
+
fetch_args = ALLOC( fetch_data_args );
|
7000
7257
|
memset(fetch_args,'\0',sizeof(struct _ibm_db_fetch_data_struct));
|
7001
7258
|
|
7002
7259
|
fetch_args->stmt_res = stmt_res;
|
@@ -7034,13 +7291,11 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7034
7291
|
}
|
7035
7292
|
#endif /*PASE*/
|
7036
7293
|
} else if (data->arg_count == 2 && row_number < 0) {
|
7037
|
-
data->error
|
7038
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
7039
|
-
sprintf(data->error, "Requested row number must be a positive value");
|
7294
|
+
*(data->error) = rb_str_new2("Requested row number must be a positive value");
|
7040
7295
|
return Qnil;
|
7041
7296
|
} else {
|
7042
7297
|
/*row_number is NULL or 0; just fetch next row*/
|
7043
|
-
fetch_args =
|
7298
|
+
fetch_args = ALLOC( fetch_data_args );
|
7044
7299
|
memset(fetch_args,'\0',sizeof(struct _ibm_db_fetch_data_struct));
|
7045
7300
|
|
7046
7301
|
fetch_args->stmt_res = stmt_res;
|
@@ -7058,9 +7313,11 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7058
7313
|
return Qfalse;
|
7059
7314
|
} else if ( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
|
7060
7315
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 0 );
|
7061
|
-
|
7062
|
-
|
7063
|
-
|
7316
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
7317
|
+
*(data->error) = rb_str_cat2(rb_str_new2("Fetch Failure: "), stmt_res->ruby_stmt_err_msg );
|
7318
|
+
} else {
|
7319
|
+
*(data->error) = rb_str_new2("Fetch Failure: <error message could not be retrieved>");
|
7320
|
+
}
|
7064
7321
|
return Qnil;
|
7065
7322
|
}
|
7066
7323
|
/* copy the data over return_value */
|
@@ -7077,10 +7334,10 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7077
7334
|
|
7078
7335
|
switch(stmt_res->s_case_mode) {
|
7079
7336
|
case CASE_LOWER:
|
7080
|
-
|
7337
|
+
strtolower((char*)stmt_res->column_info[i].name, strlen((char*)stmt_res->column_info[i].name));
|
7081
7338
|
break;
|
7082
7339
|
case CASE_UPPER:
|
7083
|
-
|
7340
|
+
strtoupper((char*)stmt_res->column_info[i].name, strlen((char*)stmt_res->column_info[i].name));
|
7084
7341
|
break;
|
7085
7342
|
case CASE_NATURAL:
|
7086
7343
|
default:
|
@@ -7105,20 +7362,18 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7105
7362
|
/* i5/OS will xlate from EBCIDIC to ASCII (via SQLGetData) */
|
7106
7363
|
tmp_length = stmt_res->column_info[i].size;
|
7107
7364
|
out_ptr = (SQLPOINTER)ALLOC_N(char, tmp_length+1);
|
7108
|
-
memset(out_ptr,0,tmp_length+1);
|
7109
7365
|
if ( out_ptr == NULL ) {
|
7110
|
-
|
7111
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
7112
|
-
sprintf(data->error, "Failed to allocate Memory");
|
7366
|
+
rb_warn( "Failed to allocate Memory");
|
7113
7367
|
return Qnil;
|
7114
7368
|
}
|
7369
|
+
memset(out_ptr,'\0',tmp_length+1);
|
7115
7370
|
rc = _ruby_ibm_db_get_data(stmt_res, i+1, SQL_C_CHAR, out_ptr, tmp_length+1, &out_length);
|
7116
7371
|
if ( rc == SQL_ERROR ) {
|
7117
7372
|
ruby_xfree( out_ptr );
|
7373
|
+
out_ptr = NULL;
|
7118
7374
|
return Qfalse;
|
7119
7375
|
}
|
7120
7376
|
if (out_length == SQL_NULL_DATA) {
|
7121
|
-
ruby_xfree( out_ptr );
|
7122
7377
|
if ( op & FETCH_ASSOC ) {
|
7123
7378
|
rb_hash_aset(return_value, rb_str_new2((char*)stmt_res->column_info[i].name), Qnil);
|
7124
7379
|
}
|
@@ -7134,6 +7389,8 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7134
7389
|
rb_ary_store(return_value, i, rb_str_new2((char *)out_ptr));
|
7135
7390
|
}
|
7136
7391
|
}
|
7392
|
+
ruby_xfree( out_ptr );
|
7393
|
+
out_ptr = NULL;
|
7137
7394
|
break;
|
7138
7395
|
#endif /* PASE */
|
7139
7396
|
case SQL_TYPE_DATE:
|
@@ -7268,7 +7525,9 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7268
7525
|
rc = _ruby_ibm_db_get_data2(stmt_res, i+1, lob_bind_type, (char *)out_ptr, tmp_length, tmp_length, &out_length);
|
7269
7526
|
if (rc == SQL_ERROR) {
|
7270
7527
|
ruby_xfree( out_ptr );
|
7528
|
+
out_ptr = NULL;
|
7271
7529
|
out_length = 0;
|
7530
|
+
return Qfalse;
|
7272
7531
|
}
|
7273
7532
|
|
7274
7533
|
if ( op & FETCH_ASSOC ) {
|
@@ -7279,6 +7538,10 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7279
7538
|
} else if ( op == FETCH_BOTH ) {
|
7280
7539
|
rb_hash_aset(return_value, INT2NUM(i), rb_str_new((char*)out_ptr, out_length));
|
7281
7540
|
}
|
7541
|
+
|
7542
|
+
ruby_xfree( out_ptr );
|
7543
|
+
out_ptr = NULL;
|
7544
|
+
out_length = 0;
|
7282
7545
|
break;
|
7283
7546
|
default:
|
7284
7547
|
break;
|
@@ -7299,9 +7562,11 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7299
7562
|
rc = _ruby_ibm_db_get_data(stmt_res, i+1, SQL_C_BINARY, NULL, 0, (SQLINTEGER *)&tmp_length);
|
7300
7563
|
|
7301
7564
|
if ( rc == SQL_ERROR ) {
|
7302
|
-
|
7303
|
-
|
7304
|
-
|
7565
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
7566
|
+
*(data->error) = rb_str_cat2(rb_str_new2("Failed to Determine XML Size: "), stmt_res->ruby_stmt_err_msg );
|
7567
|
+
} else {
|
7568
|
+
*(data->error) = rb_str_new2("Failed to Determine XML Size: <error message could not be retrieved>");
|
7569
|
+
}
|
7305
7570
|
return Qnil;
|
7306
7571
|
}
|
7307
7572
|
|
@@ -7318,14 +7583,13 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7318
7583
|
out_ptr = (SQLPOINTER)ALLOC_N(char, tmp_length);
|
7319
7584
|
|
7320
7585
|
if ( out_ptr == NULL ) {
|
7321
|
-
|
7322
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
7323
|
-
sprintf(data->error,"Failed to Allocate Memory for XML Data");
|
7586
|
+
rb_warn( "Failed to Allocate Memory for XML Data" );
|
7324
7587
|
return Qnil;
|
7325
7588
|
}
|
7326
7589
|
rc = _ruby_ibm_db_get_data(stmt_res, i+1, SQL_C_BINARY, out_ptr, tmp_length, &out_length);
|
7327
7590
|
if (rc == SQL_ERROR) {
|
7328
7591
|
ruby_xfree( out_ptr );
|
7592
|
+
out_ptr = NULL;
|
7329
7593
|
return Qfalse;
|
7330
7594
|
}
|
7331
7595
|
|
@@ -7337,6 +7601,8 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7337
7601
|
} else if ( op == FETCH_BOTH ) {
|
7338
7602
|
rb_hash_aset(return_value, INT2NUM(i), rb_str_new((char *)out_ptr, out_length));
|
7339
7603
|
}
|
7604
|
+
ruby_xfree( out_ptr );
|
7605
|
+
out_ptr = NULL;
|
7340
7606
|
}
|
7341
7607
|
break;
|
7342
7608
|
|
@@ -7365,16 +7631,16 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7365
7631
|
out_ptr = (SQLPOINTER)ALLOC_N(char, tmp_length+1);
|
7366
7632
|
|
7367
7633
|
if ( out_ptr == NULL ) {
|
7368
|
-
|
7369
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
7370
|
-
sprintf(data->error,"Failed to Allocate Memory for LOB Data");
|
7634
|
+
rb_warn( "Failed to Allocate Memory for LOB Data" );
|
7371
7635
|
return Qnil;
|
7372
7636
|
}
|
7373
7637
|
|
7374
7638
|
rc = _ruby_ibm_db_get_data2(stmt_res, i+1, SQL_C_CHAR, out_ptr, tmp_length, tmp_length+1, &out_length);
|
7375
7639
|
if (rc == SQL_ERROR) {
|
7376
7640
|
ruby_xfree( out_ptr );
|
7641
|
+
out_ptr = NULL;
|
7377
7642
|
out_length = 0;
|
7643
|
+
return Qfalse;
|
7378
7644
|
} else {
|
7379
7645
|
out_ptr[tmp_length] = '\0';
|
7380
7646
|
}
|
@@ -7387,6 +7653,8 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
7387
7653
|
} else if ( op == FETCH_BOTH ) {
|
7388
7654
|
rb_hash_aset(return_value, INT2NUM(i), rb_str_new((char*)out_ptr, out_length));
|
7389
7655
|
}
|
7656
|
+
ruby_xfree( out_ptr );
|
7657
|
+
out_ptr = NULL;
|
7390
7658
|
}
|
7391
7659
|
break;
|
7392
7660
|
|
@@ -7418,14 +7686,16 @@ static int _ruby_ibm_db_fetch_row_helper( ibm_db_fetch_helper_args *data) {
|
|
7418
7686
|
/* get column header info*/
|
7419
7687
|
if ( stmt_res->column_info == NULL ) {
|
7420
7688
|
if (_ruby_ibm_db_get_result_set_info(stmt_res)<0) {
|
7421
|
-
|
7422
|
-
|
7423
|
-
|
7689
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
7690
|
+
*(data->error) = rb_str_cat2(rb_str_new2("Column information cannot be retrieved: "), stmt_res->ruby_stmt_err_msg );
|
7691
|
+
} else {
|
7692
|
+
*(data->error) = rb_str_new2("Column information cannot be retrieved: <error message could not be retrieved>");
|
7693
|
+
}
|
7424
7694
|
return Qnil;
|
7425
7695
|
}
|
7426
7696
|
}
|
7427
7697
|
|
7428
|
-
fetch_args =
|
7698
|
+
fetch_args = ALLOC( fetch_data_args );
|
7429
7699
|
memset(fetch_args,'\0',sizeof(struct _ibm_db_fetch_data_struct));
|
7430
7700
|
|
7431
7701
|
fetch_args->stmt_res = stmt_res;
|
@@ -7452,9 +7722,7 @@ static int _ruby_ibm_db_fetch_row_helper( ibm_db_fetch_helper_args *data) {
|
|
7452
7722
|
}
|
7453
7723
|
#endif /*PASE*/
|
7454
7724
|
} else if (data->arg_count == 2 && row_number < 0) {
|
7455
|
-
data->error
|
7456
|
-
memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
|
7457
|
-
sprintf(data->error, "Requested row number must be a positive value");
|
7725
|
+
*(data->error) = rb_str_new2("Requested row number must be a positive value");
|
7458
7726
|
return Qnil;
|
7459
7727
|
} else {
|
7460
7728
|
/*row_number is NULL or 0; just fetch next row*/
|
@@ -7513,11 +7781,9 @@ VALUE ibm_db_fetch_row(int argc, VALUE *argv, VALUE self)
|
|
7513
7781
|
VALUE stmt = Qnil;
|
7514
7782
|
VALUE ret_val = Qnil;
|
7515
7783
|
|
7516
|
-
|
7784
|
+
VALUE error = Qnil;
|
7517
7785
|
stmt_handle *stmt_res = NULL;
|
7518
7786
|
|
7519
|
-
char diagnose_msg[DB2_MAX_ERR_MSG_LEN + 30];
|
7520
|
-
|
7521
7787
|
ibm_db_fetch_helper_args *helper_args = NULL;
|
7522
7788
|
|
7523
7789
|
rb_scan_args(argc, argv, "11", &stmt, &row_number);
|
@@ -7529,13 +7795,13 @@ VALUE ibm_db_fetch_row(int argc, VALUE *argv, VALUE self)
|
|
7529
7795
|
return Qfalse;
|
7530
7796
|
}
|
7531
7797
|
|
7532
|
-
helper_args =
|
7798
|
+
helper_args = ALLOC( ibm_db_fetch_helper_args );
|
7533
7799
|
memset(helper_args,'\0',sizeof(struct _ibm_db_fetch_helper_struct));
|
7534
7800
|
|
7535
7801
|
helper_args->stmt_res = stmt_res;
|
7536
7802
|
helper_args->row_number = row_number;
|
7537
7803
|
helper_args->arg_count = argc;
|
7538
|
-
helper_args->error =
|
7804
|
+
helper_args->error = &error;
|
7539
7805
|
|
7540
7806
|
#ifdef GIL_RELEASE_VERSION
|
7541
7807
|
ret_val = rb_thread_blocking_region( (void *)_ruby_ibm_db_fetch_row_helper, helper_args,
|
@@ -7544,18 +7810,14 @@ VALUE ibm_db_fetch_row(int argc, VALUE *argv, VALUE self)
|
|
7544
7810
|
ret_val = _ruby_ibm_db_fetch_row_helper( helper_args );
|
7545
7811
|
#endif
|
7546
7812
|
|
7547
|
-
error = helper_args->error;
|
7548
|
-
|
7549
7813
|
/*Free Memory Allocated*/
|
7550
7814
|
if ( helper_args != NULL) {
|
7551
7815
|
ruby_xfree( helper_args );
|
7552
7816
|
helper_args = NULL;
|
7553
7817
|
}
|
7554
7818
|
|
7555
|
-
if( error !=
|
7556
|
-
|
7557
|
-
ruby_xfree( error );
|
7558
|
-
rb_throw(diagnose_msg,Qnil);
|
7819
|
+
if( error != Qnil && ret_val == Qnil ) {
|
7820
|
+
rb_throw( RSTRING_PTR(error),Qnil );
|
7559
7821
|
}
|
7560
7822
|
|
7561
7823
|
return ret_val;
|
@@ -7590,8 +7852,7 @@ VALUE ibm_db_fetch_assoc(int argc, VALUE *argv, VALUE self) {
|
|
7590
7852
|
VALUE stmt = Qnil;
|
7591
7853
|
VALUE ret_val = Qnil;
|
7592
7854
|
|
7593
|
-
|
7594
|
-
char diagnose_msg[DB2_MAX_ERR_MSG_LEN + 30];
|
7855
|
+
VALUE error = Qnil;
|
7595
7856
|
|
7596
7857
|
stmt_handle *stmt_res = NULL;
|
7597
7858
|
|
@@ -7606,13 +7867,13 @@ VALUE ibm_db_fetch_assoc(int argc, VALUE *argv, VALUE self) {
|
|
7606
7867
|
return Qfalse;
|
7607
7868
|
}
|
7608
7869
|
|
7609
|
-
helper_args =
|
7870
|
+
helper_args = ALLOC( ibm_db_fetch_helper_args );
|
7610
7871
|
memset(helper_args,'\0',sizeof(struct _ibm_db_fetch_helper_struct));
|
7611
7872
|
|
7612
7873
|
helper_args->stmt_res = stmt_res;
|
7613
7874
|
helper_args->row_number = row_number;
|
7614
7875
|
helper_args->arg_count = argc;
|
7615
|
-
helper_args->error =
|
7876
|
+
helper_args->error = &error;
|
7616
7877
|
helper_args->funcType = FETCH_ASSOC;
|
7617
7878
|
|
7618
7879
|
#ifdef GIL_RELEASE_VERSION
|
@@ -7622,18 +7883,14 @@ VALUE ibm_db_fetch_assoc(int argc, VALUE *argv, VALUE self) {
|
|
7622
7883
|
ret_val = _ruby_ibm_db_bind_fetch_helper( helper_args );
|
7623
7884
|
#endif
|
7624
7885
|
|
7625
|
-
error = helper_args->error;
|
7626
|
-
|
7627
7886
|
/*Free Memory Allocated*/
|
7628
7887
|
if ( helper_args != NULL) {
|
7629
7888
|
ruby_xfree( helper_args );
|
7630
7889
|
helper_args = NULL;
|
7631
7890
|
}
|
7632
7891
|
|
7633
|
-
if( error !=
|
7634
|
-
|
7635
|
-
ruby_xfree( error );
|
7636
|
-
rb_throw( error, Qnil );
|
7892
|
+
if( error != Qnil && ret_val == Qnil ) {
|
7893
|
+
rb_throw( RSTRING_PTR(error), Qnil );
|
7637
7894
|
}
|
7638
7895
|
|
7639
7896
|
return ret_val;
|
@@ -7674,12 +7931,11 @@ VALUE ibm_db_fetch_assoc(int argc, VALUE *argv, VALUE self) {
|
|
7674
7931
|
*/
|
7675
7932
|
VALUE ibm_db_fetch_object(int argc, VALUE *argv, VALUE self)
|
7676
7933
|
{
|
7677
|
-
VALUE
|
7678
|
-
VALUE
|
7679
|
-
VALUE
|
7934
|
+
VALUE row_number = Qnil;
|
7935
|
+
VALUE stmt = Qnil;
|
7936
|
+
VALUE ret_val = Qnil;
|
7680
7937
|
|
7681
|
-
|
7682
|
-
char diagnose_msg[DB2_MAX_ERR_MSG_LEN + 30];
|
7938
|
+
VALUE error = Qnil;
|
7683
7939
|
|
7684
7940
|
stmt_handle *stmt_res = NULL;
|
7685
7941
|
|
@@ -7698,13 +7954,13 @@ VALUE ibm_db_fetch_object(int argc, VALUE *argv, VALUE self)
|
|
7698
7954
|
|
7699
7955
|
row_res = ALLOC(row_hash_struct);
|
7700
7956
|
|
7701
|
-
helper_args =
|
7957
|
+
helper_args = ALLOC( ibm_db_fetch_helper_args );
|
7702
7958
|
memset(helper_args,'\0',sizeof(struct _ibm_db_fetch_helper_struct));
|
7703
7959
|
|
7704
7960
|
helper_args->stmt_res = stmt_res;
|
7705
7961
|
helper_args->row_number = row_number;
|
7706
7962
|
helper_args->arg_count = argc;
|
7707
|
-
helper_args->error =
|
7963
|
+
helper_args->error = &error;
|
7708
7964
|
helper_args->funcType = FETCH_ASSOC;
|
7709
7965
|
|
7710
7966
|
#ifdef GIL_RELEASE_VERSION
|
@@ -7714,18 +7970,14 @@ VALUE ibm_db_fetch_object(int argc, VALUE *argv, VALUE self)
|
|
7714
7970
|
row_res->hash = _ruby_ibm_db_bind_fetch_helper( helper_args );
|
7715
7971
|
#endif
|
7716
7972
|
|
7717
|
-
error = helper_args->error;
|
7718
|
-
|
7719
7973
|
/*Free Memory Allocated*/
|
7720
7974
|
if ( helper_args != NULL) {
|
7721
7975
|
ruby_xfree( helper_args );
|
7722
7976
|
helper_args = NULL;
|
7723
7977
|
}
|
7724
7978
|
|
7725
|
-
if( error !=
|
7726
|
-
|
7727
|
-
ruby_xfree( error );
|
7728
|
-
rb_throw( error, Qnil );
|
7979
|
+
if( error != Qnil && ret_val == Qnil ) {
|
7980
|
+
rb_throw( RSTRING_PTR(error), Qnil );
|
7729
7981
|
}
|
7730
7982
|
|
7731
7983
|
if (RTEST(row_res->hash)) {
|
@@ -7734,6 +7986,7 @@ VALUE ibm_db_fetch_object(int argc, VALUE *argv, VALUE self)
|
|
7734
7986
|
row_res);
|
7735
7987
|
} else {
|
7736
7988
|
ruby_xfree( row_res );
|
7989
|
+
row_res = NULL;
|
7737
7990
|
return Qfalse;
|
7738
7991
|
}
|
7739
7992
|
}
|
@@ -7769,11 +8022,9 @@ VALUE ibm_db_fetch_array(int argc, VALUE *argv, VALUE self)
|
|
7769
8022
|
VALUE stmt = Qnil;
|
7770
8023
|
VALUE ret_val = Qnil;
|
7771
8024
|
|
7772
|
-
|
8025
|
+
VALUE error = Qnil;
|
7773
8026
|
stmt_handle *stmt_res = NULL;
|
7774
8027
|
|
7775
|
-
char diagnose_msg[DB2_MAX_ERR_MSG_LEN + 30];
|
7776
|
-
|
7777
8028
|
ibm_db_fetch_helper_args *helper_args = NULL;
|
7778
8029
|
|
7779
8030
|
rb_scan_args(argc, argv, "11", &stmt, &row_number);
|
@@ -7785,13 +8036,13 @@ VALUE ibm_db_fetch_array(int argc, VALUE *argv, VALUE self)
|
|
7785
8036
|
return Qfalse;
|
7786
8037
|
}
|
7787
8038
|
|
7788
|
-
helper_args =
|
8039
|
+
helper_args = ALLOC( ibm_db_fetch_helper_args );
|
7789
8040
|
memset(helper_args,'\0',sizeof(struct _ibm_db_fetch_helper_struct));
|
7790
8041
|
|
7791
8042
|
helper_args->stmt_res = stmt_res;
|
7792
8043
|
helper_args->row_number = row_number;
|
7793
8044
|
helper_args->arg_count = argc;
|
7794
|
-
helper_args->error =
|
8045
|
+
helper_args->error = &error;
|
7795
8046
|
helper_args->funcType = FETCH_INDEX;
|
7796
8047
|
|
7797
8048
|
#ifdef GIL_RELEASE_VERSION
|
@@ -7801,18 +8052,14 @@ VALUE ibm_db_fetch_array(int argc, VALUE *argv, VALUE self)
|
|
7801
8052
|
ret_val = _ruby_ibm_db_bind_fetch_helper( helper_args );
|
7802
8053
|
#endif
|
7803
8054
|
|
7804
|
-
error = helper_args->error;
|
7805
|
-
|
7806
8055
|
/*Free Memory Allocated*/
|
7807
8056
|
if ( helper_args != NULL) {
|
7808
8057
|
ruby_xfree( helper_args );
|
7809
8058
|
helper_args = NULL;
|
7810
8059
|
}
|
7811
8060
|
|
7812
|
-
if( error !=
|
7813
|
-
|
7814
|
-
ruby_xfree( error );
|
7815
|
-
rb_throw( error, Qnil );
|
8061
|
+
if( error != Qnil && ret_val == Qnil ) {
|
8062
|
+
rb_throw( RSTRING_PTR(error), Qnil );
|
7816
8063
|
}
|
7817
8064
|
|
7818
8065
|
return ret_val;
|
@@ -7851,11 +8098,9 @@ VALUE ibm_db_fetch_both(int argc, VALUE *argv, VALUE self)
|
|
7851
8098
|
VALUE stmt = Qnil;
|
7852
8099
|
VALUE ret_val = Qnil;
|
7853
8100
|
|
7854
|
-
|
8101
|
+
VALUE error = Qnil;
|
7855
8102
|
stmt_handle *stmt_res = NULL;
|
7856
8103
|
|
7857
|
-
char diagnose_msg[DB2_MAX_ERR_MSG_LEN + 30];
|
7858
|
-
|
7859
8104
|
ibm_db_fetch_helper_args *helper_args = NULL;
|
7860
8105
|
|
7861
8106
|
rb_scan_args(argc, argv, "11", &stmt, &row_number);
|
@@ -7867,13 +8112,13 @@ VALUE ibm_db_fetch_both(int argc, VALUE *argv, VALUE self)
|
|
7867
8112
|
return Qfalse;
|
7868
8113
|
}
|
7869
8114
|
|
7870
|
-
helper_args =
|
8115
|
+
helper_args = ALLOC( ibm_db_fetch_helper_args );
|
7871
8116
|
memset(helper_args,'\0',sizeof(struct _ibm_db_fetch_helper_struct));
|
7872
8117
|
|
7873
8118
|
helper_args->stmt_res = stmt_res;
|
7874
8119
|
helper_args->row_number = row_number;
|
7875
8120
|
helper_args->arg_count = argc;
|
7876
|
-
helper_args->error =
|
8121
|
+
helper_args->error = &error;
|
7877
8122
|
helper_args->funcType = FETCH_BOTH;
|
7878
8123
|
|
7879
8124
|
#ifdef GIL_RELEASE_VERSION
|
@@ -7883,18 +8128,14 @@ VALUE ibm_db_fetch_both(int argc, VALUE *argv, VALUE self)
|
|
7883
8128
|
ret_val = _ruby_ibm_db_bind_fetch_helper( helper_args );
|
7884
8129
|
#endif
|
7885
8130
|
|
7886
|
-
error = helper_args->error;
|
7887
|
-
|
7888
8131
|
/*Free Memory Allocated*/
|
7889
8132
|
if ( helper_args != NULL) {
|
7890
8133
|
ruby_xfree( helper_args );
|
7891
8134
|
helper_args = NULL;
|
7892
8135
|
}
|
7893
8136
|
|
7894
|
-
if( error !=
|
7895
|
-
|
7896
|
-
ruby_xfree( error );
|
7897
|
-
rb_throw( error, Qnil );
|
8137
|
+
if( error != Qnil && ret_val == Qnil ) {
|
8138
|
+
rb_throw( RSTRING_PTR(error), Qnil );
|
7898
8139
|
}
|
7899
8140
|
|
7900
8141
|
return ret_val;
|
@@ -7936,7 +8177,7 @@ VALUE ibm_db_set_option(int argc, VALUE *argv, VALUE self)
|
|
7936
8177
|
int rc = 0;
|
7937
8178
|
long type = 0;
|
7938
8179
|
|
7939
|
-
|
8180
|
+
VALUE error = Qnil;
|
7940
8181
|
|
7941
8182
|
rb_scan_args(argc, argv, "3", &conn_or_stmt, &r_options, &r_type);
|
7942
8183
|
|
@@ -7947,9 +8188,9 @@ VALUE ibm_db_set_option(int argc, VALUE *argv, VALUE self)
|
|
7947
8188
|
Data_Get_Struct(conn_or_stmt, conn_handle, conn_res);
|
7948
8189
|
|
7949
8190
|
if ( !NIL_P(r_options) ) {
|
7950
|
-
rc = _ruby_ibm_db_parse_options( r_options, SQL_HANDLE_DBC, conn_res, error );
|
8191
|
+
rc = _ruby_ibm_db_parse_options( r_options, SQL_HANDLE_DBC, conn_res, &error );
|
7951
8192
|
if (rc == SQL_ERROR) {
|
7952
|
-
rb_warn( error );
|
8193
|
+
rb_warn( RSTRING_PTR(error) );
|
7953
8194
|
return Qfalse;
|
7954
8195
|
}
|
7955
8196
|
}
|
@@ -7957,9 +8198,9 @@ VALUE ibm_db_set_option(int argc, VALUE *argv, VALUE self)
|
|
7957
8198
|
Data_Get_Struct( conn_or_stmt, stmt_handle, stmt_res );
|
7958
8199
|
|
7959
8200
|
if ( !NIL_P(r_options) ) {
|
7960
|
-
rc = _ruby_ibm_db_parse_options( r_options, SQL_HANDLE_STMT, stmt_res, error );
|
8201
|
+
rc = _ruby_ibm_db_parse_options( r_options, SQL_HANDLE_STMT, stmt_res, &error );
|
7961
8202
|
if (rc == SQL_ERROR) {
|
7962
|
-
rb_warn( error );
|
8203
|
+
rb_warn( RSTRING_PTR(error) );
|
7963
8204
|
return Qfalse;
|
7964
8205
|
}
|
7965
8206
|
}
|
@@ -7994,12 +8235,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
7994
8235
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
7995
8236
|
getInfo_args->buff_length = sizeof( buffer255 );
|
7996
8237
|
|
7997
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8238
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
7998
8239
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
7999
8240
|
|
8000
8241
|
if ( rc == SQL_ERROR ) {
|
8001
8242
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8002
|
-
ruby_xfree( getInfo_args );
|
8003
8243
|
return Qfalse;
|
8004
8244
|
} else {
|
8005
8245
|
rb_iv_set(return_value, "@DBMS_NAME", rb_str_new2(buffer255));
|
@@ -8010,12 +8250,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8010
8250
|
getInfo_args->infoValue = (SQLPOINTER)buffer11;
|
8011
8251
|
getInfo_args->buff_length = sizeof( buffer11 );
|
8012
8252
|
|
8013
|
-
memset(buffer11, 0, sizeof(buffer11));
|
8253
|
+
memset(buffer11, '\0', sizeof(buffer11));
|
8014
8254
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8015
8255
|
|
8016
8256
|
if ( rc == SQL_ERROR ) {
|
8017
8257
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8018
|
-
ruby_xfree( getInfo_args );
|
8019
8258
|
return Qfalse;
|
8020
8259
|
} else {
|
8021
8260
|
rb_iv_set(return_value, "@DBMS_VER", rb_str_new2(buffer11));
|
@@ -8033,7 +8272,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8033
8272
|
|
8034
8273
|
if ( rc == SQL_ERROR ) {
|
8035
8274
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8036
|
-
ruby_xfree( getInfo_args );
|
8037
8275
|
return Qfalse;
|
8038
8276
|
} else {
|
8039
8277
|
rb_iv_set(return_value, "@DB_CODEPAGE", INT2NUM(bufferint32));
|
@@ -8045,12 +8283,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8045
8283
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
8046
8284
|
getInfo_args->buff_length = sizeof( buffer255 );
|
8047
8285
|
|
8048
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8286
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
8049
8287
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8050
8288
|
|
8051
8289
|
if ( rc == SQL_ERROR ) {
|
8052
8290
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8053
|
-
ruby_xfree( getInfo_args );
|
8054
8291
|
return Qfalse;
|
8055
8292
|
} else {
|
8056
8293
|
rb_iv_set(return_value, "@DB_NAME", rb_str_new2(buffer255));
|
@@ -8062,12 +8299,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8062
8299
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
8063
8300
|
getInfo_args->buff_length = sizeof( buffer255 );
|
8064
8301
|
|
8065
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8302
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
8066
8303
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8067
8304
|
|
8068
8305
|
if ( rc == SQL_ERROR ) {
|
8069
8306
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8070
|
-
ruby_xfree( getInfo_args );
|
8071
8307
|
return Qfalse;
|
8072
8308
|
} else {
|
8073
8309
|
rb_iv_set(return_value, "@INST_NAME", rb_str_new2(buffer255));
|
@@ -8078,12 +8314,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8078
8314
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
8079
8315
|
getInfo_args->buff_length = sizeof( buffer255 );
|
8080
8316
|
|
8081
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8317
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
8082
8318
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8083
8319
|
|
8084
8320
|
if ( rc == SQL_ERROR ) {
|
8085
8321
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8086
|
-
ruby_xfree( getInfo_args );
|
8087
8322
|
return Qfalse;
|
8088
8323
|
} else {
|
8089
8324
|
rb_iv_set(return_value, "@SPECIAL_CHARS", rb_str_new2(buffer255));
|
@@ -8095,12 +8330,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8095
8330
|
getInfo_args->infoValue = (SQLPOINTER)buffer2k;
|
8096
8331
|
getInfo_args->buff_length = sizeof( buffer2k );
|
8097
8332
|
|
8098
|
-
memset(buffer2k, 0, sizeof(buffer2k));
|
8333
|
+
memset(buffer2k, '\0', sizeof(buffer2k));
|
8099
8334
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8100
8335
|
|
8101
8336
|
if ( rc == SQL_ERROR ) {
|
8102
8337
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8103
|
-
ruby_xfree( getInfo_args );
|
8104
8338
|
return Qfalse;
|
8105
8339
|
} else {
|
8106
8340
|
char *keyword, *last;
|
@@ -8130,7 +8364,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8130
8364
|
|
8131
8365
|
if ( rc == SQL_ERROR ) {
|
8132
8366
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8133
|
-
ruby_xfree( getInfo_args );
|
8134
8367
|
return Qfalse;
|
8135
8368
|
} else {
|
8136
8369
|
if( bitmask & SQL_TXN_READ_UNCOMMITTED ) {
|
@@ -8163,7 +8396,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8163
8396
|
|
8164
8397
|
if ( rc == SQL_ERROR ) {
|
8165
8398
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8166
|
-
ruby_xfree( getInfo_args );
|
8167
8399
|
return Qfalse;
|
8168
8400
|
} else {
|
8169
8401
|
VALUE array;
|
@@ -8200,7 +8432,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8200
8432
|
|
8201
8433
|
if ( rc == SQL_ERROR ) {
|
8202
8434
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8203
|
-
ruby_xfree( getInfo_args);
|
8204
8435
|
return Qfalse;
|
8205
8436
|
} else {
|
8206
8437
|
switch (bufferint32) {
|
@@ -8227,12 +8458,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8227
8458
|
getInfo_args->infoValue = (SQLPOINTER)buffer11;
|
8228
8459
|
getInfo_args->buff_length = sizeof( buffer11 );
|
8229
8460
|
|
8230
|
-
memset(buffer11, 0, sizeof(buffer11));
|
8461
|
+
memset(buffer11, '\0', sizeof(buffer11));
|
8231
8462
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8232
8463
|
|
8233
8464
|
if ( rc == SQL_ERROR ) {
|
8234
8465
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8235
|
-
ruby_xfree( getInfo_args );
|
8236
8466
|
return Qfalse;
|
8237
8467
|
} else {
|
8238
8468
|
if( strcmp((char *)buffer11, "Y") == 0 ) {
|
@@ -8247,12 +8477,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8247
8477
|
getInfo_args->infoValue = (SQLPOINTER)buffer11;
|
8248
8478
|
getInfo_args->buff_length = sizeof( buffer11 );
|
8249
8479
|
|
8250
|
-
memset(buffer11, 0, sizeof(buffer11));
|
8480
|
+
memset(buffer11, '\0', sizeof(buffer11));
|
8251
8481
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8252
8482
|
|
8253
8483
|
if ( rc == SQL_ERROR ) {
|
8254
8484
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8255
|
-
ruby_xfree( getInfo_args );
|
8256
8485
|
return Qfalse;
|
8257
8486
|
} else {
|
8258
8487
|
rb_iv_set(return_value, "@IDENTIFIER_QUOTE_CHAR", rb_str_new2(buffer11));
|
@@ -8263,12 +8492,11 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8263
8492
|
getInfo_args->infoValue = (SQLPOINTER)buffer11;
|
8264
8493
|
getInfo_args->buff_length = sizeof( buffer11 );
|
8265
8494
|
|
8266
|
-
memset(buffer11, 0, sizeof(buffer11));
|
8495
|
+
memset(buffer11, '\0', sizeof(buffer11));
|
8267
8496
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8268
8497
|
|
8269
8498
|
if ( rc == SQL_ERROR ) {
|
8270
8499
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8271
|
-
ruby_xfree( getInfo_args );
|
8272
8500
|
return Qfalse;
|
8273
8501
|
} else {
|
8274
8502
|
if( strcmp(buffer11, "Y") == 0 ) {
|
@@ -8288,7 +8516,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8288
8516
|
|
8289
8517
|
if ( rc == SQL_ERROR ) {
|
8290
8518
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8291
|
-
ruby_xfree( getInfo_args );
|
8292
8519
|
return Qfalse;
|
8293
8520
|
} else {
|
8294
8521
|
rb_iv_set(return_value, "@MAX_COL_NAME_LEN", INT2NUM(bufferint16));
|
@@ -8304,7 +8531,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8304
8531
|
|
8305
8532
|
if ( rc == SQL_ERROR ) {
|
8306
8533
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8307
|
-
ruby_xfree( getInfo_args );
|
8308
8534
|
return Qfalse;
|
8309
8535
|
} else {
|
8310
8536
|
rb_iv_set(return_value, "@MAX_ROW_SIZE", INT2NUM(bufferint32));
|
@@ -8321,7 +8547,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8321
8547
|
|
8322
8548
|
if ( rc == SQL_ERROR ) {
|
8323
8549
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8324
|
-
ruby_xfree( getInfo_args );
|
8325
8550
|
return Qfalse;
|
8326
8551
|
} else {
|
8327
8552
|
rb_iv_set(return_value, "@MAX_IDENTIFIER_LEN", INT2NUM(bufferint16));
|
@@ -8337,7 +8562,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8337
8562
|
|
8338
8563
|
if ( rc == SQL_ERROR ) {
|
8339
8564
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8340
|
-
ruby_xfree( getInfo_args );
|
8341
8565
|
return Qfalse;
|
8342
8566
|
} else {
|
8343
8567
|
rb_iv_set(return_value, "@MAX_INDEX_SIZE", INT2NUM(bufferint32));
|
@@ -8353,7 +8577,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8353
8577
|
|
8354
8578
|
if ( rc == SQL_ERROR ) {
|
8355
8579
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8356
|
-
ruby_xfree( getInfo_args );
|
8357
8580
|
return Qfalse;
|
8358
8581
|
} else {
|
8359
8582
|
rb_iv_set(return_value, "@MAX_PROC_NAME_LEN", INT2NUM(bufferint16));
|
@@ -8369,7 +8592,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8369
8592
|
|
8370
8593
|
if ( rc == SQL_ERROR ) {
|
8371
8594
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8372
|
-
ruby_xfree( getInfo_args );
|
8373
8595
|
return Qfalse;
|
8374
8596
|
} else {
|
8375
8597
|
rb_iv_set(return_value, "@MAX_SCHEMA_NAME_LEN", INT2NUM(bufferint16));
|
@@ -8385,7 +8607,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8385
8607
|
|
8386
8608
|
if ( rc == SQL_ERROR ) {
|
8387
8609
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8388
|
-
ruby_xfree( getInfo_args );
|
8389
8610
|
return Qfalse;
|
8390
8611
|
} else {
|
8391
8612
|
rb_iv_set(return_value, "@MAX_STATEMENT_LEN", INT2NUM(bufferint32));
|
@@ -8401,7 +8622,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8401
8622
|
|
8402
8623
|
if ( rc == SQL_ERROR ) {
|
8403
8624
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8404
|
-
ruby_xfree( getInfo_args );
|
8405
8625
|
return Qfalse;
|
8406
8626
|
} else {
|
8407
8627
|
rb_iv_set(return_value, "@MAX_TABLE_NAME_LEN", INT2NUM(bufferint16));
|
@@ -8417,7 +8637,6 @@ static VALUE ibm_db_server_info_helper( get_info_args *getInfo_args ) {
|
|
8417
8637
|
|
8418
8638
|
if ( rc == SQL_ERROR ) {
|
8419
8639
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8420
|
-
ruby_xfree( getInfo_args );
|
8421
8640
|
return Qfalse;
|
8422
8641
|
} else {
|
8423
8642
|
VALUE rv = Qnil;
|
@@ -8526,7 +8745,7 @@ VALUE ibm_db_server_info(int argc, VALUE *argv, VALUE self)
|
|
8526
8745
|
return Qfalse;
|
8527
8746
|
}
|
8528
8747
|
|
8529
|
-
getInfo_args =
|
8748
|
+
getInfo_args = ALLOC( get_info_args );
|
8530
8749
|
memset(getInfo_args,'\0',sizeof(struct _ibm_db_get_info_struct));
|
8531
8750
|
|
8532
8751
|
getInfo_args->conn_res = conn_res;
|
@@ -8573,12 +8792,11 @@ static VALUE ibm_db_client_info_helper( get_info_args *getInfo_args) {
|
|
8573
8792
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
8574
8793
|
getInfo_args->buff_length = sizeof( buffer255 );
|
8575
8794
|
|
8576
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8795
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
8577
8796
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8578
8797
|
|
8579
8798
|
if ( rc == SQL_ERROR ) {
|
8580
8799
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8581
|
-
ruby_xfree( getInfo_args );
|
8582
8800
|
return Qfalse;
|
8583
8801
|
} else {
|
8584
8802
|
rb_iv_set(return_value, "@DRIVER_NAME", rb_str_new2(buffer255));
|
@@ -8589,12 +8807,11 @@ static VALUE ibm_db_client_info_helper( get_info_args *getInfo_args) {
|
|
8589
8807
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
8590
8808
|
getInfo_args->buff_length = sizeof( buffer255 );
|
8591
8809
|
|
8592
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8810
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
8593
8811
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8594
8812
|
|
8595
8813
|
if ( rc == SQL_ERROR ) {
|
8596
8814
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8597
|
-
ruby_xfree( getInfo_args );
|
8598
8815
|
return Qfalse;
|
8599
8816
|
} else {
|
8600
8817
|
rb_iv_set(return_value, "@DRIVER_VER", rb_str_new2(buffer255));
|
@@ -8605,12 +8822,11 @@ static VALUE ibm_db_client_info_helper( get_info_args *getInfo_args) {
|
|
8605
8822
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
8606
8823
|
getInfo_args->buff_length = sizeof( buffer255 );
|
8607
8824
|
|
8608
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8825
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
8609
8826
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8610
8827
|
|
8611
8828
|
if ( rc == SQL_ERROR ) {
|
8612
8829
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8613
|
-
ruby_xfree( getInfo_args );
|
8614
8830
|
return Qfalse;
|
8615
8831
|
} else {
|
8616
8832
|
rb_iv_set(return_value, "@DATA_SOURCE_NAME", rb_str_new2(buffer255));
|
@@ -8621,12 +8837,11 @@ static VALUE ibm_db_client_info_helper( get_info_args *getInfo_args) {
|
|
8621
8837
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
8622
8838
|
getInfo_args->buff_length = sizeof( buffer255 );
|
8623
8839
|
|
8624
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8840
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
8625
8841
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8626
8842
|
|
8627
8843
|
if ( rc == SQL_ERROR ) {
|
8628
8844
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8629
|
-
ruby_xfree( getInfo_args );
|
8630
8845
|
return Qfalse;
|
8631
8846
|
} else {
|
8632
8847
|
rb_iv_set(return_value, "@DRIVER_ODBC_VER", rb_str_new2(buffer255));
|
@@ -8638,12 +8853,11 @@ static VALUE ibm_db_client_info_helper( get_info_args *getInfo_args) {
|
|
8638
8853
|
getInfo_args->infoValue = (SQLPOINTER)buffer255;
|
8639
8854
|
getInfo_args->buff_length = sizeof( buffer255 );
|
8640
8855
|
|
8641
|
-
memset(buffer255, 0, sizeof(buffer255));
|
8856
|
+
memset(buffer255, '\0', sizeof(buffer255));
|
8642
8857
|
rc = _ruby_ibm_db_SQLGetInfo_helper( getInfo_args );
|
8643
8858
|
|
8644
8859
|
if ( rc == SQL_ERROR ) {
|
8645
8860
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8646
|
-
ruby_xfree( getInfo_args );
|
8647
8861
|
return Qfalse;
|
8648
8862
|
} else {
|
8649
8863
|
rb_iv_set(return_value, "@ODBC_VER", rb_str_new2(buffer255));
|
@@ -8660,7 +8874,6 @@ static VALUE ibm_db_client_info_helper( get_info_args *getInfo_args) {
|
|
8660
8874
|
|
8661
8875
|
if ( rc == SQL_ERROR ) {
|
8662
8876
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8663
|
-
ruby_xfree( getInfo_args );
|
8664
8877
|
return Qfalse;
|
8665
8878
|
} else {
|
8666
8879
|
switch (bufferint16) {
|
@@ -8690,7 +8903,6 @@ static VALUE ibm_db_client_info_helper( get_info_args *getInfo_args) {
|
|
8690
8903
|
|
8691
8904
|
if ( rc == SQL_ERROR ) {
|
8692
8905
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8693
|
-
ruby_xfree( getInfo_args );
|
8694
8906
|
return Qfalse;
|
8695
8907
|
} else {
|
8696
8908
|
rb_iv_set(return_value, "@APPL_CODEPAGE", INT2NUM(bufferint32));
|
@@ -8706,7 +8918,6 @@ static VALUE ibm_db_client_info_helper( get_info_args *getInfo_args) {
|
|
8706
8918
|
|
8707
8919
|
if ( rc == SQL_ERROR ) {
|
8708
8920
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 0 );
|
8709
|
-
ruby_xfree( getInfo_args );
|
8710
8921
|
return Qfalse;
|
8711
8922
|
} else {
|
8712
8923
|
rb_iv_set(return_value, "@CONN_CODEPAGE", INT2NUM(bufferint32));
|
@@ -8774,7 +8985,7 @@ VALUE ibm_db_client_info(int argc, VALUE *argv, VALUE self)
|
|
8774
8985
|
return Qfalse;
|
8775
8986
|
}
|
8776
8987
|
|
8777
|
-
getInfo_args =
|
8988
|
+
getInfo_args = ALLOC( get_info_args );
|
8778
8989
|
memset(getInfo_args,'\0',sizeof(struct _ibm_db_get_info_struct));
|
8779
8990
|
|
8780
8991
|
getInfo_args->conn_res = conn_res;
|
@@ -8834,7 +9045,7 @@ VALUE ibm_db_active(int argc, VALUE *argv, VALUE self)
|
|
8834
9045
|
if (!NIL_P(connection)) {
|
8835
9046
|
Data_Get_Struct(connection, conn_handle, conn_res);
|
8836
9047
|
#ifndef PASE
|
8837
|
-
get_handleAttr_args =
|
9048
|
+
get_handleAttr_args = ALLOC( get_handle_attr_args );
|
8838
9049
|
memset(get_handleAttr_args,'\0',sizeof(struct _ibm_db_get_handle_attr_struct));
|
8839
9050
|
|
8840
9051
|
get_handleAttr_args->handle = &( conn_res->hdbc );
|
@@ -8846,6 +9057,7 @@ VALUE ibm_db_active(int argc, VALUE *argv, VALUE self)
|
|
8846
9057
|
rc = _ruby_ibm_db_SQLGetConnectAttr_helper( get_handleAttr_args );
|
8847
9058
|
|
8848
9059
|
ruby_xfree( get_handleAttr_args );
|
9060
|
+
get_handleAttr_args = NULL;
|
8849
9061
|
|
8850
9062
|
if ( rc == SQL_ERROR ) {
|
8851
9063
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
@@ -8896,6 +9108,7 @@ VALUE ibm_db_get_option(int argc, VALUE *argv, VALUE self)
|
|
8896
9108
|
VALUE conn_or_stmt = Qnil;
|
8897
9109
|
VALUE option = Qnil;
|
8898
9110
|
VALUE r_type = Qnil;
|
9111
|
+
VALUE ret_val = Qnil;
|
8899
9112
|
|
8900
9113
|
SQLCHAR *value = NULL;
|
8901
9114
|
SQLINTEGER value_int = 0;
|
@@ -8927,8 +9140,9 @@ VALUE ibm_db_get_option(int argc, VALUE *argv, VALUE self)
|
|
8927
9140
|
op_integer=(SQLINTEGER)FIX2INT(option);
|
8928
9141
|
/* ACCTSTR_LEN is the largest possible length of the options to retrieve */
|
8929
9142
|
value = (SQLCHAR *)ALLOC_N(char, ACCTSTR_LEN + 1);
|
9143
|
+
memset(value,'\0', ACCTSTR_LEN + 1);
|
8930
9144
|
|
8931
|
-
get_handleAttr_args =
|
9145
|
+
get_handleAttr_args = ALLOC( get_handle_attr_args );
|
8932
9146
|
memset(get_handleAttr_args,'\0',sizeof(struct _ibm_db_get_handle_attr_struct));
|
8933
9147
|
|
8934
9148
|
get_handleAttr_args->handle = &( conn_res->hdbc );
|
@@ -8940,12 +9154,17 @@ VALUE ibm_db_get_option(int argc, VALUE *argv, VALUE self)
|
|
8940
9154
|
rc = _ruby_ibm_db_SQLGetConnectAttr_helper( get_handleAttr_args );
|
8941
9155
|
|
8942
9156
|
ruby_xfree( get_handleAttr_args );
|
9157
|
+
get_handleAttr_args = NULL;
|
8943
9158
|
|
8944
9159
|
if (rc == SQL_ERROR) {
|
8945
9160
|
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, -1, 1, 1 );
|
8946
|
-
|
9161
|
+
ret_val = Qfalse;
|
9162
|
+
} else {
|
9163
|
+
ret_val = rb_str_new2((char *)value);
|
8947
9164
|
}
|
8948
|
-
|
9165
|
+
ruby_xfree( value );
|
9166
|
+
value = NULL;
|
9167
|
+
return ret_val;
|
8949
9168
|
} else {
|
8950
9169
|
rb_warn("No options specified");
|
8951
9170
|
return Qfalse;
|
@@ -8959,7 +9178,7 @@ VALUE ibm_db_get_option(int argc, VALUE *argv, VALUE self)
|
|
8959
9178
|
op_integer=(SQLINTEGER)FIX2INT(option);
|
8960
9179
|
/* Checking that the option to get is the cursor type because that is what we support here */
|
8961
9180
|
if (op_integer == SQL_ATTR_CURSOR_TYPE) {
|
8962
|
-
get_handleAttr_args =
|
9181
|
+
get_handleAttr_args = ALLOC( get_handle_attr_args );
|
8963
9182
|
memset(get_handleAttr_args,'\0',sizeof(struct _ibm_db_get_handle_attr_struct));
|
8964
9183
|
|
8965
9184
|
get_handleAttr_args->handle = &( stmt_res->hstmt );
|
@@ -8971,6 +9190,7 @@ VALUE ibm_db_get_option(int argc, VALUE *argv, VALUE self)
|
|
8971
9190
|
rc = _ruby_ibm_db_SQLGetStmtAttr_helper( get_handleAttr_args );
|
8972
9191
|
|
8973
9192
|
ruby_xfree( get_handleAttr_args );
|
9193
|
+
get_handleAttr_args = NULL;
|
8974
9194
|
|
8975
9195
|
if (rc == SQL_ERROR) {
|
8976
9196
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
@@ -9017,7 +9237,9 @@ VALUE ibm_db_get_option(int argc, VALUE *argv, VALUE self)
|
|
9017
9237
|
*/
|
9018
9238
|
VALUE ibm_db_get_last_serial_value(int argc, VALUE *argv, VALUE self)
|
9019
9239
|
{
|
9020
|
-
VALUE stmt
|
9240
|
+
VALUE stmt = Qnil;
|
9241
|
+
VALUE ret_val = Qnil;
|
9242
|
+
|
9021
9243
|
char *value = NULL;
|
9022
9244
|
|
9023
9245
|
stmt_handle *stmt_res;
|
@@ -9034,7 +9256,7 @@ VALUE ibm_db_get_last_serial_value(int argc, VALUE *argv, VALUE self)
|
|
9034
9256
|
/* We allocate a buffer of size 31 as per recommendations from the CLI IDS team */
|
9035
9257
|
value = (char *) ALLOC_N(char, 31);
|
9036
9258
|
|
9037
|
-
get_handleAttr_args =
|
9259
|
+
get_handleAttr_args = ALLOC( get_handle_attr_args );
|
9038
9260
|
memset(get_handleAttr_args,'\0',sizeof(struct _ibm_db_get_handle_attr_struct));
|
9039
9261
|
|
9040
9262
|
get_handleAttr_args->handle = &( stmt_res->hstmt );
|
@@ -9046,12 +9268,17 @@ VALUE ibm_db_get_last_serial_value(int argc, VALUE *argv, VALUE self)
|
|
9046
9268
|
rc = _ruby_ibm_db_SQLGetStmtAttr_helper( get_handleAttr_args );
|
9047
9269
|
|
9048
9270
|
ruby_xfree( get_handleAttr_args );
|
9271
|
+
get_handleAttr_args = NULL;
|
9049
9272
|
|
9050
9273
|
if ( rc == SQL_ERROR ) {
|
9051
9274
|
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, (SQLHSTMT)stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, -1, 1, 1 );
|
9052
9275
|
return Qfalse;
|
9053
9276
|
}
|
9054
|
-
|
9277
|
+
ret_val = INT2NUM(atoi( value ));
|
9278
|
+
ruby_xfree( value );
|
9279
|
+
value = NULL;
|
9280
|
+
|
9281
|
+
return ret_val;
|
9055
9282
|
}
|
9056
9283
|
else {
|
9057
9284
|
rb_warn("Supplied statement handle is invalid");
|