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 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
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006, 2007, 2008, 2009 IBM Corporation
1
+ Copyright (c) 2006, 2007, 2008, 2009, 2010 IBM Corporation
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the "Software"),
@@ -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 (1.5.0) and Driver (1.5.0) (2009/08/21)
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 "1.5.0"
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, char *error );
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
- char *error;
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
- char *error;
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
- char *error;
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
- char *error;
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
- char *strtolower(char *data, int max) {
272
- while (max--) {
273
- data[max] = tolower(data[max]);
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
- char *strtoupper(char *data, int max) {
279
- while (max--) {
280
- data[max] = toupper(data[max]);
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
- ruby_xfree( handle );
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
- ruby_xfree( handle->column_info[i].name );
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 = 0;
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 _ruby_ibm_db_free_stmt_struct */
462
- static void _ruby_ibm_db_free_stmt_struct(stmt_handle *handle)
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
- rc = SQLFreeHandle( SQL_HANDLE_STMT, handle->hstmt );
485
+ if( !handle->is_freed ) {
486
+ rc = SQLFreeHandle( SQL_HANDLE_STMT, handle->hstmt );
468
487
 
469
- _ruby_ibm_db_free_result_struct( handle );
488
+ _ruby_ibm_db_free_result_struct( handle );
470
489
 
471
- if( handle->ruby_stmt_err_msg) {
472
- ruby_xfree( handle->ruby_stmt_err_msg );
473
- handle->ruby_stmt_err_msg = NULL;
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
- if( handle->ruby_stmt_err_state) {
477
- ruby_xfree( handle->ruby_stmt_err_state );
478
- handle->ruby_stmt_err_state = NULL;
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 = ALLOC_N(get_diagRec_args, sizeof(struct _ibm_db_get_diagRec_struct));
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, char *error )
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, char *error )
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
- sprintf(error,"ATTR_CASE attribute must be one of CASE_LOWER, CASE_UPPER, or CASE_NATURAL");
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
- sprintf(error,"ATTR_CASE attribute must be one of CASE_LOWER, CASE_UPPER, or CASE_NATURAL");
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
- sprintf(error,"Connection or statement handle must be passed in.");
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 = ALLOC_N(set_handle_attr_args,sizeof(struct _ibm_db_set_handle_attr_struct));
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
- sprintf(error,"Setting of statement attribute failed: %s", ((stmt_handle *)handle)->ruby_stmt_err_msg);
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
- sprintf(error,"Setting of statement attribute failed: %s", ((stmt_handle *)handle)->ruby_stmt_err_msg);
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 = ALLOC_N(set_handle_attr_args,sizeof(struct _ibm_db_set_handle_attr_struct));
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
- sprintf(error,"Setting of connection attribute failed: %s", ((conn_handle *)handle)->ruby_error_msg);
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
- sprintf(error,"Setting of connection attribute failed: %s", ((conn_handle *)handle)->ruby_error_msg);
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
- sprintf(error,"Connection or statement handle must be passed in.");
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, char *error )
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 *tmp_name;
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 = ALLOC_N(row_col_count_args,sizeof(struct _ibm_db_row_col_count_struct));
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 = ALLOC_N(describecol_args,sizeof(struct _ibm_db_describecol_args_struct));
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 = (SQLCHAR*)ALLOC_N(char, BUFSIZ);
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
- tmp_name = stmt_res->column_info[i].name;
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 = ALLOC_N(bind_col_args,sizeof(struct _ibm_db_bind_col_struct));
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
- char *error = data->error;
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 = ALLOC_N(set_handle_attr_args,sizeof(struct _ibm_db_set_handle_attr_struct));
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 = ALLOC_N(get_handle_attr_args,sizeof(struct _ibm_db_get_handle_attr_struct));
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
- sprintf(error,"Allocation of environment handle failed:%s", conn_res->ruby_error_msg);
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
- sprintf(error, "Setting of Environemnt Attribute during connection failed: %s",conn_res->ruby_error_msg);
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
- sprintf(error, "Allocation of connection handle failed: %s",conn_res->ruby_error_msg);
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
- sprintf(error, "Connection failed: %s",conn_res->ruby_error_msg);
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 = ALLOC_N(get_info_args,sizeof(struct _ibm_db_get_info_struct));
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
- char error[DB2_MAX_ERR_MSG_LEN + 28];
1824
+ VALUE error = Qnil;
1723
1825
 
1724
- rb_scan_args(argc, argv, "31", &r_db, &r_uid, &r_passwd, &options);
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 = ALLOC_N(connect_args, sizeof(struct _ibm_db_connect_args_struct));
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 = ALLOC_N(connect_helper_args, sizeof(struct _ibm_db_connect_helper_args_struct));
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 = conn_args;
1740
- helper_args->isPersistent = isPersistent;
1741
- helper_args->options = &options;
1742
- helper_args->error = 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 = ALLOC_N(exec_cum_prepare_args,sizeof(struct _ibm_db_exec_direct_args_struct));
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 = ALLOC_N(bind_col_args,sizeof(struct _ibm_db_bind_col_struct));
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 = ALLOC_N(fetch_data_args,sizeof(struct _ibm_db_fetch_data_struct));
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 = ALLOC_N(_rounding_mode,sizeof(struct _rounding_mode_struct));
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 = ALLOC_N(set_handle_attr_args,sizeof(struct _ibm_db_set_handle_attr_struct));
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
- sprintf(error, "Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
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
- sprintf(error, "Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
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
- sprintf(error, "Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
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
- sprintf(error, "Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
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 = ALLOC_N(describeparam_args,sizeof(struct _ibm_db_describeparam_args_struct));
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 = ALLOC_N(end_tran_args,sizeof(struct _ibm_db_end_tran_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(metadata_args,sizeof(struct _ibm_db_metadata_args_struct));
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 = ALLOC_N(end_tran_args,sizeof(struct _ibm_db_end_tran_args_struct));
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
- char error[100];
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 = ALLOC_N(exec_cum_prepare_args,sizeof(struct _ibm_db_exec_direct_args_struct));
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
- _ruby_ibm_db_free_stmt_struct( stmt_res );
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
- char error[100];
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 = ALLOC_N(exec_cum_prepare_args,sizeof(struct _ibm_db_exec_direct_args_struct));
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
- rb_warn( error );
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 = Qnil;
4233
- int rc = 0;
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 = ALLOC_N(free_stmt_args, sizeof( struct _ibm_db_free_stmt_struct ) );
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
- sprintf(error, "Statement Free Failed: %s", stmt_res->ruby_stmt_err_msg);
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
- sprintf(error, "Statement Prepare Failed: %s", conn_res->ruby_error_msg);
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 = ALLOC_N(bind_parameter_args,sizeof(struct _ibm_db_bind_parameter_struct));
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
- curr->svalue = rb_str2cstr( rb_big2str(*bind_data,10), &curr->ivalue );
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 = SQL_C_LONG;
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 = SQL_C_LONG;
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 = SQL_C_LONG;
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
- curr->svalue = rb_str2cstr( *bind_data, &curr->ivalue );
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 = memcpy(ALLOC_N(char, curr->ivalue+1), curr->svalue, origlen);
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 = memcpy(ALLOC_N(char, curr->ivalue+1), curr->svalue, curr->ivalue);
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, char *error ) {
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
- sprintf(error, "Binding Error 1: %s", stmt_res->ruby_stmt_err_msg );
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, char *error )
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, char *error )
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 = ALLOC_N(describeparam_args,sizeof(struct _ibm_db_describeparam_args_struct));
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
- sprintf(error, "Describe Param Failed: %s", stmt_res->ruby_stmt_err_msg );
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
- sprintf(error, "Binding Error 2: %s", stmt_res->ruby_stmt_err_msg );
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
- sprintf(error, "Binding Error 2: %s", stmt_res->ruby_stmt_err_msg );
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, char *error ) {
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
- sprintf(error, "%d params bound not matching %d required", numOpts, bind_array->num);
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
- sprintf(error, "%d params bound not matching %d required", numOpts, bind_array->num);
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
- char *error = NULL;
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 = ALLOC_N(free_stmt_args, sizeof( struct _ibm_db_free_stmt_struct ) );
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 = ALLOC_N(row_col_count_args,sizeof(struct _ibm_db_row_col_count_struct));
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
- sprintf(error, "Execute Failed due to: %s", stmt_res->ruby_stmt_err_msg );
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
- sprintf(error, "Param is not an array");
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
- return Qfalse;
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
- sprintf(error, "%d params bound not matching %d required", stmt_res->num_params, num);
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
- sprintf(error, "%d params bound not matching %d required", stmt_res->num_params, num);
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
- sprintf(error, "Parameters not bound");
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
- sprintf(error, "Statement Execute Failed: %s", stmt_res->ruby_stmt_err_msg );
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 = ALLOC_N(param_cum_put_data_args,sizeof(struct _ibm_db_param_and_put_data_struct));
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
- sprintf(error, "Sending data failed: %s", stmt_res->ruby_stmt_err_msg );
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
- char error[DB2_MAX_ERR_MSG_LEN + 23];
5243
+ VALUE error = Qnil;
5026
5244
 
5027
5245
  rb_scan_args(argc, argv, "11", &stmt, &parameters_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 = ALLOC_N(stmt_bind_array,sizeof(struct _stmt_bind_data_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 = &parameters_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, Qnil );
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
- return rb_str_new2(return_str);
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
- return rb_str_new2(return_str);
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
- return rb_str_new2(return_str);
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
- return rb_str_new2(return_str);
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 = ALLOC_N(next_result_args,sizeof(struct _ibm_db_next_result_args_struct));
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 = ALLOC_N(row_col_count_args,sizeof(struct _ibm_db_row_col_count_struct));
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
- sprintf(error, "Failed to retrieve the number of fields: %s", stmt_res->ruby_stmt_err_msg );
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
- row_col_count_args *row_count_args = NULL;
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 = ALLOC_N(row_col_count_args,sizeof(struct _ibm_db_row_col_count_struct));
5826
- memset(row_count_args,'\0',sizeof(struct _ibm_db_row_col_count_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
- sprintf(error, "Retrieval of number of rows failed: %s", stmt_res->ruby_stmt_err_msg );
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 = ALLOC_N( col_attr_args,sizeof(struct _ibm_db_col_attr_struct) );
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 = ALLOC_N( col_attr_args,sizeof(struct _ibm_db_col_attr_struct) );
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 = ALLOC_N(end_tran_args,sizeof(struct _ibm_db_end_tran_args_struct));
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 the indicated statement resource
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 = ALLOC_N(get_data_args, sizeof(struct _ibm_db_get_data_args_struct) );
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 = ALLOC_N(get_length_args, sizeof(struct _ibm_db_get_data_length_struct) );
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 = ALLOC_N(get_subString_args, sizeof(struct _ibm_db_get_data_subString_struct) );
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
6702
- memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
6703
- sprintf(data->error, "Column information cannot be retrieved: %s", stmt_res->ruby_stmt_err_msg );
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 = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- return rb_str_new2(out_char_ptr);
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- return rb_str_new((char*)out_ptr,out_length);
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- return rb_str_new((char*)out_ptr,out_length);
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
- char *error = NULL;
7159
+ VALUE error = Qnil;
6904
7160
 
6905
- result_args = ALLOC_N(ibm_db_result_args,sizeof(struct _ibm_db_result_args_struct));
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 = NULL;
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 != NULL && ret_val == Qnil) {
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
6980
- memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
6981
- sprintf(data->error, "Column information cannot be retrieved: %s", stmt_res->ruby_stmt_err_msg );
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
6991
- memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
6992
- sprintf(data->error, "Column binding cannot be done: %s", stmt_res->ruby_stmt_err_msg );
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 = ALLOC_N(fetch_data_args,sizeof(struct _ibm_db_fetch_data_struct));
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 = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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 = ALLOC_N(fetch_data_args,sizeof(struct _ibm_db_fetch_data_struct));
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
7062
- memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
7063
- sprintf(data->error, "Fetch Failure: %s", stmt_res->ruby_stmt_err_msg );
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
- stmt_res->column_info[i].name = (SQLCHAR*)strtolower((char*)stmt_res->column_info[i].name, strlen((char*)stmt_res->column_info[i].name));
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
- stmt_res->column_info[i].name = (SQLCHAR*)strtoupper((char*)stmt_res->column_info[i].name, strlen((char*)stmt_res->column_info[i].name));
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
7303
- memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
7304
- sprintf(data->error, "Failed to Determine XML Size: %s", stmt_res->ruby_stmt_err_msg );
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- data->error = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
7422
- memset(data->error, '\0', DB2_MAX_ERR_MSG_LEN + 30 );
7423
- sprintf(data->error, "Column information cannot be retrieved: %s", stmt_res->ruby_stmt_err_msg );
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 = ALLOC_N(fetch_data_args,sizeof(struct _ibm_db_fetch_data_struct));
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 = ALLOC_N(char, DB2_MAX_ERR_MSG_LEN + 30 );
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
- char *error = NULL;
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 = ALLOC_N(ibm_db_fetch_helper_args,sizeof(struct _ibm_db_fetch_helper_struct));
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 = NULL;
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 != NULL && ret_val == Qnil ) {
7556
- sprintf(diagnose_msg, "%s", error );
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
- char *error = NULL;
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 = ALLOC_N(ibm_db_fetch_helper_args,sizeof(struct _ibm_db_fetch_helper_struct));
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 = NULL;
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 != NULL && ret_val == Qnil ) {
7634
- sprintf(diagnose_msg, "%s", error );
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 row_number = Qnil;
7678
- VALUE stmt = Qnil;
7679
- VALUE ret_val = Qnil;
7934
+ VALUE row_number = Qnil;
7935
+ VALUE stmt = Qnil;
7936
+ VALUE ret_val = Qnil;
7680
7937
 
7681
- char *error = NULL;
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 = ALLOC_N(ibm_db_fetch_helper_args,sizeof(struct _ibm_db_fetch_helper_struct));
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 = NULL;
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 != NULL && ret_val == Qnil ) {
7726
- sprintf(diagnose_msg, "%s", error );
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
- char *error = NULL;
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 = ALLOC_N(ibm_db_fetch_helper_args,sizeof(struct _ibm_db_fetch_helper_struct));
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 = NULL;
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 != NULL && ret_val == Qnil ) {
7813
- sprintf(diagnose_msg, "%s", error );
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
- char *error = NULL;
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 = ALLOC_N(ibm_db_fetch_helper_args,sizeof(struct _ibm_db_fetch_helper_struct));
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 = NULL;
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 != NULL && ret_val == Qnil ) {
7895
- sprintf(diagnose_msg, "%s", error );
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
- char error[DB2_MAX_ERR_MSG_LEN];
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 = ALLOC_N(get_info_args,sizeof(struct _ibm_db_get_info_struct));
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 = ALLOC_N(get_info_args,sizeof(struct _ibm_db_get_info_struct));
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 = ALLOC_N(get_handle_attr_args,sizeof(struct _ibm_db_get_handle_attr_struct));
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 = ALLOC_N(get_handle_attr_args,sizeof(struct _ibm_db_get_handle_attr_struct));
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
- return Qfalse;
9161
+ ret_val = Qfalse;
9162
+ } else {
9163
+ ret_val = rb_str_new2((char *)value);
8947
9164
  }
8948
- return rb_str_new2((char *)value);
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 = ALLOC_N(get_handle_attr_args,sizeof(struct _ibm_db_get_handle_attr_struct));
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 = Qnil;
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 = ALLOC_N(get_handle_attr_args,sizeof(struct _ibm_db_get_handle_attr_struct));
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
- return INT2NUM(atoi( value ));
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");