ibm_db 4.0.0 → 5.1.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.
- checksums.yaml +5 -5
- data/README +2 -2
- data/ext/Makefile +266 -0
- data/ext/Makefile.nt32.191 +1 -1
- data/ext/extconf.rb +38 -7
- data/ext/gil_release_version.h +3 -0
- data/ext/ibm_db.c +387 -395
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +103 -0
- data/ext/ruby_ibm_db.h +1 -1
- data/ext/ruby_ibm_db_cli.c +23 -23
- data/ext/ruby_ibm_db_cli.h +5 -5
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/ext/unicode_support_version.h +3 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +348 -207
- data/test/cases/attribute_decorators_test.rb +2 -1
- data/test/cases/cache_key_test.rb +2 -1
- data/test/cases/comment_test.rb +4 -2
- data/test/cases/date_time_precision_test.rb +2 -1
- data/test/cases/defaults_test.rb +2 -1
- data/test/cases/migration/foreign_key_test.rb +4 -2
- data/test/cases/migration/helper.rb +1 -1
- data/test/cases/migration/references_foreign_key_test.rb +10 -5
- data/test/cases/migrator_test.rb +2 -1
- data/test/cases/schema_dumper_test.rb +3 -3
- data/test/cases/time_precision_test.rb +2 -1
- data/test/cases/transactions_test.rb +3 -2
- data/test/config.yml +154 -154
- data/test/connections/native_ibm_db/connection.rb +44 -0
- data/test/fixtures/admin/randomly_named_a9.yml +7 -7
- data/test/fixtures/admin/randomly_named_b0.yml +7 -7
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/pirates.yml +0 -3
- data/test/fixtures/randomly_named_a9.yml +7 -7
- data/test/ibm_db_test.rb +24 -24
- data/test/models/admin.rb +1 -1
- data/test/models/admin/account.rb +1 -1
- data/test/models/admin/randomly_named_c1.rb +7 -7
- data/test/models/binary.rb +1 -1
- data/test/models/event.rb +1 -1
- data/test/models/guid.rb +1 -1
- data/test/models/randomly_named_c1.rb +3 -3
- data/test/models/ship_part.rb +1 -1
- data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
- data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
- data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
- data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
- metadata +27 -13
- data/test/fixtures/author_addresses.original +0 -11
- data/test/fixtures/authors.original +0 -17
data/ext/ibm_db.o
ADDED
Binary file
|
data/ext/ibm_db.so
ADDED
Binary file
|
data/ext/mkmf.log
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
gil_release_version.h is:
|
2
|
+
/* begin */
|
3
|
+
1: #ifndef GIL_RELEASE_VERSION_H
|
4
|
+
2: #define GIL_RELEASE_VERSION_H
|
5
|
+
3: #endif
|
6
|
+
/* end */
|
7
|
+
|
8
|
+
unicode_support_version.h is:
|
9
|
+
/* begin */
|
10
|
+
1: #ifndef UNICODE_SUPPORT_VERSION_H
|
11
|
+
2: #define UNICODE_SUPPORT_VERSION_H
|
12
|
+
3: #endif
|
13
|
+
/* end */
|
14
|
+
|
15
|
+
have_library: checking for SQLConnect() in -ldb2... -------------------- yes
|
16
|
+
|
17
|
+
"gcc -o conftest -I/home/rakhil/ruby_exe/include/ruby-2.6.0/x86_64-linux -I/home/rakhil/ruby_exe/include/ruby-2.6.0/ruby/backward -I/home/rakhil/ruby_exe/include/ruby-2.6.0 -I. -I/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/include -O3 -ggdb3 -Wall -Wextra -Wdeclaration-after-statement -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wrestrict -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable conftest.c -L. -L/home/rakhil/ruby_exe/lib -Wl,-rpath,/home/rakhil/ruby_exe/lib -L/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/lib -Wl,-rpath,/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/lib -L. -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/rakhil/ruby_exe/lib -L/home/rakhil/ruby_exe/lib -lruby-static -lz -lpthread -lrt -lrt -ldl -lcrypt -lm -lm -lc"
|
18
|
+
/home/rakhil/ruby_exe/lib/ruby/2.6.0/mkmf.rb:406: warning: Insecure world writable dir /work/rakhil in PATH, mode 040777
|
19
|
+
checked program was:
|
20
|
+
/* begin */
|
21
|
+
1: #include "ruby.h"
|
22
|
+
2:
|
23
|
+
3: int main(int argc, char **argv)
|
24
|
+
4: {
|
25
|
+
5: return 0;
|
26
|
+
6: }
|
27
|
+
/* end */
|
28
|
+
|
29
|
+
"gcc -o conftest -I/home/rakhil/ruby_exe/include/ruby-2.6.0/x86_64-linux -I/home/rakhil/ruby_exe/include/ruby-2.6.0/ruby/backward -I/home/rakhil/ruby_exe/include/ruby-2.6.0 -I. -I/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/include -O3 -ggdb3 -Wall -Wextra -Wdeclaration-after-statement -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wrestrict -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable conftest.c -L. -L/home/rakhil/ruby_exe/lib -Wl,-rpath,/home/rakhil/ruby_exe/lib -L/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/lib -Wl,-rpath,/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/lib -L. -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/rakhil/ruby_exe/lib -L/home/rakhil/ruby_exe/lib -lruby-static -lz -lpthread -lrt -lrt -ldl -lcrypt -lm -ldb2 -lm -lc"
|
30
|
+
conftest.c: In function 't':
|
31
|
+
conftest.c:14:57: error: 'SQLConnect' undeclared (first use in this function)
|
32
|
+
int t(void) { void ((*volatile p)()); p = (void ((*)()))SQLConnect; return !p; }
|
33
|
+
^~~~~~~~~~
|
34
|
+
conftest.c:14:57: note: each undeclared identifier is reported only once for each function it appears in
|
35
|
+
conftest.c: At top level:
|
36
|
+
cc1: warning: unrecognized command line option '-Wno-self-assign'
|
37
|
+
cc1: warning: unrecognized command line option '-Wno-parentheses-equality'
|
38
|
+
cc1: warning: unrecognized command line option '-Wno-constant-logical-operand'
|
39
|
+
cc1: warning: unrecognized command line option '-Wno-cast-function-type'
|
40
|
+
checked program was:
|
41
|
+
/* begin */
|
42
|
+
1: #include "ruby.h"
|
43
|
+
2:
|
44
|
+
3: /*top*/
|
45
|
+
4: extern int t(void);
|
46
|
+
5: int main(int argc, char **argv)
|
47
|
+
6: {
|
48
|
+
7: if (argc > 1000000) {
|
49
|
+
8: int (* volatile tp)(void)=(int (*)(void))&t;
|
50
|
+
9: printf("%d", (*tp)());
|
51
|
+
10: }
|
52
|
+
11:
|
53
|
+
12: return 0;
|
54
|
+
13: }
|
55
|
+
14: int t(void) { void ((*volatile p)()); p = (void ((*)()))SQLConnect; return !p; }
|
56
|
+
/* end */
|
57
|
+
|
58
|
+
"gcc -o conftest -I/home/rakhil/ruby_exe/include/ruby-2.6.0/x86_64-linux -I/home/rakhil/ruby_exe/include/ruby-2.6.0/ruby/backward -I/home/rakhil/ruby_exe/include/ruby-2.6.0 -I. -I/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/include -O3 -ggdb3 -Wall -Wextra -Wdeclaration-after-statement -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wrestrict -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable conftest.c -L. -L/home/rakhil/ruby_exe/lib -Wl,-rpath,/home/rakhil/ruby_exe/lib -L/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/lib -Wl,-rpath,/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/lib -L. -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/home/rakhil/ruby_exe/lib -L/home/rakhil/ruby_exe/lib -lruby-static -lz -lpthread -lrt -lrt -ldl -lcrypt -lm -ldb2 -lm -lc"
|
59
|
+
checked program was:
|
60
|
+
/* begin */
|
61
|
+
1: #include "ruby.h"
|
62
|
+
2:
|
63
|
+
3: /*top*/
|
64
|
+
4: extern int t(void);
|
65
|
+
5: int main(int argc, char **argv)
|
66
|
+
6: {
|
67
|
+
7: if (argc > 1000000) {
|
68
|
+
8: int (* volatile tp)(void)=(int (*)(void))&t;
|
69
|
+
9: printf("%d", (*tp)());
|
70
|
+
10: }
|
71
|
+
11:
|
72
|
+
12: return 0;
|
73
|
+
13: }
|
74
|
+
14: extern void SQLConnect();
|
75
|
+
15: int t(void) { SQLConnect(); return 0; }
|
76
|
+
/* end */
|
77
|
+
|
78
|
+
--------------------
|
79
|
+
|
80
|
+
have_header: checking for gil_release_version.h... -------------------- yes
|
81
|
+
|
82
|
+
"gcc -E -I/home/rakhil/ruby_exe/include/ruby-2.6.0/x86_64-linux -I/home/rakhil/ruby_exe/include/ruby-2.6.0/ruby/backward -I/home/rakhil/ruby_exe/include/ruby-2.6.0 -I. -I/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/include -O3 -ggdb3 -Wall -Wextra -Wdeclaration-after-statement -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wrestrict -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable conftest.c -o conftest.i"
|
83
|
+
checked program was:
|
84
|
+
/* begin */
|
85
|
+
1: #include "ruby.h"
|
86
|
+
2:
|
87
|
+
3: #include <gil_release_version.h>
|
88
|
+
/* end */
|
89
|
+
|
90
|
+
--------------------
|
91
|
+
|
92
|
+
have_header: checking for unicode_support_version.h... -------------------- yes
|
93
|
+
|
94
|
+
"gcc -E -I/home/rakhil/ruby_exe/include/ruby-2.6.0/x86_64-linux -I/home/rakhil/ruby_exe/include/ruby-2.6.0/ruby/backward -I/home/rakhil/ruby_exe/include/ruby-2.6.0 -I. -I/work/rakhil/ruby_5.1.0/ruby-ibmdb/IBM_DB_Adapter/ibm_db/ext/../lib/clidriver/include -O3 -ggdb3 -Wall -Wextra -Wdeclaration-after-statement -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wrestrict -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable conftest.c -o conftest.i"
|
95
|
+
checked program was:
|
96
|
+
/* begin */
|
97
|
+
1: #include "ruby.h"
|
98
|
+
2:
|
99
|
+
3: #include <unicode_support_version.h>
|
100
|
+
/* end */
|
101
|
+
|
102
|
+
--------------------
|
103
|
+
|
data/ext/ruby_ibm_db.h
CHANGED
@@ -206,7 +206,7 @@ VALUE ibm_db_active(int argc, VALUE *argv, VALUE self);
|
|
206
206
|
*/
|
207
207
|
struct _ibm_db_globals {
|
208
208
|
int bin_mode;
|
209
|
-
#ifdef
|
209
|
+
#ifdef UNICODE_SUPPORT_VERSION_H
|
210
210
|
SQLWCHAR __ruby_conn_err_msg[DB2_MAX_ERR_MSG_LEN];
|
211
211
|
SQLWCHAR __ruby_stmt_err_msg[DB2_MAX_ERR_MSG_LEN];
|
212
212
|
SQLWCHAR __ruby_conn_err_state[SQL_SQLSTATE_SIZE + 1];
|
data/ext/ruby_ibm_db_cli.c
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
*/
|
32
32
|
int _ruby_ibm_db_SQLConnect_helper(connect_args *data) {
|
33
33
|
if(data->ctlg_conn == 1) {
|
34
|
-
#ifndef
|
34
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
35
35
|
return SQLConnect( (SQLHDBC)*(data->hdbc), (SQLCHAR *)data->database,
|
36
36
|
(SQLSMALLINT)data->database_len, (SQLCHAR *)data->uid, (SQLSMALLINT)data->uid_len,
|
37
37
|
(SQLCHAR *)data->password, (SQLSMALLINT)data->password_len );
|
@@ -41,7 +41,7 @@ int _ruby_ibm_db_SQLConnect_helper(connect_args *data) {
|
|
41
41
|
data->password, data->password_len );
|
42
42
|
#endif
|
43
43
|
} else {
|
44
|
-
#ifndef
|
44
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
45
45
|
return SQLDriverConnect( (SQLHDBC) *(data->hdbc), (SQLHWND)NULL,
|
46
46
|
(SQLCHAR*)data->database, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT );
|
47
47
|
#else
|
@@ -100,7 +100,7 @@ int _ruby_ibm_db_SQLDescribeCol_helper(describecol_args *data) {
|
|
100
100
|
|
101
101
|
data->stmt_res->is_executing = 1;
|
102
102
|
|
103
|
-
#ifdef
|
103
|
+
#ifdef UNICODE_SUPPORT_VERSION_H
|
104
104
|
rc = SQLDescribeColW( (SQLHSTMT)data->stmt_res->hstmt, (SQLSMALLINT)(data->col_no),
|
105
105
|
data->stmt_res->column_info[i].name, data->buff_length, &(data->name_length),
|
106
106
|
&(data->stmt_res->column_info[i].type), &(data->stmt_res->column_info[i].size),
|
@@ -140,7 +140,7 @@ int _ruby_ibm_db_SQLColumnPrivileges_helper(metadata_args *data) {
|
|
140
140
|
|
141
141
|
data->stmt_res->is_executing = 1;
|
142
142
|
|
143
|
-
#ifndef
|
143
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
144
144
|
rc = SQLColumnPrivileges( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len,
|
145
145
|
data->owner, data->owner_len, data->table_name, data->table_name_len,
|
146
146
|
data->column_name, data->column_name_len );
|
@@ -164,7 +164,7 @@ int _ruby_ibm_db_SQLColumns_helper(metadata_args *data) {
|
|
164
164
|
|
165
165
|
data->stmt_res->is_executing = 1;
|
166
166
|
|
167
|
-
#ifndef
|
167
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
168
168
|
rc = SQLColumns( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len,
|
169
169
|
data->owner, data->owner_len, data->table_name, data->table_name_len,
|
170
170
|
data->column_name, data->column_name_len );
|
@@ -187,7 +187,7 @@ int _ruby_ibm_db_SQLPrimaryKeys_helper(metadata_args *data) {
|
|
187
187
|
|
188
188
|
data->stmt_res->is_executing = 1;
|
189
189
|
|
190
|
-
#ifndef
|
190
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
191
191
|
rc = SQLPrimaryKeys( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len,
|
192
192
|
data->owner, data->owner_len, data->table_name, data->table_name_len );
|
193
193
|
#else
|
@@ -210,7 +210,7 @@ int _ruby_ibm_db_SQLForeignKeys_helper(metadata_args *data) {
|
|
210
210
|
|
211
211
|
if(!NIL_P(data->table_type))
|
212
212
|
{
|
213
|
-
#ifndef
|
213
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
214
214
|
rc = SQLForeignKeys( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len,
|
215
215
|
data->owner, data->owner_len, NULL , SQL_NTS, NULL, SQL_NTS,
|
216
216
|
NULL, SQL_NTS, data->table_name, data->table_name_len );
|
@@ -222,7 +222,7 @@ int _ruby_ibm_db_SQLForeignKeys_helper(metadata_args *data) {
|
|
222
222
|
}
|
223
223
|
else
|
224
224
|
{
|
225
|
-
#ifndef
|
225
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
226
226
|
rc = SQLForeignKeys( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len,
|
227
227
|
data->owner, data->owner_len, data->table_name , data->table_name_len, NULL, SQL_NTS,
|
228
228
|
NULL, SQL_NTS, NULL, SQL_NTS );
|
@@ -247,7 +247,7 @@ int _ruby_ibm_db_SQLProcedureColumns_helper(metadata_args *data) {
|
|
247
247
|
|
248
248
|
data->stmt_res->is_executing = 1;
|
249
249
|
|
250
|
-
#ifndef
|
250
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
251
251
|
rc = SQLProcedureColumns( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len, data->owner,
|
252
252
|
data->owner_len, data->proc_name, data->proc_name_len, data->column_name, data->column_name_len );
|
253
253
|
#else
|
@@ -269,7 +269,7 @@ int _ruby_ibm_db_SQLProcedures_helper(metadata_args *data) {
|
|
269
269
|
|
270
270
|
data->stmt_res->is_executing = 1;
|
271
271
|
|
272
|
-
#ifndef
|
272
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
273
273
|
rc = SQLProcedures( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len, data->owner,
|
274
274
|
data->owner_len, data->proc_name, data->proc_name_len );
|
275
275
|
#else
|
@@ -291,7 +291,7 @@ int _ruby_ibm_db_SQLSpecialColumns_helper(metadata_args *data) {
|
|
291
291
|
|
292
292
|
data->stmt_res->is_executing = 1;
|
293
293
|
|
294
|
-
#ifndef
|
294
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
295
295
|
rc = SQLSpecialColumns( (SQLHSTMT) data->stmt_res->hstmt, SQL_BEST_ROWID, data->qualifier, data->qualifier_len,
|
296
296
|
data->owner, data->owner_len, data->table_name, data->table_name_len,
|
297
297
|
(SQLUSMALLINT)data->scope, SQL_NULLABLE );
|
@@ -314,7 +314,7 @@ int _ruby_ibm_db_SQLStatistics_helper(metadata_args *data) {
|
|
314
314
|
|
315
315
|
data->stmt_res->is_executing = 1;
|
316
316
|
|
317
|
-
#ifndef
|
317
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
318
318
|
rc = SQLStatistics( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len, data->owner,
|
319
319
|
data->owner_len, data->table_name, data->table_name_len, (SQLUSMALLINT)data->unique, SQL_QUICK );
|
320
320
|
#else
|
@@ -336,7 +336,7 @@ int _ruby_ibm_db_SQLTablePrivileges_helper(metadata_args *data) {
|
|
336
336
|
|
337
337
|
data->stmt_res->is_executing = 1;
|
338
338
|
|
339
|
-
#ifndef
|
339
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
340
340
|
rc = SQLTablePrivileges( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len,
|
341
341
|
data->owner, data->owner_len, data->table_name, data->table_name_len );
|
342
342
|
#else
|
@@ -358,7 +358,7 @@ int _ruby_ibm_db_SQLTables_helper(metadata_args *data) {
|
|
358
358
|
|
359
359
|
data->stmt_res->is_executing = 1;
|
360
360
|
|
361
|
-
#ifndef
|
361
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
362
362
|
rc = SQLTables( (SQLHSTMT) data->stmt_res->hstmt, data->qualifier, data->qualifier_len, data->owner,
|
363
363
|
data->owner_len, data->table_name, data->table_name_len, data->table_type, data->table_type_len );
|
364
364
|
#else
|
@@ -379,7 +379,7 @@ int _ruby_ibm_db_SQLExecDirect_helper(exec_cum_prepare_args *data) {
|
|
379
379
|
|
380
380
|
data->stmt_res->is_executing = 1;
|
381
381
|
|
382
|
-
#ifndef
|
382
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
383
383
|
rc = SQLExecDirect( (SQLHSTMT) data->stmt_res->hstmt, data->stmt_string, (SQLINTEGER)data->stmt_string_len );
|
384
384
|
#else
|
385
385
|
rc = SQLExecDirectW( (SQLHSTMT) data->stmt_res->hstmt, data->stmt_string, (SQLINTEGER)data->stmt_string_len );
|
@@ -395,7 +395,7 @@ int _ruby_ibm_db_SQLExecDirect_helper(exec_cum_prepare_args *data) {
|
|
395
395
|
*/
|
396
396
|
int _ruby_ibm_db_SQLCreateDB_helper(create_drop_db_args *data) {
|
397
397
|
int rc = 0;
|
398
|
-
#ifndef
|
398
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
399
399
|
#ifdef _WIN32
|
400
400
|
HINSTANCE cliLib = NULL;
|
401
401
|
FARPROC sqlcreatedb;
|
@@ -450,7 +450,7 @@ int _ruby_ibm_db_SQLCreateDB_helper(create_drop_db_args *data) {
|
|
450
450
|
*/
|
451
451
|
int _ruby_ibm_db_SQLDropDB_helper(create_drop_db_args *data) {
|
452
452
|
int rc = 0;
|
453
|
-
#ifndef
|
453
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
454
454
|
#ifdef _WIN32
|
455
455
|
HINSTANCE cliLib = NULL;
|
456
456
|
FARPROC sqldropdb;
|
@@ -506,7 +506,7 @@ int _ruby_ibm_db_SQLPrepare_helper(exec_cum_prepare_args *data) {
|
|
506
506
|
|
507
507
|
data->stmt_res->is_executing = 1;
|
508
508
|
|
509
|
-
#ifndef
|
509
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
510
510
|
rc = SQLPrepare( (SQLHSTMT) data->stmt_res->hstmt, data->stmt_string, (SQLINTEGER)data->stmt_string_len );
|
511
511
|
#else
|
512
512
|
rc = SQLPrepareW( (SQLHSTMT) data->stmt_res->hstmt, data->stmt_string, (SQLINTEGER)data->stmt_string_len );
|
@@ -742,7 +742,7 @@ int _ruby_ibm_db_SQLRowCount_helper(sql_row_count_args *data) {
|
|
742
742
|
This function calls SQLGetInfo cli call to get general information about DBMS, which the app is connected to
|
743
743
|
*/
|
744
744
|
int _ruby_ibm_db_SQLGetInfo_helper(get_info_args *data) {
|
745
|
-
#ifndef
|
745
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
746
746
|
return SQLGetInfo( data->conn_res->hdbc, data->infoType, data->infoValue, data->buff_length, data->out_length);
|
747
747
|
#else
|
748
748
|
return SQLGetInfoW( data->conn_res->hdbc, data->infoType, data->infoValue, data->buff_length, data->out_length);
|
@@ -753,7 +753,7 @@ int _ruby_ibm_db_SQLGetInfo_helper(get_info_args *data) {
|
|
753
753
|
This function calls SQLGetDiagRec cli call to get the current values of a diagnostic record that contains error
|
754
754
|
*/
|
755
755
|
int _ruby_ibm_db_SQLGetDiagRec_helper(get_diagRec_args *data) {
|
756
|
-
#ifdef
|
756
|
+
#ifdef UNICODE_SUPPORT_VERSION_H
|
757
757
|
int rc= SQLGetDiagRecW( data->hType, data->handle, data->recNum, data->SQLState, data->NativeErrorPtr,
|
758
758
|
data->msgText, data->buff_length, data->text_length_ptr );
|
759
759
|
data->return_code=rc;
|
@@ -768,7 +768,7 @@ int _ruby_ibm_db_SQLGetDiagRec_helper(get_diagRec_args *data) {
|
|
768
768
|
This function calls SQLSetStmtAttr cli call to set attributes related to a statement
|
769
769
|
*/
|
770
770
|
int _ruby_ibm_db_SQLSetStmtAttr_helper(set_handle_attr_args *data) {
|
771
|
-
#ifndef
|
771
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
772
772
|
return SQLSetStmtAttr( (SQLHSTMT) *(data->handle), data->attribute, data->valuePtr, data->strLength );
|
773
773
|
#else
|
774
774
|
return SQLSetStmtAttrW( (SQLHSTMT) *(data->handle), data->attribute, data->valuePtr, data->strLength );
|
@@ -779,7 +779,7 @@ int _ruby_ibm_db_SQLSetStmtAttr_helper(set_handle_attr_args *data) {
|
|
779
779
|
This function calls SQLSetConnectAttr cli call to set attributes that govern aspects of connections
|
780
780
|
*/
|
781
781
|
int _ruby_ibm_db_SQLSetConnectAttr_helper(set_handle_attr_args *data) {
|
782
|
-
#ifndef
|
782
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
783
783
|
return SQLSetConnectAttr( (SQLHDBC) *(data->handle), data->attribute, data->valuePtr, data->strLength );
|
784
784
|
#else
|
785
785
|
return SQLSetConnectAttrW( (SQLHDBC) *(data->handle), data->attribute, data->valuePtr, data->strLength );
|
@@ -809,7 +809,7 @@ int _ruby_ibm_db_SQLGetStmtAttr_helper(get_handle_attr_args *data) {
|
|
809
809
|
This function calls SQLGetConnectAttr cli call to set an environment attribute
|
810
810
|
*/
|
811
811
|
int _ruby_ibm_db_SQLGetConnectAttr_helper(get_handle_attr_args *data) {
|
812
|
-
#ifndef
|
812
|
+
#ifndef UNICODE_SUPPORT_VERSION_H
|
813
813
|
return SQLGetConnectAttr( (SQLHDBC) *(data->handle), data->attribute, data->valuePtr,
|
814
814
|
data->buff_length, data->out_length);
|
815
815
|
#else
|
data/ext/ruby_ibm_db_cli.h
CHANGED
@@ -105,7 +105,7 @@ typedef struct {
|
|
105
105
|
} ibm_db_row_type;
|
106
106
|
|
107
107
|
typedef struct _ibm_db_result_set_info_struct {
|
108
|
-
#ifdef
|
108
|
+
#ifdef UNICODE_SUPPORT_VERSION_H
|
109
109
|
SQLWCHAR *name;
|
110
110
|
long name_length;
|
111
111
|
#else
|
@@ -157,7 +157,7 @@ typedef struct _stmt_handle_struct {
|
|
157
157
|
Structure holding the data to be passed to SQLConnect or SQLDriverConnect CLI call
|
158
158
|
*/
|
159
159
|
typedef struct _ibm_db_connect_args_struct {
|
160
|
-
#ifdef
|
160
|
+
#ifdef UNICODE_SUPPORT_VERSION_H
|
161
161
|
SQLWCHAR *database;
|
162
162
|
SQLWCHAR *uid;
|
163
163
|
SQLWCHAR *password;
|
@@ -211,7 +211,7 @@ typedef struct _ibm_db_describecol_args_struct {
|
|
211
211
|
*/
|
212
212
|
typedef struct _ibm_db_metadata_args_struct {
|
213
213
|
stmt_handle *stmt_res;
|
214
|
-
#ifdef
|
214
|
+
#ifdef UNICODE_SUPPORT_VERSION_H
|
215
215
|
SQLWCHAR *qualifier;
|
216
216
|
SQLWCHAR *owner;
|
217
217
|
SQLWCHAR *table_name;
|
@@ -243,7 +243,7 @@ typedef struct _ibm_db_metadata_args_struct {
|
|
243
243
|
*/
|
244
244
|
typedef struct _ibm_db_exec_direct_args_struct {
|
245
245
|
stmt_handle *stmt_res;
|
246
|
-
#ifdef
|
246
|
+
#ifdef UNICODE_SUPPORT_VERSION_H
|
247
247
|
SQLWCHAR *stmt_string;
|
248
248
|
#else
|
249
249
|
SQLCHAR *stmt_string;
|
@@ -257,7 +257,7 @@ typedef struct _ibm_db_exec_direct_args_struct {
|
|
257
257
|
*/
|
258
258
|
typedef struct _ibm_db_create_drop_db_args_struct {
|
259
259
|
conn_handle *conn_res;
|
260
|
-
#ifdef
|
260
|
+
#ifdef UNICODE_SUPPORT_VERSION_H
|
261
261
|
SQLWCHAR *dbName;
|
262
262
|
SQLWCHAR *codeSet;
|
263
263
|
SQLWCHAR *mode;
|
Binary file
|
@@ -9,8 +9,9 @@
|
|
9
9
|
# | : Arvind Gupta <arvindgu@in.ibm.com> |
|
10
10
|
# +----------------------------------------------------------------------+
|
11
11
|
|
12
|
+
|
12
13
|
require 'active_record/connection_adapters/abstract_adapter'
|
13
|
-
require 'arel/visitors/
|
14
|
+
require 'arel/visitors/visitor'
|
14
15
|
require 'active_support/core_ext/string/strip'
|
15
16
|
require 'active_record/type'
|
16
17
|
require 'active_record/connection_adapters/sql_type_metadata'
|
@@ -18,14 +19,14 @@ require 'active_record/connection_adapters/sql_type_metadata'
|
|
18
19
|
|
19
20
|
|
20
21
|
module CallChain
|
21
|
-
|
22
|
+
def self.caller_method(depth=1)
|
22
23
|
parse_caller(caller(depth+1).first).last
|
23
24
|
end
|
24
25
|
|
25
26
|
private
|
26
27
|
|
27
28
|
# Copied from ActionMailer
|
28
|
-
|
29
|
+
def self.parse_caller(at)
|
29
30
|
if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
|
30
31
|
file = Regexp.last_match[1]
|
31
32
|
line = Regexp.last_match[2].to_i
|
@@ -38,20 +39,19 @@ end
|
|
38
39
|
|
39
40
|
module ActiveRecord
|
40
41
|
|
41
|
-
|
42
42
|
|
43
43
|
class SchemaMigration < ActiveRecord::Base
|
44
44
|
class << self
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
def create_table
|
46
|
+
#puts "Calling method : " << CallChain.caller_method << "\n"
|
47
|
+
#puts "Calling method for create_table(): " << String(caller(start=1, length=nil) )
|
48
48
|
unless table_exists?
|
49
49
|
version_options = connection.internal_string_options_for_primary_key
|
50
50
|
|
51
|
-
connection.create_table(table_name,
|
51
|
+
connection.create_table(table_name,id:false) do |t|
|
52
52
|
t.string :version, version_options
|
53
53
|
end
|
54
|
-
|
54
|
+
end
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -60,7 +60,7 @@ module ActiveRecord
|
|
60
60
|
|
61
61
|
class Relation
|
62
62
|
|
63
|
-
|
63
|
+
def insert(values)
|
64
64
|
primary_key_value = nil
|
65
65
|
|
66
66
|
if primary_key && Hash === values
|
@@ -96,7 +96,6 @@ module ActiveRecord
|
|
96
96
|
else
|
97
97
|
im.insert substitutes
|
98
98
|
end
|
99
|
-
|
100
99
|
conn.insert(
|
101
100
|
im,
|
102
101
|
'SQL',
|
@@ -210,16 +209,16 @@ module ActiveRecord
|
|
210
209
|
end
|
211
210
|
|
212
211
|
#if( config.has_key?(:parameterized) && config[:parameterized] == true )
|
213
|
-
|
214
|
-
|
212
|
+
# require 'active_record/connection_adapters/ibm_db_pstmt'
|
213
|
+
# end
|
215
214
|
|
216
215
|
# Check if class TableDefinition responds to indexes method to determine if we are on AR 3 or AR 4.
|
217
216
|
# This is a interim hack ti ensure backward compatibility. To remove as we move out of AR 3 support or have a better way to determine which version of AR being run against.
|
218
|
-
|
217
|
+
checkClass = ActiveRecord::ConnectionAdapters::TableDefinition.new(self,nil)
|
219
218
|
if(checkClass.respond_to?(:indexes))
|
220
219
|
isAr3 = false
|
221
220
|
else
|
222
|
-
isAr3
|
221
|
+
isAr3= true
|
223
222
|
end
|
224
223
|
# Converts all +config+ keys to symbols
|
225
224
|
config = config.symbolize_keys
|
@@ -302,7 +301,6 @@ module ActiveRecord
|
|
302
301
|
conn_string << "SECURITY=#{config[:security]};" if config.has_key?(:security)
|
303
302
|
conn_string << "AUTHENTICATION=#{config[:authentication]};" if config.has_key?(:authentication)
|
304
303
|
conn_string << "CONNECTTIMEOUT=#{config[:timeout]};" if config.has_key?(:timeout)
|
305
|
-
|
306
304
|
connection = IBM_DB.connect( conn_string, '', '', conn_options, set_quoted_literal_replacement )
|
307
305
|
else
|
308
306
|
# No host implies a local catalog-based connection: +database+ represents catalog alias
|
@@ -339,21 +337,20 @@ module ActiveRecord
|
|
339
337
|
end
|
340
338
|
|
341
339
|
module Quoting
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
end
|
340
|
+
def lookup_cast_type_from_column(column) # :nodoc:
|
341
|
+
lookup_cast_type(column.sql_type_metadata)
|
342
|
+
end
|
346
343
|
end
|
347
344
|
|
348
345
|
module Savepoints
|
349
|
-
|
346
|
+
def create_savepoint(name = current_savepoint_name)
|
350
347
|
execute("SAVEPOINT #{name} ON ROLLBACK RETAIN CURSORS")
|
351
348
|
end
|
352
349
|
end
|
353
350
|
|
354
351
|
|
355
352
|
module ColumnDumper
|
356
|
-
|
353
|
+
def prepare_column_options(column)
|
357
354
|
spec = {}
|
358
355
|
|
359
356
|
if limit = schema_limit(column)
|
@@ -409,25 +406,26 @@ module ActiveRecord
|
|
409
406
|
|
410
407
|
module SchemaStatements
|
411
408
|
|
412
|
-
|
409
|
+
def internal_string_options_for_primary_key # :nodoc:
|
413
410
|
{ primary_key: true}
|
414
411
|
{ version_options: "PRIMARY KEY NOT NULL"}
|
412
|
+
end
|
413
|
+
|
414
|
+
def drop_table(table_name,options={})
|
415
|
+
execute("DROP TABLE #{quote_table_name(table_name)}", options)
|
416
|
+
#execute("DROP TABLE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(table_name)}"
|
415
417
|
end
|
416
|
-
|
417
|
-
def drop_table(table_name, options = {})
|
418
|
-
execute "DROP TABLE #{quote_table_name(table_name)}"
|
419
|
-
end
|
420
|
-
|
418
|
+
|
421
419
|
=begin
|
422
420
|
def create_table_definition(name, temporary, options,as = nil)
|
423
421
|
TableDefinition.new self, name, temporary, options
|
424
422
|
end
|
425
423
|
=end
|
426
|
-
|
427
|
-
TableDefinition.new(*args)
|
424
|
+
def create_table_definition(*args, **options)
|
425
|
+
TableDefinition.new(self, *args, **options)
|
428
426
|
end
|
429
427
|
|
430
|
-
|
428
|
+
def remove_foreign_key(from_table, options_or_to_table = {})
|
431
429
|
return unless supports_foreign_keys?
|
432
430
|
|
433
431
|
if options_or_to_table.is_a?(Hash)
|
@@ -458,8 +456,8 @@ module ActiveRecord
|
|
458
456
|
class IBM_DBColumn < ConnectionAdapters::Column # :nodoc:
|
459
457
|
# delegate :precision, :scale, :limit, :type, :sql_type, to: :sql_type_metadata, allow_nil: true
|
460
458
|
|
461
|
-
|
462
|
-
|
459
|
+
def initialize(*)
|
460
|
+
super
|
463
461
|
end
|
464
462
|
|
465
463
|
#def initialize(column_name, column_default_value, sqltype_metadata, column_nullable, table_name, default_function, collation, comment)
|
@@ -487,9 +485,9 @@ module ActiveRecord
|
|
487
485
|
|
488
486
|
module ColumnMethods
|
489
487
|
|
490
|
-
|
491
|
-
|
492
|
-
|
488
|
+
def primary_key(name, type = :primary_key, **options)
|
489
|
+
column(name, type, options.merge(primary_key: true))
|
490
|
+
end
|
493
491
|
|
494
492
|
##class Table
|
495
493
|
class Table < ActiveRecord::ConnectionAdapters::Table
|
@@ -511,7 +509,7 @@ module ActiveRecord
|
|
511
509
|
#This method is different as compared to def char (sql is being issued explicitly
|
512
510
|
#as compared to def char where method column(which will generate the sql is being called)
|
513
511
|
#in order to handle the DEFAULT and NULL option for the native XML datatype
|
514
|
-
def xml(*args )
|
512
|
+
def xml(*args )
|
515
513
|
options = {}
|
516
514
|
if args.last.is_a?(Hash)
|
517
515
|
options = args.delete_at(args.length-1)
|
@@ -583,7 +581,8 @@ module ActiveRecord
|
|
583
581
|
end
|
584
582
|
=end
|
585
583
|
|
586
|
-
|
584
|
+
def initialize(conn, name, temporary = false, options = nil, as = nil, comment: nil)
|
585
|
+
@connection = conn
|
587
586
|
@columns_hash = {}
|
588
587
|
@indexes = []
|
589
588
|
@foreign_keys = []
|
@@ -653,15 +652,15 @@ module ActiveRecord
|
|
653
652
|
|
654
653
|
#Method to support the new syntax of rails 2.0 migrations (short-hand definitions) for columns of type char [character]
|
655
654
|
def char(*args)
|
656
|
-
|
657
|
-
|
655
|
+
ibm_parse_column_attributes_args('char',*args)
|
656
|
+
return self
|
658
657
|
end
|
659
658
|
alias_method :character, :char
|
660
659
|
|
661
660
|
# Overrides the abstract adapter in order to handle
|
662
661
|
# the DEFAULT option for the native XML datatype
|
663
662
|
def column(name, type, options ={})
|
664
|
-
|
663
|
+
# construct a column definition where @base is adaptor instance
|
665
664
|
column = ColumnDefinition.new(name, type)
|
666
665
|
|
667
666
|
# DB2 does not accept DEFAULT NULL option for XML
|
@@ -745,11 +744,12 @@ module ActiveRecord
|
|
745
744
|
end
|
746
745
|
|
747
746
|
class BindSubstitution < Arel::Visitors::IBM_DB # :nodoc:
|
748
|
-
include Arel::Visitors
|
747
|
+
include Arel::Visitors
|
749
748
|
end
|
750
749
|
|
751
750
|
def initialize(connection, ar3, logger, config, conn_options)
|
752
|
-
# Caching database connection configuration (+connect+ or +reconnect+ support)
|
751
|
+
# Caching database connection configuration (+connect+ or +reconnect+ support)\
|
752
|
+
@config = config
|
753
753
|
@connection = connection
|
754
754
|
@isAr3 = ar3
|
755
755
|
@conn_options = conn_options
|
@@ -779,7 +779,7 @@ module ActiveRecord
|
|
779
779
|
|
780
780
|
# Calls the parent class +ConnectionAdapters+' initializer
|
781
781
|
# which sets @connection, @logger, @runtime and @last_verification
|
782
|
-
super(@connection, logger)
|
782
|
+
super(@connection, logger, @config)
|
783
783
|
|
784
784
|
if @connection
|
785
785
|
server_info = IBM_DB.server_info( @connection )
|
@@ -800,6 +800,10 @@ module ActiveRecord
|
|
800
800
|
@servertype = IBM_DB2_ZOS.new(self, @isAr3)
|
801
801
|
when /10/
|
802
802
|
@servertype = IBM_DB2_ZOS.new(self, @isAr3)
|
803
|
+
when /11/
|
804
|
+
@servertype = IBM_DB2_ZOS.new(self, @isAr3)
|
805
|
+
when /12/
|
806
|
+
@servertype = IBM_DB2_ZOS.new(self, @isAr3)
|
803
807
|
when /08/ # DB2 for zOS version 8
|
804
808
|
@servertype = IBM_DB2_ZOS_8.new(self, @isAr3)
|
805
809
|
else # DB2 for zOS version 7
|
@@ -911,7 +915,7 @@ module ActiveRecord
|
|
911
915
|
rescue
|
912
916
|
@arelVersion = 0
|
913
917
|
end
|
914
|
-
|
918
|
+
if(@arelVersion < 6 )
|
915
919
|
def to_sql(arel, binds = [])
|
916
920
|
if arel.respond_to?(:ast)
|
917
921
|
visitor.accept(arel.ast) do
|
@@ -933,9 +937,11 @@ module ActiveRecord
|
|
933
937
|
|
934
938
|
def supports_foreign_keys?
|
935
939
|
true
|
940
|
+
end
|
941
|
+
|
942
|
+
def supports_datetime_with_precision?
|
943
|
+
true
|
936
944
|
end
|
937
|
-
|
938
|
-
|
939
945
|
|
940
946
|
# This Adapter supports DDL transactions.
|
941
947
|
# This means CREATE TABLE and other DDL statements can be carried out as a transaction.
|
@@ -1020,21 +1026,20 @@ module ActiveRecord
|
|
1020
1026
|
|
1021
1027
|
def create_table(name, options = {})
|
1022
1028
|
@servertype.setup_for_lob_table
|
1023
|
-
super
|
1024
|
-
|
1025
1029
|
#Table definition is complete only when a unique index is created on the primarykey column for DB2 V8 on zOS
|
1026
1030
|
|
1027
1031
|
#create index on id column if options[:id] is nil or id ==true
|
1028
1032
|
#else check if options[:primary_key]is not nil then create an unique index on that column
|
1029
1033
|
if !options[:id].nil? || !options[:primary_key].nil?
|
1030
1034
|
if (!options[:id].nil? && options[:id] == true)
|
1031
|
-
|
1035
|
+
@servertype.create_index_after_table(name,"id")
|
1032
1036
|
elsif !options[:primary_key].nil?
|
1033
|
-
|
1037
|
+
@servertype.create_index_after_table(name,options[:primary_key].to_s)
|
1034
1038
|
end
|
1035
1039
|
else
|
1036
|
-
|
1037
|
-
end
|
1040
|
+
@servertype.create_index_after_table(name,"id")
|
1041
|
+
end
|
1042
|
+
super(name, options)
|
1038
1043
|
end
|
1039
1044
|
|
1040
1045
|
# Returns an array of hashes with the column names as keys and
|
@@ -1125,9 +1130,8 @@ module ActiveRecord
|
|
1125
1130
|
end
|
1126
1131
|
|
1127
1132
|
def select(sql, name = nil, binds = [])
|
1128
|
-
|
1129
|
-
|
1130
|
-
sql.gsub!( /(=\s*NULL|IN\s*\(NULL\))/i, " IS NULL" )
|
1133
|
+
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"
|
1134
|
+
sql.gsub( /(=\s*NULL|IN\s*\(NULL\))/i, " IS NULL" )
|
1131
1135
|
|
1132
1136
|
results = []
|
1133
1137
|
|
@@ -1155,7 +1159,7 @@ module ActiveRecord
|
|
1155
1159
|
#+sql+ is the select query and +name+ is an optional description for logging
|
1156
1160
|
def select_rows(sql, name = nil,binds = [])
|
1157
1161
|
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"}
|
1158
|
-
sql.gsub
|
1162
|
+
sql.gsub( /(=\s*NULL|IN\s*\(NULL\))/i, " IS NULL" )
|
1159
1163
|
|
1160
1164
|
results = []
|
1161
1165
|
# Invokes the method +execute+ in order to log and execute the SQL
|
@@ -1287,12 +1291,12 @@ module ActiveRecord
|
|
1287
1291
|
end
|
1288
1292
|
end
|
1289
1293
|
|
1290
|
-
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds
|
1291
|
-
if(@arelVersion < 6
|
1292
|
-
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1294
|
+
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds=[])
|
1295
|
+
if(@arelVersion < 6)
|
1296
|
+
sql, binds = [to_sql(arel), binds]
|
1297
|
+
else
|
1298
|
+
sql, binds = [to_sql(arel),binds] #sql_for_insert(to_sql(arel, binds), binds) #[to_sql(arel),binds]
|
1299
|
+
end
|
1296
1300
|
|
1297
1301
|
#unless IBM_DBAdapter.respond_to?(:exec_insert)
|
1298
1302
|
if binds.nil? || binds.empty?
|
@@ -1395,14 +1399,18 @@ module ActiveRecord
|
|
1395
1399
|
|
1396
1400
|
# Executes and logs +sql+ commands and
|
1397
1401
|
# returns a +IBM_DB.Statement+ object.
|
1398
|
-
def execute(sql, name
|
1402
|
+
def execute(sql, name=nil)
|
1399
1403
|
# Logs and execute the sql instructions.
|
1400
1404
|
# The +log+ method is defined in the parent class +AbstractAdapter+
|
1401
|
-
|
1405
|
+
#sql='INSERT INTO ar_internal_metadata (key, value, created_at, updated_at) VALUES ('10', '10', '10', '10')
|
1406
|
+
log(sql , name) do
|
1402
1407
|
@servertype.execute(sql, name)
|
1403
1408
|
end
|
1404
1409
|
end
|
1405
1410
|
|
1411
|
+
def exec_insert(sql,name,binds,pk,sequence_name)
|
1412
|
+
end
|
1413
|
+
|
1406
1414
|
# Executes an "UPDATE" SQL statement
|
1407
1415
|
def update_direct(sql, name = nil)
|
1408
1416
|
if @handle_lobs_triggered #Ensure the array of sql is cleared if they have been handled in the callback
|
@@ -1454,10 +1462,10 @@ module ActiveRecord
|
|
1454
1462
|
|
1455
1463
|
def update(arel, name = nil, binds = [])
|
1456
1464
|
if(@arelVersion < 6 )
|
1457
|
-
|
1458
|
-
|
1459
|
-
|
1460
|
-
|
1465
|
+
sql = to_sql(arel)
|
1466
|
+
else
|
1467
|
+
sql = to_sql(arel,binds)
|
1468
|
+
end
|
1461
1469
|
|
1462
1470
|
# Make sure the WHERE clause handles NULL's correctly
|
1463
1471
|
sqlarray = sql.split(/\s*WHERE\s*/)
|
@@ -1515,6 +1523,7 @@ module ActiveRecord
|
|
1515
1523
|
end
|
1516
1524
|
|
1517
1525
|
def get_limit_offset_clauses(limit,offset)
|
1526
|
+
|
1518
1527
|
if limit && limit == 0
|
1519
1528
|
clauses = @servertype.get_limit_offset_clauses(limit,0)
|
1520
1529
|
else
|
@@ -1584,7 +1593,6 @@ module ActiveRecord
|
|
1584
1593
|
end
|
1585
1594
|
end
|
1586
1595
|
=end
|
1587
|
-
|
1588
1596
|
def quote_value_for_pstmt(value, column=nil)
|
1589
1597
|
|
1590
1598
|
return value.quoted_id if value.respond_to?(:quoted_id)
|
@@ -1613,75 +1621,82 @@ module ActiveRecord
|
|
1613
1621
|
end
|
1614
1622
|
end
|
1615
1623
|
end
|
1616
|
-
|
1617
1624
|
# Properly quotes the various data types.
|
1618
1625
|
# +value+ contains the data, +column+ is optional and contains info on the field
|
1619
|
-
|
1620
|
-
|
1621
|
-
|
1622
|
-
|
1623
|
-
|
1624
|
-
|
1625
|
-
|
1626
|
-
|
1627
|
-
|
1628
|
-
|
1629
|
-
|
1630
|
-
|
1631
|
-
|
1632
|
-
|
1633
|
-
|
1634
|
-
|
1635
|
-
|
1636
|
-
|
1637
|
-
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1641
|
-
|
1642
|
-
|
1643
|
-
|
1644
|
-
|
1645
|
-
|
1646
|
-
|
1647
|
-
|
1648
|
-
|
1649
|
-
|
1650
|
-
|
1651
|
-
|
1652
|
-
|
1653
|
-
|
1654
|
-
|
1655
|
-
|
1656
|
-
|
1657
|
-
|
1658
|
-
|
1659
|
-
|
1660
|
-
|
1661
|
-
|
1662
|
-
|
1663
|
-
|
1664
|
-
|
1665
|
-
|
1666
|
-
|
1667
|
-
|
1668
|
-
|
1669
|
-
|
1670
|
-
|
1671
|
-
|
1672
|
-
|
1673
|
-
|
1674
|
-
|
1675
|
-
|
1676
|
-
|
1677
|
-
|
1678
|
-
|
1679
|
-
|
1680
|
-
|
1681
|
-
|
1682
|
-
|
1683
|
-
|
1684
|
-
|
1626
|
+
# def quote(value, column=nil)
|
1627
|
+
# return value.quoted_id if value.respond_to?(:quoted_id)
|
1628
|
+
# case value
|
1629
|
+
# # If it's a numeric value and the column sql_type is not a string, it shouldn't be quoted
|
1630
|
+
# # (IBM_DB doesn't accept quotes on numeric types)
|
1631
|
+
# when Numeric
|
1632
|
+
# # If the column sql_type is text or string, return the quote value
|
1633
|
+
# if (column && ( column.sql_type.to_s =~ /text|char/i ))
|
1634
|
+
# unless caller[0] =~ /insert_fixture/i
|
1635
|
+
# "'#{value}'"
|
1636
|
+
# else
|
1637
|
+
# "#{value}"
|
1638
|
+
# end
|
1639
|
+
# else
|
1640
|
+
# # value is Numeric, column.sql_type is not a string,
|
1641
|
+
# # therefore it converts the number to string without quoting it
|
1642
|
+
# value.to_s
|
1643
|
+
# end
|
1644
|
+
# when String, ActiveSupport::Multibyte::Chars
|
1645
|
+
# if column && column.sql_type.to_s =~ /binary|blob/i && !(column.sql_type.to_s =~ /for bit data/i)
|
1646
|
+
# # If quoting is required for the insert/update of a BLOB
|
1647
|
+
# unless caller[0] =~ /add_column_options/i
|
1648
|
+
# # Invokes a convertion from string to binary
|
1649
|
+
# @servertype.set_binary_value
|
1650
|
+
# else
|
1651
|
+
# # Quoting required for the default value of a column
|
1652
|
+
# @servertype.set_binary_default(value)
|
1653
|
+
# end
|
1654
|
+
# elsif column && column.sql_type.to_s =~ /text|clob/i
|
1655
|
+
# unless caller[0] =~ /add_column_options/i
|
1656
|
+
# @servertype.set_text_default(quote_string(value))
|
1657
|
+
# else
|
1658
|
+
# @servertype.set_text_default(quote_string(value))
|
1659
|
+
# end
|
1660
|
+
# elsif column && column.sql_type.to_s =~ /xml/i
|
1661
|
+
# unless caller[0] =~ /add_column_options/i
|
1662
|
+
# "#{value}"
|
1663
|
+
# else
|
1664
|
+
# "#{value}"
|
1665
|
+
# end
|
1666
|
+
# else
|
1667
|
+
# unless caller[0] =~ /insert_fixture/i
|
1668
|
+
# super(value)
|
1669
|
+
# else
|
1670
|
+
# "#{value}"
|
1671
|
+
# end
|
1672
|
+
# end
|
1673
|
+
# #when TrueClass then quoted_true # return '1' for true
|
1674
|
+
# when TrueClass
|
1675
|
+
# quoted_true
|
1676
|
+
# #when FalseClass then quoted_false # return '0' for false
|
1677
|
+
# when FalseClass
|
1678
|
+
# quoted_false
|
1679
|
+
# when nil
|
1680
|
+
# "NULL"
|
1681
|
+
# when Date
|
1682
|
+
# "'#{quoted_date(value)}'"
|
1683
|
+
# when Time
|
1684
|
+
# "'#{quoted_date(value)}'"
|
1685
|
+
# when Symbol
|
1686
|
+
# "'#{quote_string(value)}'"
|
1687
|
+
# else
|
1688
|
+
# unless caller[0] =~ /insert_fixture/i
|
1689
|
+
# "'#{quote_string(YAML.dump(value))}'"
|
1690
|
+
# else
|
1691
|
+
# "#{quote_string(YAML.dump(value))}"
|
1692
|
+
# end
|
1693
|
+
# end
|
1694
|
+
# end
|
1695
|
+
# # Quotes a given string, escaping single quote (') characters.
|
1696
|
+
# def quote_string(string)
|
1697
|
+
# #string.gsub(/'/, "''")
|
1698
|
+
# string.gsub('\\', '\&\&').gsub("'", "''")
|
1699
|
+
# end
|
1685
1700
|
|
1686
1701
|
# *true* is represented by a smallint 1, *false*
|
1687
1702
|
# by 0, as no native boolean type exists in DB2.
|
@@ -1711,9 +1726,9 @@ module ActiveRecord
|
|
1711
1726
|
:text => { :name => "clob" },
|
1712
1727
|
:integer => { :name => "integer" },
|
1713
1728
|
:float => { :name => "float" },
|
1714
|
-
:datetime => { :name =>
|
1715
|
-
:timestamp => { :name =>
|
1716
|
-
:time => { :name =>
|
1729
|
+
:datetime => { :name => "timestamp" },
|
1730
|
+
:timestamp => { :name => "timestamp" },
|
1731
|
+
:time => { :name => "time" },
|
1717
1732
|
:date => { :name => "date" },
|
1718
1733
|
:binary => { :name => "blob" },
|
1719
1734
|
|
@@ -1728,8 +1743,8 @@ module ActiveRecord
|
|
1728
1743
|
:char => { :name => "char" },
|
1729
1744
|
:double => { :name => @servertype.get_double_mapping },
|
1730
1745
|
:decfloat => { :name => "decfloat"},
|
1731
|
-
:graphic => { :name => "graphic"
|
1732
|
-
:vargraphic => { :name => "vargraphic"
|
1746
|
+
:graphic => { :name => "graphic"},
|
1747
|
+
:vargraphic => { :name => "vargraphic"},
|
1733
1748
|
:bigint => { :name => "bigint"}
|
1734
1749
|
}
|
1735
1750
|
end
|
@@ -1801,14 +1816,80 @@ module ActiveRecord
|
|
1801
1816
|
|
1802
1817
|
# IBM data servers do not support limits on certain data types (unlike MySQL)
|
1803
1818
|
# Limit is supported for the {float, decimal, numeric, varchar, clob, blob, graphic, vargraphic} data types.
|
1804
|
-
def type_to_sql(type, limit
|
1819
|
+
def type_to_sql(type, limit=nil, precision=nil, scale=nil )
|
1820
|
+
if type.to_sym == :decimal
|
1821
|
+
if limit.class == Hash
|
1822
|
+
if limit.has_key?("precision".to_sym)
|
1823
|
+
precision = limit[:precision]
|
1824
|
+
end
|
1825
|
+
end
|
1826
|
+
if limit.class == Hash
|
1827
|
+
if limit.has_key?("scale".to_sym)
|
1828
|
+
scale = limit[:scale]
|
1829
|
+
end
|
1830
|
+
end
|
1831
|
+
sql_segment = native_database_types[type.to_sym][:name].to_s
|
1832
|
+
if !precision.nil? && !scale.nil?
|
1833
|
+
sql_segment << "(#{precision},#{scale})"
|
1834
|
+
return sql_segment
|
1835
|
+
elsif scale.nil? && !precision.nil?
|
1836
|
+
sql_segment << "(#{precision})"
|
1837
|
+
else
|
1838
|
+
return sql_segment
|
1839
|
+
end
|
1840
|
+
end
|
1841
|
+
|
1805
1842
|
if type.to_sym == :decfloat
|
1806
1843
|
sql_segment = native_database_types[type.to_sym][:name].to_s
|
1807
1844
|
sql_segment << "(#{precision})" if !precision.nil?
|
1808
1845
|
return sql_segment
|
1809
1846
|
end
|
1810
|
-
|
1811
|
-
|
1847
|
+
|
1848
|
+
if type.to_sym == :vargraphic
|
1849
|
+
sql_segment = native_database_types[type.to_sym][:name].to_s
|
1850
|
+
if limit.class == Hash
|
1851
|
+
if limit.has_key?("limit".to_sym)
|
1852
|
+
limit1 = limit[:limit]
|
1853
|
+
sql_segment << "(#{limit1})"
|
1854
|
+
else
|
1855
|
+
return "vargraphic(1)"
|
1856
|
+
end
|
1857
|
+
else
|
1858
|
+
if limit != nil
|
1859
|
+
sql_segment << "(#{limit})"
|
1860
|
+
else
|
1861
|
+
return "vargraphic(1)"
|
1862
|
+
end
|
1863
|
+
end
|
1864
|
+
return sql_segment
|
1865
|
+
end
|
1866
|
+
|
1867
|
+
if type.to_sym == :graphic
|
1868
|
+
sql_segment = native_database_types[type.to_sym][:name].to_s
|
1869
|
+
if limit.class == Hash
|
1870
|
+
if limit.has_key?("limit".to_sym)
|
1871
|
+
limit1 = limit[:limit]
|
1872
|
+
sql_segment << "(#{limit1})"
|
1873
|
+
else
|
1874
|
+
return "graphic(1)"
|
1875
|
+
end
|
1876
|
+
else
|
1877
|
+
if limit != nil
|
1878
|
+
sql_segment << "(#{limit})"
|
1879
|
+
else
|
1880
|
+
return "graphic(1)"
|
1881
|
+
end
|
1882
|
+
end
|
1883
|
+
return sql_segment
|
1884
|
+
end
|
1885
|
+
|
1886
|
+
|
1887
|
+
|
1888
|
+
if limit.class == Hash
|
1889
|
+
return super if limit.has_key?("limit".to_sym).nil?
|
1890
|
+
else
|
1891
|
+
return super if limit.nil?
|
1892
|
+
end
|
1812
1893
|
|
1813
1894
|
# strip off limits on data types not supporting them
|
1814
1895
|
if @servertype.limit_not_supported_types.include? type.to_sym
|
@@ -1816,9 +1897,10 @@ module ActiveRecord
|
|
1816
1897
|
elsif type.to_sym == :boolean
|
1817
1898
|
return "smallint"
|
1818
1899
|
else
|
1819
|
-
return super
|
1900
|
+
return super(type)
|
1820
1901
|
end
|
1821
|
-
|
1902
|
+
|
1903
|
+
end
|
1822
1904
|
|
1823
1905
|
|
1824
1906
|
|
@@ -1952,7 +2034,7 @@ module ActiveRecord
|
|
1952
2034
|
|
1953
2035
|
# Returns an array of non-primary key indexes for a specified table name
|
1954
2036
|
def indexes(table_name, name = nil)
|
1955
|
-
|
2037
|
+
# to_s required because +table_name+ may be a symbol.
|
1956
2038
|
table_name = table_name.to_s
|
1957
2039
|
# Checks if a blank table name has been given.
|
1958
2040
|
# If so it returns an empty array of columns.
|
@@ -2015,7 +2097,7 @@ module ActiveRecord
|
|
2015
2097
|
if(stmt)
|
2016
2098
|
begin
|
2017
2099
|
while ( index_stats = IBM_DB.fetch_array(stmt) )
|
2018
|
-
|
2100
|
+
is_composite = false
|
2019
2101
|
if index_stats[5] # INDEX_NAME
|
2020
2102
|
index_name = index_stats[5].downcase
|
2021
2103
|
index_unique = (index_stats[3] == 0)
|
@@ -2025,7 +2107,8 @@ module ActiveRecord
|
|
2025
2107
|
i = 0;
|
2026
2108
|
indexes.each do |index|
|
2027
2109
|
if index.name == index_name && index_schema[i] == index_qualifier
|
2028
|
-
index.columns = index.columns + index_columns
|
2110
|
+
#index.columns = index.columns + index_columns
|
2111
|
+
index.columns.concat index_columns
|
2029
2112
|
is_composite = true
|
2030
2113
|
end
|
2031
2114
|
i = i+1
|
@@ -2153,8 +2236,8 @@ module ActiveRecord
|
|
2153
2236
|
|
2154
2237
|
|
2155
2238
|
# Returns an array of Column objects for the table specified by +table_name+
|
2156
|
-
def columns(table_name
|
2157
|
-
|
2239
|
+
def columns(table_name)
|
2240
|
+
# to_s required because it may be a symbol.
|
2158
2241
|
table_name = @servertype.set_case(table_name.to_s)
|
2159
2242
|
|
2160
2243
|
# Checks if a blank table name has been given.
|
@@ -2229,7 +2312,7 @@ module ActiveRecord
|
|
2229
2312
|
scale: column_scale,
|
2230
2313
|
)
|
2231
2314
|
|
2232
|
-
columns << Column.new(column_name, column_default_value, sqltype_metadata, column_nullable, table_name
|
2315
|
+
columns << Column.new(column_name, column_default_value, sqltype_metadata, column_nullable, table_name)
|
2233
2316
|
|
2234
2317
|
#else
|
2235
2318
|
# columns << IBM_DBColumn.new(column_name, column_default_value, column_type, column_nullable)
|
@@ -2260,7 +2343,7 @@ module ActiveRecord
|
|
2260
2343
|
return columns
|
2261
2344
|
end
|
2262
2345
|
|
2263
|
-
def foreign_keys(table_name)
|
2346
|
+
def foreign_keys(table_name)
|
2264
2347
|
#fetch the foreign keys of the table using function foreign_keys
|
2265
2348
|
#PKTABLE_NAME:: fk_row[2] Name of the table containing the primary key.
|
2266
2349
|
#PKCOLUMN_NAME:: fk_row[3] Name of the column containing the primary key.
|
@@ -2309,8 +2392,9 @@ module ActiveRecord
|
|
2309
2392
|
end
|
2310
2393
|
#Returns the foreignKeys array
|
2311
2394
|
return foreignKeys
|
2312
|
-
|
2313
|
-
|
2395
|
+
end
|
2396
|
+
|
2397
|
+
def extract_foreign_key_action(specifier) # :nodoc:
|
2314
2398
|
case specifier
|
2315
2399
|
when 0; :cascade
|
2316
2400
|
when 1; :restrict
|
@@ -2321,9 +2405,9 @@ module ActiveRecord
|
|
2321
2405
|
|
2322
2406
|
def supports_disable_referential_integrity? #:nodoc:
|
2323
2407
|
true
|
2324
|
-
|
2408
|
+
end
|
2325
2409
|
|
2326
|
-
|
2410
|
+
def disable_referential_integrity #:nodoc:
|
2327
2411
|
if supports_disable_referential_integrity?
|
2328
2412
|
alter_foreign_keys(tables, true)
|
2329
2413
|
end
|
@@ -2334,7 +2418,7 @@ module ActiveRecord
|
|
2334
2418
|
alter_foreign_keys(tables, false)
|
2335
2419
|
end
|
2336
2420
|
|
2337
|
-
|
2421
|
+
end
|
2338
2422
|
|
2339
2423
|
def alter_foreign_keys(tables, not_enforced)
|
2340
2424
|
enforced = not_enforced ? 'NOT ENFORCED' : 'ENFORCED'
|
@@ -2343,7 +2427,7 @@ module ActiveRecord
|
|
2343
2427
|
execute("ALTER TABLE #{@servertype.set_case(fk.from_table)} ALTER FOREIGN KEY #{@servertype.set_case(fk.name)} #{enforced}")
|
2344
2428
|
end
|
2345
2429
|
end
|
2346
|
-
|
2430
|
+
end
|
2347
2431
|
|
2348
2432
|
# Renames a table.
|
2349
2433
|
# ==== Example
|
@@ -2384,7 +2468,7 @@ module ActiveRecord
|
|
2384
2468
|
#Add distinct clause to the sql if there is no order by specified
|
2385
2469
|
def distinct(columns, order_by)
|
2386
2470
|
if order_by.nil?
|
2387
|
-
"DISTINCT #{columns}"
|
2471
|
+
"DISTINCT #{columns}"
|
2388
2472
|
else
|
2389
2473
|
"#{columns}"
|
2390
2474
|
end
|
@@ -2431,7 +2515,7 @@ module ActiveRecord
|
|
2431
2515
|
# remove_index :accounts, :username
|
2432
2516
|
# Overriden to use the IBM data servers SQL syntax.
|
2433
2517
|
def remove_index(table_name, options = {})
|
2434
|
-
|
2518
|
+
execute("DROP INDEX #{index_name(table_name, options)}")
|
2435
2519
|
end
|
2436
2520
|
|
2437
2521
|
protected
|
@@ -2481,7 +2565,7 @@ module ActiveRecord
|
|
2481
2565
|
class IBM_DataServer
|
2482
2566
|
def initialize(adapter, ar3)
|
2483
2567
|
@adapter = adapter
|
2484
|
-
|
2568
|
+
@isAr3 = ar3
|
2485
2569
|
end
|
2486
2570
|
|
2487
2571
|
def last_generated_id(stmt)
|
@@ -2588,7 +2672,9 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
2588
2672
|
end
|
2589
2673
|
end
|
2590
2674
|
|
2591
|
-
|
2675
|
+
# Akhil Tcheck for if_exits added so that it will try to drop even if the table does not exit.
|
2676
|
+
def execute(sql, name = nil)
|
2677
|
+
if name == nil || name.class == String
|
2592
2678
|
begin
|
2593
2679
|
if stmt = IBM_DB.exec(@adapter.connection, sql)
|
2594
2680
|
stmt # Return the statement object
|
@@ -2602,6 +2688,25 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
2602
2688
|
raise
|
2603
2689
|
end
|
2604
2690
|
end
|
2691
|
+
else
|
2692
|
+
if name[:if_exists]
|
2693
|
+
IBM_DB.exec(@adapter.connection, sql)
|
2694
|
+
else
|
2695
|
+
begin
|
2696
|
+
if stmt = IBM_DB.exec(@adapter.connection, sql)
|
2697
|
+
stmt # Return the statement object
|
2698
|
+
else
|
2699
|
+
raise StatementInvalid, IBM_DB.getErrormsg(@adapter.connection, IBM_DB::DB_CONN )
|
2700
|
+
end
|
2701
|
+
rescue StandardError => exec_err
|
2702
|
+
if exec_err && !exec_err.message.empty?
|
2703
|
+
raise "Failed to execute statement due to: #{exec_err}"
|
2704
|
+
else
|
2705
|
+
raise
|
2706
|
+
end
|
2707
|
+
end
|
2708
|
+
end
|
2709
|
+
end
|
2605
2710
|
end
|
2606
2711
|
|
2607
2712
|
def set_schema(schema)
|
@@ -2660,7 +2765,7 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
2660
2765
|
end
|
2661
2766
|
|
2662
2767
|
def primary_key_definition(start_id)
|
2663
|
-
return "INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH #{start_id}) PRIMARY KEY"
|
2768
|
+
return "INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH #{start_id}) PRIMARY KEY NOT NULL"
|
2664
2769
|
end
|
2665
2770
|
|
2666
2771
|
# Returns the last automatically generated ID.
|
@@ -2710,6 +2815,9 @@ To remove the column, the table must be dropped and recreated without the #{colu
|
|
2710
2815
|
end
|
2711
2816
|
|
2712
2817
|
def change_column(table_name, column_name, type, options)
|
2818
|
+
if !options[:default].nil?
|
2819
|
+
change_column_default(table_name, column_name, options[:default])
|
2820
|
+
else
|
2713
2821
|
data_type = @adapter.type_to_sql(type, options[:limit], options[:precision], options[:scale])
|
2714
2822
|
begin
|
2715
2823
|
execute "ALTER TABLE #{table_name} ALTER #{column_name} SET DATA TYPE #{data_type}"
|
@@ -2727,6 +2835,7 @@ The column datatype change to [#{data_type}] is not supported by this data serve
|
|
2727
2835
|
change_column_default(table_name, column_name, options[:default])
|
2728
2836
|
reorg_table(table_name)
|
2729
2837
|
end
|
2838
|
+
end
|
2730
2839
|
|
2731
2840
|
# DB2 specific ALTER TABLE statement to add a default clause
|
2732
2841
|
def change_column_default(table_name, column_name, default)
|
@@ -2811,7 +2920,7 @@ SET WITH DEFAULT #{@adapter.quote(default)}"
|
|
2811
2920
|
return retHash
|
2812
2921
|
end
|
2813
2922
|
|
2814
|
-
def query_offset_limit(sql, offset, limit)
|
2923
|
+
def query_offset_limit(sql, offset, limit)
|
2815
2924
|
if(offset.nil? && limit.nil?)
|
2816
2925
|
return sql
|
2817
2926
|
end
|
@@ -3327,7 +3436,7 @@ end
|
|
3327
3436
|
rescue
|
3328
3437
|
arelVersion = 0
|
3329
3438
|
end
|
3330
|
-
if(arelVersion >= 6)
|
3439
|
+
if(arelVersion >= 6 && arelVersion <= 9)
|
3331
3440
|
class ToSql < Arel::Visitors::Reduce #opening and closing the class to ensure backward compatibility
|
3332
3441
|
# In case when using Rails-2.3.x there is no arel used due to which the constructor has to be defined explicitly
|
3333
3442
|
# to ensure the same code works on any version of Rails
|
@@ -3381,19 +3490,38 @@ end
|
|
3381
3490
|
private
|
3382
3491
|
|
3383
3492
|
|
3384
|
-
|
3493
|
+
def visit_Arel_Nodes_Limit o,collector
|
3494
|
+
collector << " FETCH FIRST "
|
3385
3495
|
visit o.expr, collector
|
3496
|
+
collector << " ROWS ONLY "
|
3386
3497
|
end
|
3387
3498
|
|
3388
3499
|
def visit_Arel_Nodes_Offset o,collector
|
3389
3500
|
visit o.expr,collector
|
3390
3501
|
end
|
3391
|
-
|
3392
|
-
|
3393
|
-
|
3502
|
+
def visit_Arel_Nodes_ValuesList(o, collector)
|
3503
|
+
collector << "VALUES "
|
3504
|
+
o.rows.each_with_index do |row, i|
|
3505
|
+
collector << ", " unless i == 0
|
3506
|
+
collector << "("
|
3507
|
+
row.each_with_index do |value, k|
|
3508
|
+
collector << ", " unless k == 0
|
3509
|
+
case value
|
3510
|
+
when Nodes::SqlLiteral, Nodes::BindParam
|
3511
|
+
collector = visit(value, collector)
|
3512
|
+
#collector << quote(value).to_s
|
3513
|
+
else
|
3514
|
+
collector << value.to_s
|
3515
|
+
end
|
3516
|
+
end
|
3517
|
+
collector << ")"
|
3518
|
+
end
|
3519
|
+
collector
|
3520
|
+
end
|
3521
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
3394
3522
|
if o.with
|
3395
3523
|
collector = visit o.with, collector
|
3396
|
-
collector <<
|
3524
|
+
collector << " "
|
3397
3525
|
end
|
3398
3526
|
|
3399
3527
|
collector = o.cores.inject(collector) { |c,x|
|
@@ -3401,51 +3529,64 @@ end
|
|
3401
3529
|
}
|
3402
3530
|
|
3403
3531
|
unless o.orders.empty?
|
3404
|
-
collector <<
|
3532
|
+
collector << " ORDER BY "
|
3405
3533
|
len = o.orders.length - 1
|
3406
3534
|
o.orders.each_with_index { |x, i|
|
3407
3535
|
collector = visit(x, collector)
|
3408
|
-
collector <<
|
3536
|
+
collector << "," unless len == i
|
3409
3537
|
}
|
3410
3538
|
end
|
3411
3539
|
|
3412
3540
|
|
3413
|
-
if o.limit
|
3414
|
-
limcoll = Arel::Collectors::SQLString.new
|
3415
|
-
visit(o.limit,limcoll)
|
3416
|
-
limit = limcoll.value.to_i
|
3417
|
-
else
|
3418
|
-
limit = nil
|
3419
|
-
end
|
3420
|
-
|
3421
|
-
if o.offset
|
3422
|
-
offcoll = Arel::Collectors::SQLString.new
|
3423
|
-
visit(o.offset,offcoll)
|
3424
|
-
offset = offcoll.value.to_i
|
3425
|
-
else
|
3426
|
-
offset = nil
|
3427
|
-
end
|
3428
|
-
|
3429
|
-
limOffClause = @connection.get_limit_offset_clauses(limit,offset)
|
3430
|
-
|
3431
|
-
if( !limOffClause["startSegment"].empty? )
|
3432
|
-
#collector.changeFirstSegment(limOffClause["startSegment"])
|
3433
|
-
collector.value.prepend(limOffClause["startSegment"])
|
3434
|
-
end
|
3435
|
-
|
3436
|
-
if( !limOffClause["endSegment"].empty? )
|
3437
|
-
#collector.changeEndSegment(limOffClause["endSegment"])
|
3438
|
-
collector <<
|
3439
|
-
collector << limOffClause["endSegment"]
|
3440
|
-
end
|
3541
|
+
# if o.limit
|
3542
|
+
# limcoll = Arel::Collectors::SQLString.new
|
3543
|
+
# visit(o.limit,limcoll)
|
3544
|
+
# limit = limcoll.value.to_i
|
3545
|
+
# else
|
3546
|
+
# limit = nil
|
3547
|
+
# end
|
3548
|
+
#
|
3549
|
+
# if o.offset
|
3550
|
+
# offcoll = Arel::Collectors::SQLString.new
|
3551
|
+
# visit(o.offset,offcoll)
|
3552
|
+
# offset = offcoll.value.to_i
|
3553
|
+
# else
|
3554
|
+
# offset = nil
|
3555
|
+
# end
|
3556
|
+
#
|
3557
|
+
# limOffClause = @connection.get_limit_offset_clauses(limit,offset)
|
3558
|
+
#
|
3559
|
+
# if( !limOffClause["startSegment"].empty? )
|
3560
|
+
# #collector.changeFirstSegment(limOffClause["startSegment"])
|
3561
|
+
# collector.value.prepend(limOffClause["startSegment"])
|
3562
|
+
# end
|
3563
|
+
#
|
3564
|
+
# if( !limOffClause["endSegment"].empty? )
|
3565
|
+
# #collector.changeEndSegment(limOffClause["endSegment"])
|
3566
|
+
# collector << " "
|
3567
|
+
# collector << limOffClause["endSegment"]
|
3568
|
+
# end
|
3441
3569
|
|
3442
3570
|
#Initialize a new Collector and set its value to the sql string built so far with any limit and ofset modifications
|
3443
3571
|
#collector.reset(sql)
|
3444
|
-
|
3445
|
-
|
3446
|
-
|
3447
|
-
|
3448
|
-
|
3572
|
+
if (o.limit && o.offset.nil?)
|
3573
|
+
visit(o.limit, collector)
|
3574
|
+
end
|
3575
|
+
if (o.offset && o.limit.nil?)
|
3576
|
+
collector.value.prepend(" SELECT O.* FROM (SELECT I.*, ROW_NUMBER() OVER () sys_row_num FROM ( ")
|
3577
|
+
collector << (" ) AS I) AS O WHERE sys_row_num > ")
|
3578
|
+
visit(o.offset, collector)
|
3579
|
+
end
|
3580
|
+
|
3581
|
+
if (o.offset && o.limit)
|
3582
|
+
collector.value.prepend(" SELECT O.* FROM (SELECT I.*, ROW_NUMBER() OVER () sys_row_num FROM ( ")
|
3583
|
+
collector << (" ) AS I) AS O WHERE sys_row_num > ")
|
3584
|
+
visit(o.offset, collector)
|
3585
|
+
visit(o.limit, collector)
|
3586
|
+
end
|
3587
|
+
collector = maybe_visit o.lock, collector
|
3588
|
+
return collector
|
3589
|
+
end
|
3449
3590
|
|
3450
3591
|
end
|
3451
3592
|
end
|