db2 2.6.2 → 2.7.0
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 +17 -0
- data/README +79 -141
- data/ext/Makefile.nt32 +3 -3
- data/ext/Makefile.nt32.191 +212 -0
- data/ext/extconf.rb +75 -14
- data/ext/ibm_db.c +504 -47
- data/ext/ruby_ibm_db.h +4 -1
- data/ext/ruby_ibm_db_cli.c +108 -1
- data/ext/ruby_ibm_db_cli.h +54 -1
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +423 -124
- data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1 -1
- data/test/cases/adapter_test.rb +169 -164
- data/test/cases/associations/belongs_to_associations_test.rb +268 -43
- data/test/cases/associations/cascaded_eager_loading_test.rb +31 -33
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +90 -156
- data/test/cases/associations/join_model_test.rb +100 -150
- data/test/cases/attribute_methods_test.rb +259 -58
- data/test/cases/base_test.rb +785 -138
- data/test/cases/calculations_test.rb +128 -8
- data/test/cases/migration_test.rb +680 -286
- data/test/cases/persistence_test.rb +642 -0
- data/test/cases/query_cache_test.rb +257 -0
- data/test/cases/relations_test.rb +1182 -0
- data/test/cases/schema_dumper_test.rb +41 -17
- data/test/cases/transaction_callbacks_test.rb +300 -0
- data/test/cases/validations/uniqueness_validation_test.rb +38 -22
- data/test/cases/xml_serialization_test.rb +408 -0
- data/test/config.yml +154 -0
- data/test/connections/native_ibm_db/connection.rb +2 -0
- data/test/models/warehouse_thing.rb +4 -4
- data/test/schema/i5/ibm_db_specific_schema.rb +3 -1
- data/test/schema/ids/ibm_db_specific_schema.rb +3 -1
- data/test/schema/luw/ibm_db_specific_schema.rb +2 -0
- data/test/schema/schema.rb +196 -92
- data/test/schema/zOS/ibm_db_specific_schema.rb +3 -1
- metadata +73 -68
- data/.gitignore +0 -1
- data/test/cases/associations/eager_test.rb +0 -862
- data/test/cases/associations/has_many_through_associations_test.rb +0 -461
- data/test/cases/finder_test.rb +0 -1088
- data/test/cases/fixtures_test.rb +0 -684
data/ext/extconf.rb
CHANGED
@@ -3,19 +3,81 @@
|
|
3
3
|
# +----------------------------------------------------------------------+
|
4
4
|
# | Licensed Materials - Property of IBM |
|
5
5
|
# | |
|
6
|
-
# | (C) Copyright IBM Corporation 2006
|
6
|
+
# | (C) Copyright IBM Corporation 2006 - 2012 |
|
7
7
|
# +----------------------------------------------------------------------+
|
8
8
|
|
9
|
+
WIN = RUBY_PLATFORM =~ /mswin/ || RUBY_PLATFORM =~ /mingw/
|
10
|
+
|
11
|
+
# use ENV['IBM_DB_HOME'] or latest db2 you can find
|
12
|
+
IBM_DB_HOME = ENV['IBM_DB_HOME']
|
13
|
+
|
14
|
+
machine_bits = ['ibm'].pack('p').size * 8
|
15
|
+
|
16
|
+
is64Bit = true
|
17
|
+
|
18
|
+
module Kernel
|
19
|
+
def suppress_warnings
|
20
|
+
origVerbosity = $VERBOSE
|
21
|
+
$VERBOSE = nil
|
22
|
+
result = yield
|
23
|
+
$VERBOSE = origVerbosity
|
24
|
+
return result
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
if machine_bits == 64
|
29
|
+
is64Bit = true
|
30
|
+
puts "Detected 64-bit Ruby\n "
|
31
|
+
else
|
32
|
+
is64Bit = false
|
33
|
+
puts "Detected 32-bit Ruby\n "
|
34
|
+
end
|
35
|
+
|
36
|
+
if(IBM_DB_HOME == nil || IBM_DB_HOME == '')
|
37
|
+
IBM_DB_INCLUDE = ENV['IBM_DB_INCLUDE']
|
38
|
+
IBM_DB_LIB = ENV['IBM_DB_LIB']
|
39
|
+
|
40
|
+
if( ( (IBM_DB_INCLUDE.nil?) || (IBM_DB_LIB.nil?) ) ||
|
41
|
+
( IBM_DB_INCLUDE == '' || IBM_DB_LIB == '' )
|
42
|
+
)
|
43
|
+
puts "Environment variable IBM_DB_HOME is not set. Set it to your DB2/IBM_Data_Server_Driver installation directory and retry gem install.\n "
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
else
|
47
|
+
IBM_DB_INCLUDE = "#{IBM_DB_HOME}/include"
|
48
|
+
|
49
|
+
if(is64Bit)
|
50
|
+
IBM_DB_LIB="#{IBM_DB_HOME}/lib64"
|
51
|
+
else
|
52
|
+
IBM_DB_LIB="#{IBM_DB_HOME}/lib32"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
if( !(File.directory?(IBM_DB_LIB)) )
|
57
|
+
suppress_warnings{IBM_DB_LIB = "#{IBM_DB_HOME}/lib"}
|
58
|
+
if( !(File.directory?(IBM_DB_LIB)) )
|
59
|
+
puts "Cannot find #{IBM_DB_LIB} directory. Check if you have set the IBM_DB_HOME environment variable's value correctly\n "
|
60
|
+
exit 1
|
61
|
+
end
|
62
|
+
notifyString = "Detected usage of IBM Data Server Driver package. Ensure you have downloaded "
|
63
|
+
|
64
|
+
if(is64Bit)
|
65
|
+
notifyString = notifyString + "64-bit package "
|
66
|
+
else
|
67
|
+
notifyString = notifyString + "32-bit package "
|
68
|
+
end
|
69
|
+
notifyString = notifyString + "of IBM_Data_Server_Driver and retry the 'gem install ibm_db' command\n "
|
70
|
+
|
71
|
+
puts notifyString
|
72
|
+
end
|
73
|
+
|
74
|
+
if( !(File.directory?(IBM_DB_INCLUDE)) )
|
75
|
+
puts " #{IBM_DB_HOME}/include folder not found. Check if you have set the IBM_DB_HOME environment variable's value correctly\n "
|
76
|
+
exit 1
|
77
|
+
end
|
78
|
+
|
9
79
|
require 'mkmf'
|
10
|
-
|
11
|
-
|
12
|
-
# use ENV['DB2DIR'] or latest db2 you can find
|
13
|
-
# (we need to revisit default when db2 10.x comes out)
|
14
|
-
IBM_DB_INCLUDE = (ENV['IBM_DB_INCLUDE'] or
|
15
|
-
(Dir['/opt/*/db2/*/include'].sort_by {|f| File.basename(f)}).last )
|
16
|
-
IBM_DB_LIB = (ENV['IBM_DB_LIB'] or
|
17
|
-
(Dir['/opt/*/db2/*/lib32'].sort_by {|f| File.basename(f)}).last )
|
18
|
-
|
80
|
+
|
19
81
|
dir_config('IBM_DB',IBM_DB_INCLUDE,IBM_DB_LIB)
|
20
82
|
|
21
83
|
def crash(str)
|
@@ -30,18 +92,17 @@ end
|
|
30
92
|
|
31
93
|
unless (have_library(WIN ? 'db2cli' : 'db2','SQLConnect') or find_library(WIN ? 'db2cli' : 'db2','SQLConnect', IBM_DB_LIB))
|
32
94
|
crash(<<EOL)
|
33
|
-
Unable to locate
|
95
|
+
Unable to locate libdb2.so/a under #{IBM_DB_LIB}
|
34
96
|
|
35
97
|
Follow the steps below and retry
|
36
98
|
|
37
99
|
Step 1: - Install IBM DB2 Universal Database Server/Client
|
38
100
|
|
39
|
-
step 2: - Set the environment
|
101
|
+
step 2: - Set the environment variable IBM_DB_HOME as below
|
40
102
|
|
41
103
|
(assuming bash shell)
|
42
104
|
|
43
|
-
export
|
44
|
-
export IBM_DB_LIB=DB2HOME/lib (eg. /home/db2inst1/sqllib/lib or /opt/ibm/db2/V9.5/lib32)
|
105
|
+
export IBM_DB_HOME=<DB2/IBM_Data_Server_Driver installation directory> #(Eg: export IBM_DB_HOME=/opt/ibm/db2/v10)
|
45
106
|
|
46
107
|
step 3: - Retry gem install
|
47
108
|
|
data/ext/ibm_db.c
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
+----------------------------------------------------------------------+
|
13
13
|
*/
|
14
14
|
|
15
|
-
#define MODULE_RELEASE "2.5.
|
15
|
+
#define MODULE_RELEASE "2.5.10"
|
16
16
|
|
17
17
|
#ifdef HAVE_CONFIG_H
|
18
18
|
#include "config.h"
|
@@ -42,6 +42,7 @@ static void _ruby_ibm_db_clear_stmt_err_cache();
|
|
42
42
|
static int _ruby_ibm_db_set_decfloat_rounding_mode_client(SQLHANDLE hdbc);
|
43
43
|
static char *_ruby_ibm_db_instance_name;
|
44
44
|
static int is_systemi, is_informix; /* 1 == TRUE; 0 == FALSE; */
|
45
|
+
static int createDbSupported, dropDbSupported; /*1 == TRUE; 0 == FALSE*/
|
45
46
|
|
46
47
|
/* Strucure holding the necessary data to be passed to bind the list of elements passed to the execute function*/
|
47
48
|
typedef struct _stmt_bind_data_array {
|
@@ -188,6 +189,9 @@ void Init_ibm_db(void) {
|
|
188
189
|
mDB = rb_define_module("IBM_DB");
|
189
190
|
|
190
191
|
rb_define_module_function(mDB, "connect", ibm_db_connect, -1);
|
192
|
+
rb_define_module_function(mDB, "createDB", ibm_db_createDB, -1);
|
193
|
+
rb_define_module_function(mDB, "dropDB", ibm_db_dropDB, -1);
|
194
|
+
rb_define_module_function(mDB, "createDBNX", ibm_db_createDBNX, -1);
|
191
195
|
rb_define_module_function(mDB, "commit", ibm_db_commit, -1);
|
192
196
|
rb_define_module_function(mDB, "pconnect", ibm_db_pconnect, -1);
|
193
197
|
rb_define_module_function(mDB, "autocommit", ibm_db_autocommit, -1);
|
@@ -326,6 +330,54 @@ static void ruby_ibm_db_load_necessary_libs() {
|
|
326
330
|
rb_eval_string("require \'bigdecimal\'");
|
327
331
|
}
|
328
332
|
|
333
|
+
#ifdef _WIN32
|
334
|
+
static void ruby_ibm_db_check_sqlcreatedb(HINSTANCE cliLib) {
|
335
|
+
FARPROC sqlcreatedb;
|
336
|
+
sqlcreatedb = DLSYM( cliLib, "SQLCreateDbW" );
|
337
|
+
#else
|
338
|
+
static void ruby_ibm_db_check_sqlcreatedb(void *cliLib) {
|
339
|
+
typedef int (*sqlcreatedbType)( SQLHDBC, SQLWCHAR *, SQLINTEGER, SQLWCHAR *, SQLINTEGER, SQLWCHAR *, SQLINTEGER );
|
340
|
+
sqlcreatedbType sqlcreatedb;
|
341
|
+
sqlcreatedb = (sqlcreatedbType) DLSYM( cliLib, "SQLCreateDbW" );
|
342
|
+
#endif
|
343
|
+
if ( sqlcreatedb == NULL ) {
|
344
|
+
createDbSupported = 0;
|
345
|
+
dropDbSupported = 0;
|
346
|
+
} else {
|
347
|
+
createDbSupported = 1;
|
348
|
+
dropDbSupported = 1;
|
349
|
+
}
|
350
|
+
}
|
351
|
+
/*Check if specific functions are supported or not based on CLI being used
|
352
|
+
* For Eg: SQLCreateDB and SQLDropDB is supported only from V97fp3 onwards. In this function we open the CLI library
|
353
|
+
* using DLOpen and check if the function is defined. If yes then we allow the user to use the function,
|
354
|
+
* else throw a warning saying this is not supported
|
355
|
+
*/
|
356
|
+
static void ruby_ibm_db_check_if_cli_func_supported() {
|
357
|
+
#ifdef _WIN32
|
358
|
+
HINSTANCE cliLib = NULL;
|
359
|
+
#else
|
360
|
+
void *cliLib = NULL;
|
361
|
+
#endif
|
362
|
+
|
363
|
+
#ifdef _WIN32
|
364
|
+
cliLib = DLOPEN( LIBDB2 );
|
365
|
+
#elif _AIX
|
366
|
+
/* On AIX CLI library is in archive. Hence we will need to specify flags in DLOPEN to load a member of the archive*/
|
367
|
+
cliLib = DLOPEN( LIBDB2, RTLD_MEMBER | RTLD_LAZY );
|
368
|
+
#else
|
369
|
+
cliLib = DLOPEN( LIBDB2, RTLD_LAZY );
|
370
|
+
#endif
|
371
|
+
if ( !cliLib ) {
|
372
|
+
rb_warn("Could not load CLI library to check functionality support");
|
373
|
+
createDbSupported = 0;
|
374
|
+
dropDbSupported = 0;
|
375
|
+
return;
|
376
|
+
}
|
377
|
+
ruby_ibm_db_check_sqlcreatedb(cliLib);
|
378
|
+
DLCLOSE( cliLib );
|
379
|
+
}
|
380
|
+
|
329
381
|
static void ruby_ibm_db_init_globals(struct _ibm_db_globals *ibm_db_globals)
|
330
382
|
{
|
331
383
|
/* env handle */
|
@@ -848,6 +900,8 @@ void ruby_init_ibm_db()
|
|
848
900
|
rb_attr(le_server_info, rb_intern("NON_NULLABLE_COLUMNS"), 1, 0, 0);
|
849
901
|
|
850
902
|
ruby_ibm_db_load_necessary_libs();
|
903
|
+
|
904
|
+
ruby_ibm_db_check_if_cli_func_supported();
|
851
905
|
}
|
852
906
|
/* */
|
853
907
|
|
@@ -932,7 +986,7 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
932
986
|
|
933
987
|
if( release_gil == 1 ){
|
934
988
|
|
935
|
-
#ifdef
|
989
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
936
990
|
return_code = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLGetDiagRec_helper, get_DiagRec_args,
|
937
991
|
(void *)_ruby_ibm_db_Connection_level_UBF, NULL);
|
938
992
|
#else
|
@@ -1042,6 +1096,7 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
1042
1096
|
strncpy(conn_res->ruby_error_msg, (char*)errMsg, length );
|
1043
1097
|
#endif
|
1044
1098
|
conn_res->ruby_error_msg_len = length;
|
1099
|
+
conn_res->sqlcode = sqlcode;
|
1045
1100
|
break;
|
1046
1101
|
|
1047
1102
|
case SQL_HANDLE_STMT:
|
@@ -1082,6 +1137,7 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
1082
1137
|
strncpy(conn_res->ruby_error_msg, (char*)errMsg, length );
|
1083
1138
|
#endif
|
1084
1139
|
conn_res->ruby_error_msg_len = length;
|
1140
|
+
conn_res->sqlcode = sqlcode;
|
1085
1141
|
break;
|
1086
1142
|
|
1087
1143
|
case DB_STMT:
|
@@ -1119,6 +1175,7 @@ static void _ruby_ibm_db_check_sql_errors( void *conn_or_stmt, int resourceType,
|
|
1119
1175
|
strncpy(stmt_res->ruby_stmt_err_msg, (char*)errMsg, length );
|
1120
1176
|
#endif
|
1121
1177
|
stmt_res->ruby_stmt_err_msg_len = length;
|
1178
|
+
stmt_res->sqlcode = sqlcode;
|
1122
1179
|
break;
|
1123
1180
|
|
1124
1181
|
} /*End of switch( resourceType )*/
|
@@ -1683,6 +1740,13 @@ static int _ruby_ibm_db_bind_column_helper(stmt_handle *stmt_res)
|
|
1683
1740
|
*/
|
1684
1741
|
bindCol_args->buff_length = bindCol_args->buff_length * 2;
|
1685
1742
|
}
|
1743
|
+
|
1744
|
+
if( column_type == SQL_CHAR || column_type == SQL_VARCHAR ) {
|
1745
|
+
/* Multiply the size by 4 to handle cases where client and server code pages are different.
|
1746
|
+
* 4 bytes should be able to cover any codeset character known*/
|
1747
|
+
bindCol_args->buff_length = bindCol_args->buff_length * 4;
|
1748
|
+
}
|
1749
|
+
|
1686
1750
|
row_data->str_val = ALLOC_N(char, bindCol_args->buff_length);
|
1687
1751
|
#endif
|
1688
1752
|
bindCol_args->TargetValuePtr = row_data->str_val;
|
@@ -2435,7 +2499,7 @@ static VALUE _ruby_ibm_db_connect_helper( int argc, VALUE *argv, int isPersisten
|
|
2435
2499
|
}
|
2436
2500
|
|
2437
2501
|
/* Call the function where the actual logic is being run*/
|
2438
|
-
#ifdef
|
2502
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
2439
2503
|
return_value = rb_thread_blocking_region( (void *)_ruby_ibm_db_connect_helper2, helper_args,
|
2440
2504
|
(void *)_ruby_ibm_db_Connection_level_UBF, NULL);
|
2441
2505
|
#else
|
@@ -2776,6 +2840,366 @@ VALUE ibm_db_pconnect(int argc, VALUE *argv, VALUE self)
|
|
2776
2840
|
|
2777
2841
|
return _ruby_ibm_db_connect_helper( argc, argv, 1);
|
2778
2842
|
}
|
2843
|
+
/*
|
2844
|
+
* CreateDB helper
|
2845
|
+
*/
|
2846
|
+
VALUE ruby_ibm_db_createDb_helper(VALUE connection, VALUE dbName, VALUE codeSet, VALUE mode, int createNX) {
|
2847
|
+
|
2848
|
+
VALUE return_value = Qfalse;
|
2849
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
2850
|
+
VALUE dbName_utf16 = Qnil;
|
2851
|
+
VALUE codeSet_utf16 = Qnil;
|
2852
|
+
VALUE mode_utf16 = Qnil;
|
2853
|
+
#endif
|
2854
|
+
|
2855
|
+
int rc;
|
2856
|
+
|
2857
|
+
create_drop_db_args *create_db_args = NULL;
|
2858
|
+
conn_handle *conn_res;
|
2859
|
+
|
2860
|
+
if (!NIL_P(connection)) {
|
2861
|
+
Data_Get_Struct(connection, conn_handle, conn_res);
|
2862
|
+
|
2863
|
+
if( 0 == createDbSupported ) {
|
2864
|
+
rb_warn("Create Database not supported: This function is only supported from DB2 Client v97fp4 version and onwards");
|
2865
|
+
return Qfalse;
|
2866
|
+
}
|
2867
|
+
|
2868
|
+
if (!conn_res->handle_active) {
|
2869
|
+
rb_warn("Connection is not active");
|
2870
|
+
return Qfalse;
|
2871
|
+
}
|
2872
|
+
|
2873
|
+
if (!NIL_P(dbName)) {
|
2874
|
+
create_db_args = ALLOC( create_drop_db_args );
|
2875
|
+
memset(create_db_args,'\0',sizeof(struct _ibm_db_create_drop_db_args_struct));
|
2876
|
+
|
2877
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
2878
|
+
dbName_utf16 = _ruby_ibm_db_export_str_to_utf16(dbName);
|
2879
|
+
|
2880
|
+
create_db_args->dbName = (SQLWCHAR*)RSTRING_PTR(dbName_utf16);
|
2881
|
+
create_db_args->dbName_string_len = RSTRING_LEN(dbName_utf16)/sizeof(SQLWCHAR); /*RSTRING_LEN returns number of bytes*/
|
2882
|
+
|
2883
|
+
if(!NIL_P(codeSet)){
|
2884
|
+
codeSet_utf16 = _ruby_ibm_db_export_str_to_utf16(codeSet);
|
2885
|
+
create_db_args->codeSet = (SQLWCHAR*)RSTRING_PTR(codeSet_utf16);
|
2886
|
+
create_db_args->codeSet_string_len = RSTRING_LEN(codeSet_utf16)/sizeof(SQLWCHAR); /*RSTRING_LEN returns number of bytes*/
|
2887
|
+
} else {
|
2888
|
+
create_db_args->codeSet = NULL;
|
2889
|
+
}
|
2890
|
+
|
2891
|
+
if(!NIL_P(mode)) {
|
2892
|
+
mode_utf16 = _ruby_ibm_db_export_str_to_utf16(mode);
|
2893
|
+
create_db_args->mode = (SQLWCHAR*)RSTRING_PTR(mode_utf16);
|
2894
|
+
create_db_args->mode_string_len = RSTRING_LEN(mode_utf16)/sizeof(SQLWCHAR); /*RSTRING_LEN returns number of bytes*/
|
2895
|
+
} else {
|
2896
|
+
create_db_args->mode = NULL;
|
2897
|
+
}
|
2898
|
+
#else
|
2899
|
+
create_db_args->dbName = (SQLCHAR*)rb_str2cstr(dbName, &(create_db_args->dbName_string_len));
|
2900
|
+
if(!NIL_P(codeSet)){
|
2901
|
+
create_db_args->codeSet = (SQLCHAR*)rb_str2cstr(codeSet, &(create_db_args->codeSet_string_len));
|
2902
|
+
} else {
|
2903
|
+
create_db_args->codeSet = NULL;
|
2904
|
+
}
|
2905
|
+
if(!NIL_P(mode)) {
|
2906
|
+
create_db_args->mode = (SQLCHAR*)rb_str2cstr(mode, &(create_db_args->mode_string_len));
|
2907
|
+
} else {
|
2908
|
+
create_db_args->mode = NULL;
|
2909
|
+
}
|
2910
|
+
#endif
|
2911
|
+
} else {
|
2912
|
+
rb_warn("Invalid Parameter: Database Name cannot be nil");
|
2913
|
+
return Qfalse;
|
2914
|
+
}
|
2915
|
+
|
2916
|
+
create_db_args->conn_res = conn_res;
|
2917
|
+
|
2918
|
+
_ruby_ibm_db_clear_conn_err_cache();
|
2919
|
+
|
2920
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
2921
|
+
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLCreateDB_helper, create_db_args,
|
2922
|
+
(void *)_ruby_ibm_db_Connection_level_UBF, NULL );
|
2923
|
+
#else
|
2924
|
+
rc = _ruby_ibm_db_SQLCreateDB_helper( create_db_args );
|
2925
|
+
#endif
|
2926
|
+
|
2927
|
+
if ( rc == SQL_ERROR ) {
|
2928
|
+
conn_res->error_recno_tracker = 1;
|
2929
|
+
conn_res->errormsg_recno_tracker = 1;
|
2930
|
+
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, NULL, -1, 1, 0 );
|
2931
|
+
if(conn_res->sqlcode == -1005 && 1 == createNX) {
|
2932
|
+
return_value = Qtrue; /*Return true if database already exists and Create if not existing called*/
|
2933
|
+
/*Clear the error messages*/
|
2934
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
2935
|
+
memset( conn_res->ruby_error_state, '\0', (SQL_SQLSTATE_SIZE + 1) * sizeof(SQLWCHAR) );
|
2936
|
+
memset( conn_res->ruby_error_msg, '\0', (DB2_MAX_ERR_MSG_LEN + 1) * sizeof(SQLWCHAR) );
|
2937
|
+
#else
|
2938
|
+
memset( conn_res->ruby_error_state, '\0', SQL_SQLSTATE_SIZE + 1 );
|
2939
|
+
memset( conn_res->ruby_error_msg, '\0', DB2_MAX_ERR_MSG_LEN + 1 );
|
2940
|
+
#endif
|
2941
|
+
} else {
|
2942
|
+
return_value = Qfalse;
|
2943
|
+
}
|
2944
|
+
} else {
|
2945
|
+
return_value = Qtrue;
|
2946
|
+
}
|
2947
|
+
}
|
2948
|
+
|
2949
|
+
/*Free memory allocated*/
|
2950
|
+
if( create_db_args != NULL ) {
|
2951
|
+
ruby_xfree( create_db_args );
|
2952
|
+
create_db_args = NULL;
|
2953
|
+
}
|
2954
|
+
|
2955
|
+
return return_value;
|
2956
|
+
}
|
2957
|
+
/* */
|
2958
|
+
/*
|
2959
|
+
* IBM_DB.createDB -- Creates a Database
|
2960
|
+
*
|
2961
|
+
* ===Description
|
2962
|
+
* bool IBM_DB.createDB ( resource connection , string dbName [, String codeSet, String mode] )
|
2963
|
+
*
|
2964
|
+
* Creates a database with the specified name. Returns true if operation successful else false
|
2965
|
+
*
|
2966
|
+
* ===Parameters
|
2967
|
+
*
|
2968
|
+
* connection
|
2969
|
+
* A valid database connection resource variable as returned from IBM_DB.connect() or IBM_DB.pconnect() with parameter ATTACH=true specified.
|
2970
|
+
* IBM_DB.connect('DRIVER={IBM DB2 ODBC DRIVER};ATTACH=true;HOSTNAME=myhost;PORT=1234;PROTOCOL=TCPIP;UID=user;PWD=secret;','','')
|
2971
|
+
* Note: Database is not specified. In this case we connect to the instance only.
|
2972
|
+
*
|
2973
|
+
* dbName
|
2974
|
+
* Name of the database that is to be created.
|
2975
|
+
*
|
2976
|
+
* codeSet
|
2977
|
+
* Database code set information.
|
2978
|
+
* Note: If the value of the codeSet argument is not specified,
|
2979
|
+
* the database is created in the Unicode code page for DB2 data servers and in the UTF-8 code page for IDS data servers
|
2980
|
+
*
|
2981
|
+
* mode
|
2982
|
+
* Database logging mode.
|
2983
|
+
* Note: This value is applicable only to IDS data servers
|
2984
|
+
*
|
2985
|
+
* ===Return Values
|
2986
|
+
*
|
2987
|
+
* Returns TRUE on success or FALSE on failure.
|
2988
|
+
*/
|
2989
|
+
VALUE ibm_db_createDB(int argc, VALUE *argv, VALUE self)
|
2990
|
+
{
|
2991
|
+
VALUE connection = Qnil;
|
2992
|
+
VALUE dbName = Qnil;
|
2993
|
+
VALUE codeSet = Qnil;
|
2994
|
+
VALUE mode = Qnil;
|
2995
|
+
|
2996
|
+
rb_scan_args(argc, argv, "22", &connection, &dbName, &codeSet, &mode);
|
2997
|
+
|
2998
|
+
return ruby_ibm_db_createDb_helper(connection, dbName, codeSet, mode, 0);
|
2999
|
+
}
|
3000
|
+
/*
|
3001
|
+
* DropDb helper
|
3002
|
+
*/
|
3003
|
+
VALUE ruby_ibm_db_dropDb_helper(VALUE connection, VALUE dbName) {
|
3004
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3005
|
+
VALUE dbName_utf16 = Qnil;
|
3006
|
+
#endif
|
3007
|
+
|
3008
|
+
VALUE return_value = Qfalse;
|
3009
|
+
|
3010
|
+
int rc;
|
3011
|
+
|
3012
|
+
create_drop_db_args *drop_db_args = NULL;
|
3013
|
+
conn_handle *conn_res = NULL;
|
3014
|
+
|
3015
|
+
if (!NIL_P(connection)) {
|
3016
|
+
Data_Get_Struct(connection, conn_handle, conn_res);
|
3017
|
+
|
3018
|
+
if( 0 == dropDbSupported ) {
|
3019
|
+
rb_warn("Drop Database not supported: This function is only supported from DB2 Client v97fp4 version and onwards");
|
3020
|
+
return Qfalse;
|
3021
|
+
}
|
3022
|
+
|
3023
|
+
if (!conn_res->handle_active) {
|
3024
|
+
rb_warn("Connection is not active");
|
3025
|
+
return Qfalse;
|
3026
|
+
}
|
3027
|
+
|
3028
|
+
if (!NIL_P(dbName)) {
|
3029
|
+
drop_db_args = ALLOC( create_drop_db_args );
|
3030
|
+
memset(drop_db_args,'\0',sizeof(struct _ibm_db_create_drop_db_args_struct));
|
3031
|
+
|
3032
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3033
|
+
dbName_utf16 = _ruby_ibm_db_export_str_to_utf16(dbName);
|
3034
|
+
|
3035
|
+
drop_db_args->dbName = (SQLWCHAR*)RSTRING_PTR(dbName_utf16);
|
3036
|
+
drop_db_args->dbName_string_len = RSTRING_LEN(dbName_utf16)/sizeof(SQLWCHAR); /*RSTRING_LEN returns number of bytes*/
|
3037
|
+
#else
|
3038
|
+
drop_db_args->dbName = (SQLCHAR*)rb_str2cstr(dbName, &(drop_db_args->dbName_string_len));
|
3039
|
+
#endif
|
3040
|
+
} else {
|
3041
|
+
rb_warn("Invalid Parameter: Database Name cannot be nil");
|
3042
|
+
return Qfalse;
|
3043
|
+
}
|
3044
|
+
|
3045
|
+
drop_db_args->conn_res = conn_res;
|
3046
|
+
|
3047
|
+
_ruby_ibm_db_clear_conn_err_cache();
|
3048
|
+
|
3049
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3050
|
+
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLDropDB_helper, drop_db_args,
|
3051
|
+
(void *)_ruby_ibm_db_Connection_level_UBF, NULL );
|
3052
|
+
#else
|
3053
|
+
rc = _ruby_ibm_db_SQLDropDB_helper( drop_db_args );
|
3054
|
+
#endif
|
3055
|
+
|
3056
|
+
if ( rc == SQL_ERROR ) {
|
3057
|
+
conn_res->error_recno_tracker = 1;
|
3058
|
+
conn_res->errormsg_recno_tracker = 1;
|
3059
|
+
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, conn_res->hdbc, SQL_HANDLE_DBC, rc, 1, NULL, NULL, -1, 1, 0 );
|
3060
|
+
return_value = Qfalse;
|
3061
|
+
} else {
|
3062
|
+
return_value = Qtrue;
|
3063
|
+
}
|
3064
|
+
}
|
3065
|
+
|
3066
|
+
/*Free memory allocated*/
|
3067
|
+
if( drop_db_args != NULL ) {
|
3068
|
+
ruby_xfree( drop_db_args );
|
3069
|
+
drop_db_args = NULL;
|
3070
|
+
}
|
3071
|
+
|
3072
|
+
return return_value;
|
3073
|
+
}
|
3074
|
+
/* */
|
3075
|
+
/*
|
3076
|
+
* IBM_DB.dropDB -- Drops the mentioned Database
|
3077
|
+
*
|
3078
|
+
* ===Description
|
3079
|
+
* bool IBM_DB.dropDB ( resource connection , string dbName [, String codeSet, String mode] )
|
3080
|
+
*
|
3081
|
+
* Drops a database with the specified name. Returns true if operation successful else false
|
3082
|
+
*
|
3083
|
+
* ===Parameters
|
3084
|
+
*
|
3085
|
+
* connection
|
3086
|
+
* A valid database connection resource variable as returned from IBM_DB.connect() or IBM_DB.pconnect() with parameter ATTACH=true specified.
|
3087
|
+
* IBM_DB.connect('DRIVER={IBM DB2 ODBC DRIVER};ATTACH=true;HOSTNAME=myhost;PORT=1234;PROTOCOL=TCPIP;UID=user;PWD=secret;','','')
|
3088
|
+
* Note: Database is not specified. In this case we connect to the instance only.
|
3089
|
+
* dbName
|
3090
|
+
* Name of the database that is to be created.
|
3091
|
+
*
|
3092
|
+
* ===Return Values
|
3093
|
+
*
|
3094
|
+
* Returns TRUE on success or FALSE on failure.
|
3095
|
+
*/
|
3096
|
+
VALUE ibm_db_dropDB(int argc, VALUE *argv, VALUE self)
|
3097
|
+
{
|
3098
|
+
VALUE connection = Qnil;
|
3099
|
+
VALUE dbName = Qnil;
|
3100
|
+
|
3101
|
+
rb_scan_args(argc, argv, "2", &connection, &dbName);
|
3102
|
+
|
3103
|
+
return ruby_ibm_db_dropDb_helper(connection, dbName);
|
3104
|
+
}
|
3105
|
+
/* */
|
3106
|
+
/*
|
3107
|
+
* IBM_DB.recreateDB -- Recreates an Existing database
|
3108
|
+
*
|
3109
|
+
* ===Description
|
3110
|
+
* bool IBM_DB.recreateDB ( resource connection , string dbName [, String codeSet, String mode] )
|
3111
|
+
*
|
3112
|
+
* Recreates a database with the specified name. This method will drop an existing database and then re-create it.
|
3113
|
+
* If database doesnot exist the method will return false.
|
3114
|
+
* Returns true if operation successful else false
|
3115
|
+
*
|
3116
|
+
* ===Parameters
|
3117
|
+
*
|
3118
|
+
* connection
|
3119
|
+
* A valid database connection resource variable as returned from IBM_DB.connect() or IBM_DB.pconnect() with parameter ATTACH=true specified.
|
3120
|
+
* IBM_DB.connect('DRIVER={IBM DB2 ODBC DRIVER};ATTACH=true;HOSTNAME=myhost;PORT=1234;PROTOCOL=TCPIP;UID=user;PWD=secret;','','')
|
3121
|
+
* Note: Database is not specified. In this case we connect to the instance only.
|
3122
|
+
*
|
3123
|
+
* dbName
|
3124
|
+
* Name of the database that is to be created.
|
3125
|
+
*
|
3126
|
+
* codeSet
|
3127
|
+
* Database code set information.
|
3128
|
+
* Note: If the value of the codeSet argument is not specified,
|
3129
|
+
* the database is created in the Unicode code page for DB2 data servers and in the UTF-8 code page for IDS data servers
|
3130
|
+
*
|
3131
|
+
* mode
|
3132
|
+
* Database logging mode.
|
3133
|
+
* Note: This value is applicable only to IDS data servers
|
3134
|
+
*
|
3135
|
+
* ===Return Values
|
3136
|
+
*
|
3137
|
+
* Returns TRUE on success or FALSE on failure.
|
3138
|
+
*/
|
3139
|
+
/*VALUE ibm_db_recreateDB(int argc, VALUE *argv, VALUE self)
|
3140
|
+
{
|
3141
|
+
VALUE connection = Qnil;
|
3142
|
+
VALUE dbName = Qnil;
|
3143
|
+
VALUE codeSet = Qnil;
|
3144
|
+
VALUE mode = Qnil;
|
3145
|
+
VALUE return_value = Qnil;
|
3146
|
+
|
3147
|
+
rb_scan_args(argc, argv, "22", &connection, &dbName, &codeSet, &mode);
|
3148
|
+
|
3149
|
+
return_value = ruby_ibm_db_dropDb_helper(connection, dbName);
|
3150
|
+
|
3151
|
+
if(return_value == Qfalse) {
|
3152
|
+
return Qfalse;
|
3153
|
+
}
|
3154
|
+
|
3155
|
+
return ruby_ibm_db_createDb_helper(connection, dbName, codeSet, mode);
|
3156
|
+
}*/
|
3157
|
+
/* */
|
3158
|
+
/*
|
3159
|
+
* IBM_DB.createDBNX -- creates a database if it does not exist aleady
|
3160
|
+
*
|
3161
|
+
* ===Description
|
3162
|
+
* bool IBM_DB.createDBNX ( resource connection , string dbName [, String codeSet, String mode] )
|
3163
|
+
*
|
3164
|
+
* Creates a database with the specified name, if it does not exist already. This method will drop an existing database and then re-create it.
|
3165
|
+
* If database doesnot exist the method will return false.
|
3166
|
+
* Returns true if operation successful else false
|
3167
|
+
*
|
3168
|
+
* ===Parameters
|
3169
|
+
*
|
3170
|
+
* connection
|
3171
|
+
* A valid database connection resource variable as returned from IBM_DB.connect() or IBM_DB.pconnect() with parameter ATTACH=true specified.
|
3172
|
+
* IBM_DB.connect('DRIVER={IBM DB2 ODBC DRIVER};ATTACH=true;HOSTNAME=myhost;PORT=1234;PROTOCOL=TCPIP;UID=user;PWD=secret;','','')
|
3173
|
+
* Note: Database is not specified. In this case we connect to the instance only.
|
3174
|
+
*
|
3175
|
+
* dbName
|
3176
|
+
* Name of the database that is to be created.
|
3177
|
+
*
|
3178
|
+
* codeSet
|
3179
|
+
* Database code set information.
|
3180
|
+
* Note: If the value of the codeSet argument is not specified,
|
3181
|
+
* the database is created in the Unicode code page for DB2 data servers and in the UTF-8 code page for IDS data servers
|
3182
|
+
*
|
3183
|
+
* mode
|
3184
|
+
* Database logging mode.
|
3185
|
+
* Note: This value is applicable only to IDS data servers
|
3186
|
+
*
|
3187
|
+
* ===Return Values
|
3188
|
+
*
|
3189
|
+
* Returns TRUE on success or FALSE on failure.
|
3190
|
+
*/
|
3191
|
+
VALUE ibm_db_createDBNX(int argc, VALUE *argv, VALUE self)
|
3192
|
+
{
|
3193
|
+
VALUE connection = Qnil;
|
3194
|
+
VALUE dbName = Qnil;
|
3195
|
+
VALUE codeSet = Qnil;
|
3196
|
+
VALUE mode = Qnil;
|
3197
|
+
VALUE return_value = Qnil;
|
3198
|
+
|
3199
|
+
rb_scan_args(argc, argv, "22", &connection, &dbName, &codeSet, &mode);
|
3200
|
+
|
3201
|
+
return ruby_ibm_db_createDb_helper(connection, dbName, codeSet, mode, 1);
|
3202
|
+
}
|
2779
3203
|
/* */
|
2780
3204
|
|
2781
3205
|
/*
|
@@ -2984,7 +3408,7 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
2984
3408
|
case 3:
|
2985
3409
|
param_type = SQL_PARAM_INPUT;
|
2986
3410
|
|
2987
|
-
#ifdef
|
3411
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
2988
3412
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLDescribeParam_helper, data,
|
2989
3413
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res);
|
2990
3414
|
#else
|
@@ -3004,7 +3428,7 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
3004
3428
|
|
3005
3429
|
case 4:
|
3006
3430
|
|
3007
|
-
#ifdef
|
3431
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3008
3432
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLDescribeParam_helper, data,
|
3009
3433
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res);
|
3010
3434
|
#else
|
@@ -3024,7 +3448,7 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
3024
3448
|
|
3025
3449
|
case 5:
|
3026
3450
|
|
3027
|
-
#ifdef
|
3451
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3028
3452
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLDescribeParam_helper, data,
|
3029
3453
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
3030
3454
|
#else
|
@@ -3045,7 +3469,7 @@ VALUE ibm_db_bind_param_helper(int argc, char * varname, long varname_len ,long
|
|
3045
3469
|
|
3046
3470
|
case 6:
|
3047
3471
|
|
3048
|
-
#ifdef
|
3472
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3049
3473
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLDescribeParam_helper, data,
|
3050
3474
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
3051
3475
|
#else
|
@@ -3277,7 +3701,7 @@ VALUE ibm_db_close(int argc, VALUE *argv, VALUE self)
|
|
3277
3701
|
end_X_args->handleType = SQL_HANDLE_DBC;
|
3278
3702
|
end_X_args->completionType = SQL_ROLLBACK; /*Remeber you are rolling back the transaction*/
|
3279
3703
|
|
3280
|
-
#ifdef
|
3704
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3281
3705
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLEndTran, end_X_args,
|
3282
3706
|
(void *)_ruby_ibm_db_Connection_level_UBF, NULL);
|
3283
3707
|
#else
|
@@ -3295,7 +3719,7 @@ VALUE ibm_db_close(int argc, VALUE *argv, VALUE self)
|
|
3295
3719
|
}
|
3296
3720
|
}
|
3297
3721
|
|
3298
|
-
#ifdef
|
3722
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3299
3723
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLDisconnect_helper, &(conn_res->hdbc),
|
3300
3724
|
(void *)_ruby_ibm_db_Connection_level_UBF, NULL);
|
3301
3725
|
#else
|
@@ -3472,7 +3896,7 @@ VALUE ibm_db_column_privileges(int argc, VALUE *argv, VALUE self)
|
|
3472
3896
|
}
|
3473
3897
|
col_privileges_args->stmt_res = stmt_res;
|
3474
3898
|
|
3475
|
-
#ifdef
|
3899
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3476
3900
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLColumnPrivileges_helper, col_privileges_args,
|
3477
3901
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
3478
3902
|
#else
|
@@ -3652,7 +4076,7 @@ VALUE ibm_db_columns(int argc, VALUE *argv, VALUE self)
|
|
3652
4076
|
}
|
3653
4077
|
col_metadata_args->stmt_res = stmt_res;
|
3654
4078
|
|
3655
|
-
#ifdef
|
4079
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3656
4080
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLColumns_helper, col_metadata_args,
|
3657
4081
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
3658
4082
|
#else
|
@@ -3818,7 +4242,7 @@ VALUE ibm_db_foreign_keys(int argc, VALUE *argv, VALUE self)
|
|
3818
4242
|
|
3819
4243
|
col_metadata_args->stmt_res = stmt_res;
|
3820
4244
|
|
3821
|
-
#ifdef
|
4245
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3822
4246
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLForeignKeys_helper, col_metadata_args,
|
3823
4247
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
3824
4248
|
#else
|
@@ -3974,7 +4398,7 @@ VALUE ibm_db_primary_keys(int argc, VALUE *argv, VALUE self)
|
|
3974
4398
|
}
|
3975
4399
|
col_metadata_args->stmt_res = stmt_res;
|
3976
4400
|
|
3977
|
-
#ifdef
|
4401
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
3978
4402
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLPrimaryKeys_helper, col_metadata_args,
|
3979
4403
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
3980
4404
|
#else
|
@@ -4165,7 +4589,7 @@ VALUE ibm_db_procedure_columns(int argc, VALUE *argv, VALUE self)
|
|
4165
4589
|
}
|
4166
4590
|
col_metadata_args->stmt_res = stmt_res;
|
4167
4591
|
|
4168
|
-
#ifdef
|
4592
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
4169
4593
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLProcedureColumns_helper, col_metadata_args,
|
4170
4594
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res);
|
4171
4595
|
#else
|
@@ -4322,7 +4746,7 @@ VALUE ibm_db_procedures(int argc, VALUE *argv, VALUE self)
|
|
4322
4746
|
}
|
4323
4747
|
proc_metadata_args->stmt_res = stmt_res;
|
4324
4748
|
|
4325
|
-
#ifdef
|
4749
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
4326
4750
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLProcedures_helper, proc_metadata_args,
|
4327
4751
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res);
|
4328
4752
|
#else
|
@@ -4499,7 +4923,7 @@ VALUE ibm_db_special_columns(int argc, VALUE *argv, VALUE self)
|
|
4499
4923
|
}
|
4500
4924
|
col_metadata_args->stmt_res = stmt_res;
|
4501
4925
|
|
4502
|
-
#ifdef
|
4926
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
4503
4927
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLSpecialColumns_helper, col_metadata_args,
|
4504
4928
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res);
|
4505
4929
|
#else
|
@@ -4694,7 +5118,7 @@ VALUE ibm_db_statistics(int argc, VALUE *argv, VALUE self)
|
|
4694
5118
|
}
|
4695
5119
|
col_metadata_args->stmt_res = stmt_res;
|
4696
5120
|
|
4697
|
-
#ifdef
|
5121
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
4698
5122
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLStatistics_helper, col_metadata_args,
|
4699
5123
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
4700
5124
|
#else
|
@@ -4853,7 +5277,7 @@ VALUE ibm_db_table_privileges(int argc, VALUE *argv, VALUE self)
|
|
4853
5277
|
|
4854
5278
|
table_privileges_args->stmt_res = stmt_res;
|
4855
5279
|
|
4856
|
-
#ifdef
|
5280
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
4857
5281
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLTablePrivileges_helper, table_privileges_args,
|
4858
5282
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
4859
5283
|
#else
|
@@ -5027,7 +5451,7 @@ VALUE ibm_db_tables(int argc, VALUE *argv, VALUE self)
|
|
5027
5451
|
|
5028
5452
|
table_metadata_args->stmt_res = stmt_res;
|
5029
5453
|
|
5030
|
-
#ifdef
|
5454
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
5031
5455
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLTables_helper, table_metadata_args,
|
5032
5456
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
5033
5457
|
#else
|
@@ -5109,7 +5533,7 @@ VALUE ibm_db_commit(int argc, VALUE *argv, VALUE self)
|
|
5109
5533
|
end_X_args->handleType = SQL_HANDLE_DBC;
|
5110
5534
|
end_X_args->completionType = SQL_COMMIT; /*Remeber you are Commiting the transaction*/
|
5111
5535
|
|
5112
|
-
#ifdef
|
5536
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
5113
5537
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLEndTran, end_X_args,
|
5114
5538
|
(void *)_ruby_ibm_db_Connection_level_UBF, NULL);
|
5115
5539
|
#else
|
@@ -5189,7 +5613,7 @@ static int _ruby_ibm_db_do_prepare(conn_handle *conn_res, VALUE stmt, stmt_handl
|
|
5189
5613
|
prepare_args->stmt_res = stmt_res;
|
5190
5614
|
|
5191
5615
|
/* Prepare the stmt. The cursor type requested has already been set in _ruby_ibm_db_assign_options */
|
5192
|
-
#ifdef
|
5616
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
5193
5617
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLPrepare_helper, prepare_args,
|
5194
5618
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
5195
5619
|
#else
|
@@ -5197,7 +5621,7 @@ static int _ruby_ibm_db_do_prepare(conn_handle *conn_res, VALUE stmt, stmt_handl
|
|
5197
5621
|
#endif
|
5198
5622
|
|
5199
5623
|
if ( rc == SQL_ERROR ) {
|
5200
|
-
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, stmt_res->hstmt, SQL_HANDLE_STMT, rc,
|
5624
|
+
_ruby_ibm_db_check_sql_errors( conn_res, DB_CONN, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1,
|
5201
5625
|
NULL, NULL, -1, 1, 1 );
|
5202
5626
|
}
|
5203
5627
|
}
|
@@ -5327,7 +5751,7 @@ VALUE ibm_db_exec(int argc, VALUE *argv, VALUE self)
|
|
5327
5751
|
|
5328
5752
|
exec_direct_args->stmt_res = stmt_res;
|
5329
5753
|
|
5330
|
-
#ifdef
|
5754
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
5331
5755
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLExecDirect_helper, exec_direct_args,
|
5332
5756
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
5333
5757
|
#else
|
@@ -5402,7 +5826,7 @@ VALUE ibm_db_free_result(int argc, VALUE *argv, VALUE self)
|
|
5402
5826
|
freeStmt_args->stmt_res = stmt_res;
|
5403
5827
|
freeStmt_args->option = SQL_CLOSE;
|
5404
5828
|
|
5405
|
-
#ifdef
|
5829
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
5406
5830
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLFreeStmt_helper, freeStmt_args,
|
5407
5831
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
5408
5832
|
#else
|
@@ -6381,7 +6805,8 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
6381
6805
|
|
6382
6806
|
put_param_data_args->stmt_res = stmt_res;
|
6383
6807
|
|
6384
|
-
|
6808
|
+
rc = _ruby_ibm_db_SQLParamData_helper( put_param_data_args );
|
6809
|
+
while ( rc == SQL_NEED_DATA ) {
|
6385
6810
|
|
6386
6811
|
/* passing data value for a parameter */
|
6387
6812
|
rc = _ruby_ibm_db_SQLPutData_helper(put_param_data_args);
|
@@ -6412,13 +6837,37 @@ static VALUE _ruby_ibm_db_execute_helper(stmt_bind_array *bind_array) {
|
|
6412
6837
|
|
6413
6838
|
return Qnil;
|
6414
6839
|
}
|
6840
|
+
rc = _ruby_ibm_db_SQLParamData_helper( put_param_data_args );
|
6415
6841
|
}
|
6416
6842
|
|
6417
6843
|
if (put_param_data_args != NULL) {
|
6418
6844
|
ruby_xfree( put_param_data_args );
|
6419
6845
|
put_param_data_args = NULL;
|
6420
6846
|
}
|
6847
|
+
|
6848
|
+
if ( rc == SQL_ERROR ) {
|
6849
|
+
_ruby_ibm_db_check_sql_errors( stmt_res, DB_STMT, stmt_res->hstmt, SQL_HANDLE_STMT, rc, 1, NULL, NULL, -1, 1, 0 );
|
6850
|
+
if( stmt_res != NULL && stmt_res->ruby_stmt_err_msg != NULL ) {
|
6851
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
6852
|
+
*error = rb_str_concat( _ruby_ibm_db_export_char_to_utf8_rstr( "Sending data failed: "),
|
6853
|
+
_ruby_ibm_db_export_sqlwchar_to_utf8_rstr( stmt_res->ruby_stmt_err_msg,
|
6854
|
+
stmt_res->ruby_stmt_err_msg_len )
|
6855
|
+
);
|
6856
|
+
#else
|
6857
|
+
*error = rb_str_cat2(rb_str_new2("Sending data failed: "), stmt_res->ruby_stmt_err_msg );
|
6858
|
+
#endif
|
6859
|
+
} else {
|
6860
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
6861
|
+
*error = _ruby_ibm_db_export_char_to_utf8_rstr("Sending data failed: <error message could not be retrieved>");
|
6862
|
+
#else
|
6863
|
+
*error = rb_str_new2("Sending data failed: <error message could not be retrieved>");
|
6864
|
+
#endif
|
6865
|
+
}
|
6866
|
+
|
6867
|
+
return Qnil;
|
6868
|
+
}
|
6421
6869
|
}
|
6870
|
+
|
6422
6871
|
return Qtrue;
|
6423
6872
|
}
|
6424
6873
|
/*
|
@@ -6482,7 +6931,7 @@ VALUE ibm_db_execute(int argc, VALUE *argv, VALUE self)
|
|
6482
6931
|
bind_array->num = 0;
|
6483
6932
|
bind_array->error = &error;
|
6484
6933
|
|
6485
|
-
#ifdef
|
6934
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
6486
6935
|
ret_value = rb_thread_blocking_region( (void *)_ruby_ibm_db_execute_helper, bind_array,
|
6487
6936
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
6488
6937
|
#else
|
@@ -6642,7 +7091,7 @@ VALUE ibm_db_conn_errormsg(int argc, VALUE *argv, VALUE self)
|
|
6642
7091
|
|
6643
7092
|
rb_scan_args(argc, argv, "01", &connection);
|
6644
7093
|
|
6645
|
-
rb_warn("Method conn_errormsg is deprecated, use getErrormsg")
|
7094
|
+
/*rb_warn("Method conn_errormsg is deprecated, use getErrormsg");*/
|
6646
7095
|
|
6647
7096
|
if (!NIL_P(connection)) {
|
6648
7097
|
Data_Get_Struct(connection, conn_handle, conn_res);
|
@@ -6796,7 +7245,7 @@ VALUE ibm_db_conn_error(int argc, VALUE *argv, VALUE self)
|
|
6796
7245
|
|
6797
7246
|
rb_scan_args(argc, argv, "01", &connection);
|
6798
7247
|
|
6799
|
-
rb_warn("Method conn_error is deprecated, use getErrorstate")
|
7248
|
+
/*rb_warn("Method conn_error is deprecated, use getErrorstate");*/
|
6800
7249
|
|
6801
7250
|
if (!NIL_P(connection)) {
|
6802
7251
|
Data_Get_Struct(connection, conn_handle, conn_res);
|
@@ -7267,7 +7716,7 @@ VALUE ibm_db_next_result(int argc, VALUE *argv, VALUE self)
|
|
7267
7716
|
nextresultparams->stmt_res = stmt_res;
|
7268
7717
|
nextresultparams->new_hstmt = &new_hstmt;
|
7269
7718
|
|
7270
|
-
#ifdef
|
7719
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
7271
7720
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLNextResult_helper, nextresultparams,
|
7272
7721
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
7273
7722
|
#else
|
@@ -7366,7 +7815,7 @@ VALUE ibm_db_num_fields(int argc, VALUE *argv, VALUE self)
|
|
7366
7815
|
result_cols_args->stmt_res = stmt_res;
|
7367
7816
|
result_cols_args->count = 0;
|
7368
7817
|
|
7369
|
-
#ifdef
|
7818
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
7370
7819
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLNumResultCols_helper, result_cols_args,
|
7371
7820
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
7372
7821
|
#else
|
@@ -7459,7 +7908,7 @@ VALUE ibm_db_num_rows(int argc, VALUE *argv, VALUE self)
|
|
7459
7908
|
row_count_args->stmt_res = stmt_res;
|
7460
7909
|
row_count_args->count = 0;
|
7461
7910
|
|
7462
|
-
#ifdef
|
7911
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
7463
7912
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLRowCount_helper, row_count_args,
|
7464
7913
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
7465
7914
|
#else
|
@@ -7515,7 +7964,7 @@ static int _ruby_ibm_db_get_column_by_name(stmt_handle *stmt_res, VALUE column,
|
|
7515
7964
|
if ( stmt_res->column_info == NULL ) {
|
7516
7965
|
if ( release_gil == 1 ) {
|
7517
7966
|
|
7518
|
-
#ifdef
|
7967
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
7519
7968
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_get_result_set_info, stmt_res,
|
7520
7969
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
7521
7970
|
#else
|
@@ -7678,7 +8127,7 @@ VALUE ibm_db_field_display_size(int argc, VALUE *argv, VALUE self)
|
|
7678
8127
|
colattr_args->col_num = col+1;
|
7679
8128
|
colattr_args->FieldIdentifier = SQL_DESC_DISPLAY_SIZE;
|
7680
8129
|
|
7681
|
-
#ifdef
|
8130
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
7682
8131
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLColAttributes_helper, colattr_args,
|
7683
8132
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
7684
8133
|
#else
|
@@ -7998,7 +8447,7 @@ VALUE ibm_db_field_width(int argc, VALUE *argv, VALUE self)
|
|
7998
8447
|
colattr_args->col_num = col+1;
|
7999
8448
|
colattr_args->FieldIdentifier = SQL_DESC_LENGTH;
|
8000
8449
|
|
8001
|
-
#ifdef
|
8450
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
8002
8451
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLColAttributes_helper, colattr_args,
|
8003
8452
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
8004
8453
|
#else
|
@@ -8104,7 +8553,7 @@ VALUE ibm_db_rollback(int argc, VALUE *argv, VALUE self)
|
|
8104
8553
|
end_X_args->handleType = SQL_HANDLE_DBC;
|
8105
8554
|
end_X_args->completionType = SQL_ROLLBACK; /*Remeber you are Rollingback the transaction*/
|
8106
8555
|
|
8107
|
-
#ifdef
|
8556
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
8108
8557
|
rc = rb_thread_blocking_region( (void *)_ruby_ibm_db_SQLEndTran, end_X_args,
|
8109
8558
|
(void *)_ruby_ibm_db_Connection_level_UBF, NULL);
|
8110
8559
|
#else
|
@@ -8404,6 +8853,14 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
8404
8853
|
*/
|
8405
8854
|
in_length = in_length * 2;
|
8406
8855
|
}
|
8856
|
+
|
8857
|
+
if( column_type == SQL_CHAR || column_type == SQL_VARCHAR ) {
|
8858
|
+
/* Multiply size by 4 to handle different client and server codepages.
|
8859
|
+
* factor of 4 should suffice as known characters today well fit in 4 bytes.
|
8860
|
+
*/
|
8861
|
+
in_length = in_length * 4;
|
8862
|
+
}
|
8863
|
+
|
8407
8864
|
out_ptr = (SQLPOINTER)ALLOC_N(char,in_length);
|
8408
8865
|
memset(out_ptr, '\0', in_length);
|
8409
8866
|
#endif
|
@@ -8429,7 +8886,7 @@ static VALUE _ruby_ibm_db_result_helper(ibm_db_result_args *data) {
|
|
8429
8886
|
#ifdef UNICODE_SUPPORT_VERSION
|
8430
8887
|
return_value = _ruby_ibm_db_export_sqlwchar_to_utf8_rstr(out_ptr, out_length);
|
8431
8888
|
#else
|
8432
|
-
return_value =
|
8889
|
+
return_value = rb_str_new((char*)out_ptr, out_length);
|
8433
8890
|
#endif
|
8434
8891
|
ruby_xfree( out_ptr );
|
8435
8892
|
out_ptr = NULL;
|
@@ -8685,7 +9142,7 @@ VALUE ibm_db_result(int argc, VALUE *argv, VALUE self)
|
|
8685
9142
|
if ( !NIL_P( stmt ) ) {
|
8686
9143
|
Data_Get_Struct(stmt, stmt_handle, result_args->stmt_res);
|
8687
9144
|
|
8688
|
-
#ifdef
|
9145
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
8689
9146
|
ret_val = rb_thread_blocking_region( (void *)_ruby_ibm_db_result_helper, result_args,
|
8690
9147
|
(void *)_ruby_ibm_db_Statement_level_UBF, result_args->stmt_res );
|
8691
9148
|
#else
|
@@ -8937,20 +9394,20 @@ static VALUE _ruby_ibm_db_bind_fetch_helper(ibm_db_fetch_helper_args *data)
|
|
8937
9394
|
#ifdef UNICODE_SUPPORT_VERSION
|
8938
9395
|
rb_hash_aset(return_value, colName, _ruby_ibm_db_export_sqlwchar_to_utf8_rstr(row_data->str_val, out_length ));
|
8939
9396
|
#else
|
8940
|
-
rb_hash_aset(return_value, colName,
|
9397
|
+
rb_hash_aset(return_value, colName, rb_str_new((char *)row_data->str_val, out_length));
|
8941
9398
|
#endif
|
8942
9399
|
}
|
8943
9400
|
if ( op == FETCH_INDEX ) {
|
8944
9401
|
#ifdef UNICODE_SUPPORT_VERSION
|
8945
9402
|
rb_ary_store(return_value, i, _ruby_ibm_db_export_sqlwchar_to_utf8_rstr(row_data->str_val, out_length ));
|
8946
9403
|
#else
|
8947
|
-
rb_ary_store(return_value, i,
|
9404
|
+
rb_ary_store(return_value, i, rb_str_new((char *)row_data->str_val, out_length));
|
8948
9405
|
#endif
|
8949
9406
|
} else if ( op == FETCH_BOTH ) {
|
8950
9407
|
#ifdef UNICODE_SUPPORT_VERSION
|
8951
9408
|
rb_hash_aset(return_value, INT2NUM(i), _ruby_ibm_db_export_sqlwchar_to_utf8_rstr(row_data->str_val, out_length ));
|
8952
9409
|
#else
|
8953
|
-
rb_hash_aset(return_value, INT2NUM(i),
|
9410
|
+
rb_hash_aset(return_value, INT2NUM(i), rb_str_new((char *)row_data->str_val, out_length));
|
8954
9411
|
#endif
|
8955
9412
|
}
|
8956
9413
|
break;
|
@@ -9488,7 +9945,7 @@ VALUE ibm_db_fetch_row(int argc, VALUE *argv, VALUE self)
|
|
9488
9945
|
helper_args->arg_count = argc;
|
9489
9946
|
helper_args->error = &error;
|
9490
9947
|
|
9491
|
-
#ifdef
|
9948
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
9492
9949
|
ret_val = rb_thread_blocking_region( (void *)_ruby_ibm_db_fetch_row_helper, helper_args,
|
9493
9950
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
9494
9951
|
#else
|
@@ -9561,7 +10018,7 @@ VALUE ibm_db_fetch_assoc(int argc, VALUE *argv, VALUE self) {
|
|
9561
10018
|
helper_args->error = &error;
|
9562
10019
|
helper_args->funcType = FETCH_ASSOC;
|
9563
10020
|
|
9564
|
-
#ifdef
|
10021
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
9565
10022
|
ret_val = rb_thread_blocking_region( (void *)_ruby_ibm_db_bind_fetch_helper, helper_args,
|
9566
10023
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
9567
10024
|
#else
|
@@ -9648,7 +10105,7 @@ VALUE ibm_db_fetch_object(int argc, VALUE *argv, VALUE self)
|
|
9648
10105
|
helper_args->error = &error;
|
9649
10106
|
helper_args->funcType = FETCH_ASSOC;
|
9650
10107
|
|
9651
|
-
#ifdef
|
10108
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
9652
10109
|
row_res->hash = rb_thread_blocking_region( (void *)_ruby_ibm_db_bind_fetch_helper, helper_args,
|
9653
10110
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
9654
10111
|
#else
|
@@ -9730,7 +10187,7 @@ VALUE ibm_db_fetch_array(int argc, VALUE *argv, VALUE self)
|
|
9730
10187
|
helper_args->error = &error;
|
9731
10188
|
helper_args->funcType = FETCH_INDEX;
|
9732
10189
|
|
9733
|
-
#ifdef
|
10190
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
9734
10191
|
ret_val = rb_thread_blocking_region( (void *)_ruby_ibm_db_bind_fetch_helper, helper_args,
|
9735
10192
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
9736
10193
|
#else
|
@@ -9806,7 +10263,7 @@ VALUE ibm_db_fetch_both(int argc, VALUE *argv, VALUE self)
|
|
9806
10263
|
helper_args->error = &error;
|
9807
10264
|
helper_args->funcType = FETCH_BOTH;
|
9808
10265
|
|
9809
|
-
#ifdef
|
10266
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
9810
10267
|
ret_val = rb_thread_blocking_region( (void *)_ruby_ibm_db_bind_fetch_helper, helper_args,
|
9811
10268
|
(void *)_ruby_ibm_db_Statement_level_UBF, stmt_res );
|
9812
10269
|
#else
|
@@ -10557,7 +11014,7 @@ VALUE ibm_db_server_info(int argc, VALUE *argv, VALUE self)
|
|
10557
11014
|
getInfo_args->infoValue = NULL;
|
10558
11015
|
getInfo_args->buff_length = 0;
|
10559
11016
|
|
10560
|
-
#ifdef
|
11017
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
10561
11018
|
return_value = rb_thread_blocking_region( (void *)ibm_db_server_info_helper, getInfo_args,
|
10562
11019
|
(void *)_ruby_ibm_db_Connection_level_UBF, NULL);
|
10563
11020
|
#else
|
@@ -10844,7 +11301,7 @@ VALUE ibm_db_client_info(int argc, VALUE *argv, VALUE self)
|
|
10844
11301
|
getInfo_args->infoValue = NULL;
|
10845
11302
|
getInfo_args->buff_length = 0;
|
10846
11303
|
|
10847
|
-
#ifdef
|
11304
|
+
#ifdef UNICODE_SUPPORT_VERSION
|
10848
11305
|
return_value = rb_thread_blocking_region( (void *)ibm_db_client_info_helper, getInfo_args,
|
10849
11306
|
(void *)_ruby_ibm_db_Connection_level_UBF, NULL);
|
10850
11307
|
#else
|