ibm_db 0.6.0 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +11 -3
- data/README +333 -230
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +155 -78
- data/test/fixtures/db_definitions/zOS/ibm_db.sql +4 -4
- data/test/migration_test.rb +1 -0
- metadata +10 -10
data/CHANGES
CHANGED
@@ -1,8 +1,16 @@
|
|
1
|
-
|
1
|
+
Change Log
|
2
2
|
==============
|
3
|
+
2007/05/10 (IBM_DB adapter 0.6.5, driver 0.6.0):
|
4
|
+
- Driver code (ibm_db.c) remains at the same level: 0.6.0 (no changes)
|
5
|
+
- Fixed regression for reconnect after being inactive (connection recycle)
|
6
|
+
- Fixed rake db:schema:load failures on boolean data type [#10683]
|
7
|
+
- Fixed XML default option (:null => true for XML data type) [#10754]
|
8
|
+
- Fixed DB2 for zOS version 9 handling of column changes for DEFAULT NULL
|
9
|
+
|
3
10
|
2007/04/30 (0.6.0):
|
4
11
|
- Support for remote connections to DB2 Universal Database on z/OS version 9
|
5
|
-
- Support for result set pagination via ActiveRecord add_limit_offset! method
|
12
|
+
- Support for result set pagination via ActiveRecord add_limit_offset! method
|
13
|
+
for DB2 Universal Database on z/OS and i5/OS
|
6
14
|
- Defect fixes
|
7
15
|
- Improved documentation
|
8
16
|
|
@@ -36,4 +44,4 @@ CHANGE LOG
|
|
36
44
|
- Fixed compatibility issue with other adapters
|
37
45
|
- If a schema is omitted in database.yml, the username is now used as default schema
|
38
46
|
- Introduced descriptive CLI error messages when a connection or an execute statement fails
|
39
|
-
- Introduced check against schema in method 'indexes'
|
47
|
+
- Introduced check against schema in method 'indexes'
|
data/README
CHANGED
@@ -1,231 +1,334 @@
|
|
1
|
-
=====================================================================
|
2
|
-
README for the IBM_DB Adapter and Driver
|
3
|
-
For ActiveRecord Version 1.15.3 (and Rails 1.2.3)
|
4
|
-
=====================================================================
|
5
|
-
|
6
|
-
Change Log
|
7
|
-
==============
|
8
|
-
|
9
|
-
|
10
|
-
-
|
11
|
-
-
|
12
|
-
-
|
13
|
-
-
|
14
|
-
|
15
|
-
2007/04/
|
16
|
-
-
|
17
|
-
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
-
|
29
|
-
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
-
|
34
|
-
-
|
35
|
-
-
|
36
|
-
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
-
|
45
|
-
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
-
|
50
|
-
-
|
51
|
-
-
|
52
|
-
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
- IBM
|
59
|
-
-
|
60
|
-
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
1
|
+
=====================================================================
|
2
|
+
README for the IBM_DB Adapter 0.6.5 and Driver 0.6.0 (2007/04/30)
|
3
|
+
For ActiveRecord Version 1.15.3 (and Rails 1.2.3)
|
4
|
+
=====================================================================
|
5
|
+
|
6
|
+
Change Log
|
7
|
+
==============
|
8
|
+
2007/05/10 (IBM_DB adapter 0.6.5, driver 0.6.0):
|
9
|
+
- Driver code (ibm_db.c) remains at the same level: 0.6.0 (no changes)
|
10
|
+
- Fixed regression for reconnect after being inactive (connection recycle)
|
11
|
+
- Fixed rake db:schema:load failures on boolean data type [#10683]
|
12
|
+
- Fixed XML default option (:null => true for XML data type) [#10754]
|
13
|
+
- Fixed DB2 for zOS version 9 handling of column changes for DEFAULT NULL
|
14
|
+
|
15
|
+
2007/04/30 (0.6.0):
|
16
|
+
- Support for remote connections to DB2 Universal Database on z/OS version 9
|
17
|
+
- Support for result set pagination via ActiveRecord add_limit_offset! method
|
18
|
+
for DB2 Universal Database on z/OS and i5/OS
|
19
|
+
- Defect fixes
|
20
|
+
- Improved documentation
|
21
|
+
|
22
|
+
2007/04/20 (0.4.6):
|
23
|
+
- Fixed XML columns creation default value (NOT NULL)
|
24
|
+
- Fixed border case for IS NULL in where clauses
|
25
|
+
- Improved documentation (connection attributes)
|
26
|
+
|
27
|
+
2007/04/20 (0.4.5):
|
28
|
+
- Fixed reconnect problems: driver (IBM_DB::active) and adapter (active)
|
29
|
+
- Client connection attribute rename (app_user to replace user)
|
30
|
+
- Improved support for ROWID data type (DB2 for zOS version 8 and 9)
|
31
|
+
|
32
|
+
2007/03/21 (0.4.0):
|
33
|
+
- Support added for remote connectivity to DB2 zOS version 8
|
34
|
+
- Support added for remote connectivity to DB2 i5 v5r3 and v5r4
|
35
|
+
- Improved migration support (added change_column method)
|
36
|
+
- Support for setting and retrieving values for client attributes (user,
|
37
|
+
account, application, workstation)
|
38
|
+
|
39
|
+
2006/10/31 (0.2.0):
|
40
|
+
- Significant performance improvements
|
41
|
+
- Improved stored procedure support at driver level
|
42
|
+
- Added support for Large Object data types (LOBs) greater than 32K (BLOB, CLOB, XML) in size
|
43
|
+
- Added XML data type support for native storage of XML documents
|
44
|
+
- Significant quality improvements, through many bug fixes in the driver and adapter
|
45
|
+
- Improved migration support (added add_column and remove_column methods)
|
46
|
+
|
47
|
+
2006/06/07 (0.1.0):
|
48
|
+
|
49
|
+
- Fixed compatibility issue with other adapters
|
50
|
+
- If a schema is omitted in database.yml, the username is now used as default schema
|
51
|
+
- Introduced descriptive CLI error messages when a connection or an execute statement fails
|
52
|
+
- Introduced check against schema in method 'indexes'
|
53
|
+
|
54
|
+
Supported Operating Systems
|
55
|
+
============================
|
56
|
+
- Linux 32/64 bit
|
57
|
+
- Microsoft Windows 32 bit
|
58
|
+
- IBM AIX 32/64 bit
|
59
|
+
- HP-UX 32/64 bit
|
60
|
+
- Sun Solaris 32/64 bit
|
61
|
+
|
62
|
+
|
63
|
+
Supported Databases
|
64
|
+
====================
|
65
|
+
- IBM DB2 Universal Database on Linux/Unix/Windows versions 8 and 9
|
66
|
+
- Remote connections to IBM DB2 Universal Database on i5/OS versions V5R3 and V5R4.
|
67
|
+
Please ensure PTF SI27358 (includes SI27250) is installed in i5/OS version 5R3 and
|
68
|
+
and PTF SI27256 is installed while using i5/OS version 5R4.
|
69
|
+
- Remote connections to IBM DB2 Universal Database on z/OS version 8 and 9
|
70
|
+
|
71
|
+
|
72
|
+
There are two alternatives for installing the IBM_DB adapter and driver:
|
73
|
+
A. Installing as a Ruby gem in the Ruby runtime
|
74
|
+
B. Installing as a Rails plugin in a specific Rails application runtime
|
75
|
+
Note: The IBM_DB driver can also be built separately (from source) and used in direct API calls.
|
76
|
+
|
77
|
+
A. Installing the IBM_DB adapter and driver as a Ruby gem
|
78
|
+
=======================================================
|
79
|
+
The IBM_DB gem is an ActiveRecord adapter and requires the abstract adapter to register it
|
80
|
+
in the list of RAILS_CONNECTION_ADAPTERS (active_record.rb) before it can be utilized in
|
81
|
+
the Rails framework. Once registered, the IBM_DB adapter and its dependencies (ibm_db Ruby
|
82
|
+
driver and the IBM Driver for ODBC and CLI) are loaded. This enables any application in the
|
83
|
+
Ruby environment, including Rails, to interact with IBM data servers.
|
84
|
+
|
85
|
+
1. Windows platforms:
|
86
|
+
=====================
|
87
|
+
INSTALL (as Ruby gem)
|
88
|
+
To remove previous gem version (optionally):
|
89
|
+
D:\>gem uninstall ibm_db
|
90
|
+
Successfully uninstalled ibm_db version 0.6.0
|
91
|
+
|
92
|
+
Example:
|
93
|
+
D:\>gem install ibm_db
|
94
|
+
Bulk updating gem source index for: http://gems.rubyforge.org
|
95
|
+
Select which gem to install for your platform (i386-mswin32)
|
96
|
+
1. ibm_db 0.6.5 (mswin32)
|
97
|
+
2. ibm_db 0.6.5 (ruby)
|
98
|
+
3. ibm_db 0.6.0 (mswin32)
|
99
|
+
4. ibm_db 0.6.0 (ruby)
|
100
|
+
|
101
|
+
Running �gem install ibm_db� you are presented with two choices for each release
|
102
|
+
(mswin32 or ruby). Choose �mswin32� and the native extension (�ibm_db� driver)
|
103
|
+
binary file for Windows is installed.
|
104
|
+
|
105
|
+
TEST (simple gem install verification)
|
106
|
+
Note: IBM_DB gem requires a manual step after install:
|
107
|
+
add �ibm_db� into gems\1.8\gems\activerecord-1.15.3\lib\active_record.rb (Line 77)
|
108
|
+
D:\NewApp>dir vendor\plugins
|
109
|
+
D:\NewApp>irb
|
110
|
+
irb(main):001:0> gem 'ibm_db'
|
111
|
+
irb(main):002:0> require 'mswin32/ibm_db' // notice the [mswin32] in the library path
|
112
|
+
irb(main):003:0> IBM_DB::connect 'sample', 'db2admin', 'secret'
|
113
|
+
D:\NewApp>ruby script\console
|
114
|
+
|
115
|
+
BUILD (optionally) �ibm_db� gem from sources (ibm_db-x.x.x.tar.gz):
|
116
|
+
1. Download source from Rubyforge
|
117
|
+
http://rubyforge.org/frs/?group_id=2361
|
118
|
+
2. Build gem from specification (IBM_DB.gemspec)
|
119
|
+
D:\IBM_DB_Adapter\ibm_db>gem build IBM_DB.gemspec
|
120
|
+
|
121
|
+
|
122
|
+
2. Linux and Unix platforms:
|
123
|
+
============================
|
124
|
+
|
125
|
+
INSTALL (as Ruby gem)
|
126
|
+
To remove previous gem version (optionally):
|
127
|
+
$ gem uninstall ibm_db
|
128
|
+
Successfully uninstalled ibm_db version 0.6.0
|
129
|
+
|
130
|
+
Note: DB2 environment is required while using an arbitrary user account
|
131
|
+
(other than the DB2 install user account)
|
132
|
+
$ . /home/db2inst1/sqllib/db2profile
|
133
|
+
$ export IBM_DB_DIR=/opt/ibm/db2/V9.1
|
134
|
+
$ export IBM_DB_LIB=/opt/ibm/db2/V9.1/lib32
|
135
|
+
$ gem install ibm_db
|
136
|
+
Select which gem to install for your platform (i686-linux)
|
137
|
+
1. ibm_db 0.6.5 (mswin32)
|
138
|
+
2. ibm_db 0.6.5 (ruby)
|
139
|
+
3. ibm_db 0.6.0 (ruby)
|
140
|
+
4. ibm_db 0.6.0 (mswin32)
|
141
|
+
...
|
142
|
+
Running �gem install ibm_db� you are presented with two choices for each release
|
143
|
+
(mswin32 or ruby). Choose �ruby� and the native extension (�ibm_db� driver) is built.
|
144
|
+
...
|
145
|
+
> 2
|
146
|
+
Building native extensions. This could take a while...
|
147
|
+
Successfully installed ibm_db-0.6.5
|
148
|
+
Installing ri documentation for ibm_db-0.6.5...
|
149
|
+
Installing RDoc documentation for ibm_db-0.6.5...
|
150
|
+
|
151
|
+
TEST (simple gem install verification)
|
152
|
+
Note: IBM_DB gem requires a manual step after install:
|
153
|
+
add �ibm_db� into /gems/activerecord-1.15.3/lib/active_record.rb (Line 77)
|
154
|
+
$ ls -al vendor/plugins/
|
155
|
+
$ irb
|
156
|
+
irb(main):001:0> gem 'ibm_db'
|
157
|
+
irb(main):002:0> require 'ibm_db' // notice the library path (different on win32)
|
158
|
+
irb(main):003:0> IBM_DB::connect 'sample', 'db2admin', 'secret'
|
159
|
+
$ ./script/console
|
160
|
+
|
161
|
+
BUILD (optionally) �ibm_db� gem from sources (ibm_db-x.x.x.tar.gz):
|
162
|
+
1. Download source from Rubyforge
|
163
|
+
http://rubyforge.org/frs/?group_id=2361
|
164
|
+
2. Build gem from specification (IBM_DB.gemspec)
|
165
|
+
$ cd IBM_DB_Adapter/ibm_db
|
166
|
+
$ gem build IBM_DB.gemspec
|
167
|
+
|
168
|
+
|
169
|
+
B. Installing the IBM_DB adapter and driver as a Rails plugin
|
170
|
+
=============================================================
|
171
|
+
IBM_DB adapter and driver install as plugin provides support for IBM data servers
|
172
|
+
within the scope of a specific and individual Rails application. Rails plugins do
|
173
|
+
not offer the version management specific to Ruby gems, but does provide an
|
174
|
+
initialization mechanism which allows the IBM_DB plugin to self-insert into the
|
175
|
+
ActiveRecord's list of supported adapters: RAILS_CONNECTION_ADAPTERS. Therefore,
|
176
|
+
after installing IBM_DB as plugin in your Rails application, no manual step is required
|
177
|
+
for the Rails framework to load it.
|
178
|
+
|
179
|
+
1. Windows platforms
|
180
|
+
=====================
|
181
|
+
Register Repository and Query:
|
182
|
+
|
183
|
+
A. Download and install Subversion (SVN) client from:
|
184
|
+
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
|
185
|
+
Register rubyibm project as plugin source
|
186
|
+
D:\NewApp>ruby script\plugin source svn://rubyforge.org/var/svn/rubyibm/trunk/IBM_DB_Adapter/
|
187
|
+
|
188
|
+
B. Accessing RubyForge repository through HTTP (no SVN client required) is NOT YET ENABLED
|
189
|
+
D:\NewApp>ruby script\plugin source http://rubyibm.rubyforge.org/IBM_DB_Adapter/
|
190
|
+
|
191
|
+
LIST plugin
|
192
|
+
D:\NewApp>ruby script\plugin list
|
193
|
+
|
194
|
+
INSTALL (as Rails plugin)
|
195
|
+
D:\NewApp>ruby script\plugin install ibm_db
|
196
|
+
|
197
|
+
TEST (simple plugin install verification)
|
198
|
+
Note: Make sure there's no ibm_db in gems\1.8\gems\activerecord-1.15.3\lib\active_record.rb (Line 77)
|
199
|
+
D:\NewApp>ruby script\console
|
200
|
+
|
201
|
+
2. Linux and Unix platforms
|
202
|
+
===========================
|
203
|
+
Register Repository and Query:
|
204
|
+
|
205
|
+
A. Ensure Subversion (SVN) client is installed or download from:
|
206
|
+
http://subversion.tigris.org/project_packages.html
|
207
|
+
Register rubyibm project as plugin source
|
208
|
+
$ ./script/plugin source svn://rubyforge.org/var/svn/rubyibm/trunk/IBM_DB_Adapter/
|
209
|
+
|
210
|
+
B. Accessing RubyForge repository through HTTP (no SVN client required) is NOT YET ENABLED
|
211
|
+
$ ./script/plugin source http://rubyibm.rubyforge.org/IBM_DB_Adapter/
|
212
|
+
|
213
|
+
LIST plugin
|
214
|
+
$ ./script/plugin list
|
215
|
+
|
216
|
+
INSTALL (as Rails plugin)
|
217
|
+
$ ./script/plugin install ibm_db
|
218
|
+
|
219
|
+
TEST (simple plugin install verification)
|
220
|
+
Note: Make sure there's no ibm_db in /gems/activerecord-1.15.3/lib/active_record.rb (Line 77)
|
221
|
+
$ ./script/console
|
222
|
+
|
223
|
+
|
224
|
+
Instructions for building and installing the IBM_DB driver from source
|
225
|
+
=======================================================================
|
226
|
+
Building the driver manually as described below is not required if any the install
|
227
|
+
alternatives above have been pursued. This manual procedure is in fact automated
|
228
|
+
on Linux and UNIX platforms by the IBM_DB gem and plugin install, but is presented
|
229
|
+
here only for reference, and also involves running the unit tests.
|
230
|
+
|
231
|
+
Prerequisites:
|
232
|
+
Install Ruby from:
|
233
|
+
http://rubyforge.org
|
234
|
+
|
235
|
+
Linux and Unix platforms:
|
236
|
+
Note: commands may vary depending on the shell used
|
237
|
+
- To setup DB2 environment while using an arbitrary user account
|
238
|
+
(other than the DB2 install user account):
|
239
|
+
Example:
|
240
|
+
$ . /home/db2inst1/sqllib/db2profile
|
241
|
+
|
242
|
+
- To configure test database:
|
243
|
+
DB2 v9.x: some IBM_DB driver tests require a UTF-8 database:
|
244
|
+
$ db2 CREATE DATABASE testdrv USING CODESET UTF-8 \
|
245
|
+
TERRITORY US COLLATE USING SYSTEM PAGESIZE 32768
|
246
|
+
DB2 v8.x: driver tests 195 and 52949 requires XML functionality
|
247
|
+
only available in DB2 v9.x
|
248
|
+
|
249
|
+
- To configure database connection parameters edit config.yaml
|
250
|
+
Example:
|
251
|
+
database: testdrv
|
252
|
+
user: db2inst1
|
253
|
+
password: password
|
254
|
+
hostname: localhost
|
255
|
+
port: 50000
|
256
|
+
|
257
|
+
- To compile and link with DB2 client libraries:
|
258
|
+
$ export IBM_DB_DIR=/opt/ibm/db2/V9.1
|
259
|
+
$ export IBM_DB_LIB=/opt/ibm/db2/V9.1/lib32
|
260
|
+
|
261
|
+
Windows platforms:
|
262
|
+
- Install Visual C++ 2003, Platform SDK (latest), .Net SDK Version 1.1 from:
|
263
|
+
http://wiki.tcl.tk/11431
|
264
|
+
- Set environment:
|
265
|
+
CALL "C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\SetEnv.Cmd"
|
266
|
+
CALL "C:\Program Files\Microsoft Visual C++ Toolkit 2003\vcvars32.bat"
|
267
|
+
SET LIB=%LIB%;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib
|
268
|
+
- To configure database connection parameters edit config.yaml
|
269
|
+
|
270
|
+
Build and Execution:
|
271
|
+
rake
|
272
|
+
|
273
|
+
Execution of tests without compilation (must have .so in ibm_db source directory):
|
274
|
+
rake onlytests
|
275
|
+
|
276
|
+
Execution of a single test inside the tests directory can be done by the following:
|
277
|
+
export SINGLE_RUBY_TEST=test_001.rb
|
278
|
+
rake
|
279
|
+
|
280
|
+
|
281
|
+
Limitations and known problems
|
282
|
+
==============================
|
283
|
+
- ActiveRecord rename_column method is not supported for DB2 LUW, zOS and i5
|
284
|
+
- ActiveRecord remove_column method is not supported for DB2 zOS
|
285
|
+
- The following tests from the ActiveRecord 1.15.3 test suite are expected to fail
|
286
|
+
- test_limited_eager_with_multiple_order_columns
|
287
|
+
- test_limited_eager_with_order
|
288
|
+
- test_assign_ids_ignoring_blanks
|
289
|
+
- test_build_by_new_record
|
290
|
+
- test_get_ids
|
291
|
+
- test_select_limited_ids_list
|
292
|
+
- test_add_index
|
293
|
+
- The following tests from the driver test suite are expected to fail on DB2 version 8
|
294
|
+
on Linux/Unix/Windows because of missing native XML support. If you want to
|
295
|
+
make use of the native XML features in DB2, please upgrade to version 9
|
296
|
+
- test_195.rb
|
297
|
+
- test_52949.rb
|
298
|
+
- The driver returns an error when you try to insert a TIMESTAMP value into a DATE column.
|
299
|
+
To fix this, please ensure that the following configuration keyword PATCH2=58 is set
|
300
|
+
in the COMMON section of your DB2 CLI initialization file (db2cli.ini):
|
301
|
+
- set: db2 UPDATE CLI CFG FOR SECTION COMMON USING PATCH2 58
|
302
|
+
- verify: db2 GET CLI CFG FOR SECTION COMMON
|
303
|
+
Please refer to http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.apdv.cli.doc/doc/c0007882.htm
|
304
|
+
for more information.
|
305
|
+
- The behaviour of ActiveRecord::Base.find(:first) without an :order attribute can be unpredictable.
|
306
|
+
The first record (i.e. the record with the minimum id) may be not be retrieved. In a relational model,
|
307
|
+
the order of the rows returned is unpredictable and independent of the order of insertion.
|
308
|
+
This issue may be addressed in a future release.
|
309
|
+
- Rails applications on DB2 9 require the APPLHEAPSZ database configuration parameter to be
|
310
|
+
set to or above 1024. You will need to set this parameter for each database for which you will be
|
311
|
+
running DB2 on Rails applications. Following is the command syntax for updating the
|
312
|
+
applheapsz parameter:
|
313
|
+
> db2 update db cfg for <database_name> using APPLHEAPSZ 1024
|
314
|
+
To enable this parameter, you need to restart your DB2 instance.
|
315
|
+
- IBM_DB is not supported on JRuby. As stated in the JRuby Wiki, "Basics of Getting JRuby Running":
|
316
|
+
'You may install other gems, but keep in mind that libraries with C extension dependencies
|
317
|
+
will not work in JRuby.' http://www.headius.com/jrubywiki/index.php/Getting_Started
|
318
|
+
The IBM_DB adapter relies on IBM_DB driver (C extension) and the IBM Driver for ODBC and
|
319
|
+
CLI to access databases on IBM data servers. Alternatively, you can either use the regular C
|
320
|
+
implementation of Ruby, or use ActiveRecord-JDBC adapter to access databases.
|
321
|
+
|
322
|
+
To Do
|
323
|
+
====
|
324
|
+
- Support Informix Dynamic Server 11.10
|
325
|
+
- Support ActiveRecord remove_column method for DB2 zOS version 9
|
326
|
+
|
327
|
+
|
328
|
+
Feedback
|
329
|
+
========
|
330
|
+
Your feedback is very much appreciated and expected through Rubyforge:
|
331
|
+
- rubyibm project: http://rubyforge.org/projects/rubyibm/
|
332
|
+
- rubyibm forum: http://rubyforge.org/forum/?group_id=2361
|
333
|
+
- rubyibm bug reports: http://rubyforge.org/tracker/?group_id=2361
|
231
334
|
- IBM_DB developers: rubyibm-developers@rubyforge.org
|
@@ -10,20 +10,25 @@ require 'active_record/connection_adapters/abstract_adapter'
|
|
10
10
|
|
11
11
|
module ActiveRecord
|
12
12
|
class Base
|
13
|
-
# Method required to handle LOBs and XML fields.
|
14
|
-
#
|
15
|
-
#
|
13
|
+
# Method required to handle LOBs and XML fields.
|
14
|
+
# An after save callback checks if a marker has been inserted through
|
15
|
+
# the insert or update, and then proceeds to update that record with
|
16
|
+
# the actual large object through a prepared statement (param binding).
|
16
17
|
after_save :handle_lobs
|
17
18
|
def handle_lobs()
|
18
19
|
if connection.kind_of?(ConnectionAdapters::IBM_DBAdapter)
|
19
20
|
# Checks that the insert or update had at least a BLOB, CLOB or XML field
|
20
|
-
if connection.sql =~ /BLOB\('(.*)'\)/i ||
|
21
|
+
if connection.sql =~ /BLOB\('(.*)'\)/i ||
|
22
|
+
connection.sql =~ /@@@IBMTEXT@@@/i ||
|
23
|
+
connection.sql =~ /@@@IBMXML@@@/i
|
21
24
|
update_query = "UPDATE #{self.class.table_name} SET ("
|
22
25
|
counter = 0
|
23
26
|
values = []
|
24
27
|
params = []
|
25
28
|
# Selects only binary, text and xml columns
|
26
|
-
self.class.columns.select{|col| col.type == :binary ||
|
29
|
+
self.class.columns.select{|col| col.type == :binary ||
|
30
|
+
col.type == :text ||
|
31
|
+
col.type == :xml}.each do |col|
|
27
32
|
# Adds the selected columns to the query
|
28
33
|
if counter == 0
|
29
34
|
update_query << "#{col.name}"
|
@@ -31,8 +36,11 @@ module ActiveRecord
|
|
31
36
|
update_query << ",#{col.name}"
|
32
37
|
end
|
33
38
|
|
34
|
-
# Add a '?' for the parameter or a NULL if the value is nil or empty
|
35
|
-
|
39
|
+
# Add a '?' for the parameter or a NULL if the value is nil or empty
|
40
|
+
# (except for a CLOB field where '' can be a value)
|
41
|
+
if self[col.name].nil? ||
|
42
|
+
self[col.name] == {} ||
|
43
|
+
(self[col.name] == '' && col.type != :text)
|
36
44
|
params << 'NULL'
|
37
45
|
else
|
38
46
|
values << self[col.name]
|
@@ -90,7 +98,8 @@ module ActiveRecord
|
|
90
98
|
# Retrieves database user credentials from the +config+ hash
|
91
99
|
# or raises ArgumentError in case of failure.
|
92
100
|
if !config.has_key?(:username) || !config.has_key?(:password)
|
93
|
-
raise ArgumentError, "Missing argument(s): Database configuration #{config}
|
101
|
+
raise ArgumentError, "Missing argument(s): Database configuration #{config} \
|
102
|
+
requires credentials: username and password"
|
94
103
|
else
|
95
104
|
username = config[:username].to_s
|
96
105
|
password = config[:password].to_s
|
@@ -121,9 +130,13 @@ module ActiveRecord
|
|
121
130
|
# A net address connection requires a port. If no port has been specified, 50000 is used by default
|
122
131
|
port = config[:port] || 50000
|
123
132
|
# Connects to the database using the database, host, port, username and password specified
|
124
|
-
connection = IBM_DB::connect "DRIVER={IBM DB2 ODBC DRIVER}
|
125
|
-
|
126
|
-
|
133
|
+
connection = IBM_DB::connect "DRIVER={IBM DB2 ODBC DRIVER};\
|
134
|
+
DATABASE=#{database};\
|
135
|
+
HOSTNAME=#{host};\
|
136
|
+
PORT=#{port};\
|
137
|
+
PROTOCOL=TCPIP;\
|
138
|
+
UID=#{username};\
|
139
|
+
PWD=#{password};", '', '', conn_options
|
127
140
|
else
|
128
141
|
# No host implies a local catalog-based connection: +database+ represents catalog alias
|
129
142
|
connection = IBM_DB::connect( database, username, password, conn_options )
|
@@ -195,6 +208,40 @@ module ActiveRecord
|
|
195
208
|
end # method simplified_type
|
196
209
|
end #class IBM_DBColumn
|
197
210
|
|
211
|
+
class TableDefinition
|
212
|
+
# Overrides the abstract adapter in order to handle
|
213
|
+
# the DEFAULT option for the native XML datat type
|
214
|
+
def column(name, type, options ={})
|
215
|
+
# construct a column definition where @base is adaptor instance
|
216
|
+
column = ColumnDefinition.new(@base, name, type)
|
217
|
+
column.null = options[:null] # if options[:null]
|
218
|
+
|
219
|
+
# DB2 does not accept DEFAULT NULL option for XML in table create
|
220
|
+
unless type.to_s == 'xml'
|
221
|
+
column.default = options[:default] # if options[:default]
|
222
|
+
else
|
223
|
+
unless options[:default]
|
224
|
+
# override column object method to not append DEFAULT NULL
|
225
|
+
def column.to_s
|
226
|
+
"#{base.quote_column_name(name)} #{type}"
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
column.scale = options[:scale] if options[:scale]
|
231
|
+
column.precision = options[:precision] if options[:precision]
|
232
|
+
# append column's limit option and yield native limits
|
233
|
+
if options[:limit]
|
234
|
+
column.limit = options[:limit]
|
235
|
+
elsif @base.native_database_types[type.to_sym]
|
236
|
+
column.limit = @base.native_database_types[type.to_sym][:limit]
|
237
|
+
end
|
238
|
+
|
239
|
+
unless @columns.include? column
|
240
|
+
@columns << column
|
241
|
+
end
|
242
|
+
return self
|
243
|
+
end
|
244
|
+
end
|
198
245
|
|
199
246
|
# The IBM_DB Adapter requires the native Ruby driver (ibm_db)
|
200
247
|
# for IBM data servers (ibm_db.so).
|
@@ -252,23 +299,19 @@ module ActiveRecord
|
|
252
299
|
if @connection
|
253
300
|
server_info = IBM_DB::server_info( @connection )
|
254
301
|
case server_info.DBMS_NAME
|
255
|
-
# DB2
|
256
|
-
|
257
|
-
|
258
|
-
# DB2 on zOS
|
259
|
-
#
|
260
|
-
when /DB2/i
|
302
|
+
when /DB2\//i # DB2 for Linux, Unix and Windows (LUW)
|
303
|
+
@servertype = IBM_DB2_LUW.new(self)
|
304
|
+
when /DB2/i # DB2 for zOS
|
261
305
|
case server_info.DBMS_VER
|
262
|
-
when /09/
|
263
|
-
@servertype = IBM_DB2_ZOS.new(
|
264
|
-
when /08/
|
265
|
-
@servertype = IBM_DB2_ZOS_8.new(
|
266
|
-
else
|
306
|
+
when /09/ # DB2 for zOS version 9
|
307
|
+
@servertype = IBM_DB2_ZOS.new(self)
|
308
|
+
when /08/ # DB2 for zOS version 8
|
309
|
+
@servertype = IBM_DB2_ZOS_8.new(self)
|
310
|
+
else # DB2 for zOS version 7
|
267
311
|
raise "Only DB2 z/OS version 8 and above are currently supported"
|
268
312
|
end
|
269
|
-
# DB2
|
270
|
-
|
271
|
-
@servertype = IBM_DB2_I5.new(@connection, self)
|
313
|
+
when /AS/i # DB2 for i5 (iSeries)
|
314
|
+
@servertype = IBM_DB2_I5.new(self)
|
272
315
|
end
|
273
316
|
end
|
274
317
|
# Executes the +set schema+ statement using the schema identifier provided
|
@@ -354,12 +397,17 @@ module ActiveRecord
|
|
354
397
|
# If the type of connection is net based
|
355
398
|
if @host
|
356
399
|
# Connects and assigns the resulting IBM_DB::Connection to the +@connection+ instance variable
|
357
|
-
@connection = IBM_DB::connect
|
358
|
-
|
400
|
+
@connection = IBM_DB::connect("DRIVER={IBM DB2 ODBC DRIVER};\
|
401
|
+
DATABASE=#{@database};\
|
402
|
+
HOSTNAME=#{@host};\
|
403
|
+
PORT=#{@port};\
|
404
|
+
PROTOCOL=TCPIP;\
|
405
|
+
UID=#{@username};\
|
406
|
+
PWD=#{@password};", '', '', @conn_options)
|
359
407
|
else
|
360
408
|
# Connects to the database using the local alias (@database)
|
361
409
|
# and assigns the connection object (IBM_DB::Connection) to @connection
|
362
|
-
@connection = IBM_DB::connect
|
410
|
+
@connection = IBM_DB::connect(@database, @username, @password, @conn_options)
|
363
411
|
end
|
364
412
|
# Sets the schema if different from default (username)
|
365
413
|
if @schema && @schema != @username
|
@@ -390,18 +438,19 @@ module ActiveRecord
|
|
390
438
|
def create_table(name, options = {})
|
391
439
|
@servertype.setup_for_lob_table
|
392
440
|
super
|
393
|
-
@servertype.create_index_after_table(name
|
441
|
+
@servertype.create_index_after_table(name)
|
394
442
|
end
|
395
443
|
|
396
444
|
# Returns an array of hashes with the column names as keys and
|
397
|
-
# column values as values. +sql+ is the select query,
|
445
|
+
# column values as values. +sql+ is the select query,
|
446
|
+
# and +name+ is an optional description for logging
|
398
447
|
def select_all(sql, name = nil)
|
399
448
|
# Replaces {"= NULL" with " IS NULL"} OR {"IN (NULL)" with " IS NULL"}
|
400
449
|
sql.gsub!( /(=\s*NULL|IN\s*\(NULL\))/i, " IS NULL" )
|
401
450
|
|
402
451
|
results = []
|
403
|
-
# Invokes the method +execute+ in order to log and execute the
|
404
|
-
#
|
452
|
+
# Invokes the method +execute+ in order to log and execute the SQL
|
453
|
+
# IBM_DB::Statement is returned from which results can be fetched
|
405
454
|
if stmt = execute(sql, name)
|
406
455
|
begin
|
407
456
|
@servertype.select_all(sql, name, stmt, results)
|
@@ -440,7 +489,6 @@ module ActiveRecord
|
|
440
489
|
# Executes and logs +sql+ commands and
|
441
490
|
# returns a +IBM_DB::Statement+ object.
|
442
491
|
def execute(sql, name = nil)
|
443
|
-
sql.gsub!( /(\s*xml DEFAULT NULL)/i, " xml NOT NULL" )
|
444
492
|
# Logs and execute the sql instructions.
|
445
493
|
# The +log+ method is defined in the parent class +AbstractAdapter+
|
446
494
|
log(sql, name) do
|
@@ -525,8 +573,10 @@ module ActiveRecord
|
|
525
573
|
# If there is a non-zero limit
|
526
574
|
else
|
527
575
|
offset = options[:offset]
|
528
|
-
# If an offset is specified builds the query with offset and limit,
|
529
|
-
|
576
|
+
# If an offset is specified builds the query with offset and limit,
|
577
|
+
# otherwise retrieves only the first +limit+ rows
|
578
|
+
offset ? sql = query_offset_limit(sql, offset, limit) \
|
579
|
+
: sql << " FETCH FIRST #{limit} ROWS ONLY"
|
530
580
|
end
|
531
581
|
end
|
532
582
|
# Returns the sql query in any case
|
@@ -658,6 +708,8 @@ module ActiveRecord
|
|
658
708
|
# strip off limits on data types not supporting them
|
659
709
|
if [:integer, :double, :date, :time, :timestamp, :xml].include? type
|
660
710
|
return type.to_s
|
711
|
+
elsif type.to_sym == :boolean
|
712
|
+
return "smallint"
|
661
713
|
else
|
662
714
|
return super
|
663
715
|
end
|
@@ -747,12 +799,20 @@ module ActiveRecord
|
|
747
799
|
# Assigns the field length (size) for the column
|
748
800
|
column_length = col["column_size"]
|
749
801
|
column_scale = col["decimal_digits"]
|
750
|
-
# The initializer of the class Column, requires the +column_length+ to be declared
|
751
|
-
# the datatype(e.g VARCHAR(50)) for :string and :text types.
|
802
|
+
# The initializer of the class Column, requires the +column_length+ to be declared
|
803
|
+
# between brackets after the datatype(e.g VARCHAR(50)) for :string and :text types.
|
804
|
+
# If it's a "for bit data" field it does a subsitution in place, if not
|
752
805
|
# it appends the (column_length) string on the supported data types
|
753
|
-
unless column_length.nil? ||
|
806
|
+
unless column_length.nil? ||
|
807
|
+
column_length == '' ||
|
808
|
+
column_type.sub!(/ \(\) for bit data/i,"(#{column_length}) FOR BIT DATA") ||
|
809
|
+
!column_type =~ /char|lob|graphic/i
|
754
810
|
if column_type =~ /decimal/i
|
755
811
|
column_type << "(#{column_length},#{column_scale})"
|
812
|
+
elsif column_type =~ /smallint/i
|
813
|
+
column_type << "" # override the native column size limit [5]
|
814
|
+
elsif column_type =~ /xml/i
|
815
|
+
column_type << "" # override the native column size limit [0]
|
756
816
|
else
|
757
817
|
column_type << "(#{column_length})"
|
758
818
|
end
|
@@ -823,12 +883,7 @@ module ActiveRecord
|
|
823
883
|
# change_column_default(:accounts, :authorized, 1)
|
824
884
|
# Method overriden to satisfy IBM data servers syntax.
|
825
885
|
def change_column_default(table_name, column_name, default)
|
826
|
-
|
827
|
-
change_column_sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET WITH DEFAULT #{quote(default)}"
|
828
|
-
stmt = execute(change_column_sql)
|
829
|
-
# Ensures to free the resources associated with the statement
|
830
|
-
ensure
|
831
|
-
IBM_DB::free_result stmt if stmt
|
886
|
+
@servertype.change_column_default(table_name, column_name, default)
|
832
887
|
end
|
833
888
|
|
834
889
|
# Adds a new index to the table. +column_name+ can be a single Symbol, or
|
@@ -906,15 +961,14 @@ module ActiveRecord
|
|
906
961
|
|
907
962
|
# This class contains common code across DB's (DB2 LUW, zOS and i5)
|
908
963
|
class IBM_DataServer
|
909
|
-
def initialize(
|
910
|
-
@
|
911
|
-
@caller = caller
|
964
|
+
def initialize(adapter)
|
965
|
+
@adapter = adapter
|
912
966
|
end
|
913
967
|
|
914
968
|
def last_generated_id
|
915
969
|
end
|
916
970
|
|
917
|
-
def create_index_after_table (table_name
|
971
|
+
def create_index_after_table (table_name)
|
918
972
|
end
|
919
973
|
|
920
974
|
def setup_for_lob_table ()
|
@@ -931,12 +985,14 @@ module ActiveRecord
|
|
931
985
|
# and by the DB2 for i5 data servers
|
932
986
|
def remove_column(table_name, column_name)
|
933
987
|
begin
|
934
|
-
@
|
988
|
+
@adapter.execute "ALTER TABLE #{table_name} DROP #{column_name}"
|
935
989
|
reorg_table(table_name)
|
936
990
|
rescue StandardError => exec_err
|
937
991
|
# Provide details on the current XML columns support
|
938
992
|
if exec_err.message.include?('SQLCODE=-1242') && exec_err.message.include?('42997')
|
939
|
-
raise StatementInvalid,
|
993
|
+
raise StatementInvalid,
|
994
|
+
"A column that is part of a table containing an XML column cannot be dropped. \
|
995
|
+
To remove the column, the table must be dropped and recreated without the #{column_name} column: #{exec_err}"
|
940
996
|
else
|
941
997
|
raise
|
942
998
|
end
|
@@ -944,15 +1000,12 @@ module ActiveRecord
|
|
944
1000
|
end
|
945
1001
|
|
946
1002
|
def set_schema(schema)
|
947
|
-
@
|
1003
|
+
@adapter.execute("SET SCHEMA #{schema}")
|
948
1004
|
end
|
949
1005
|
|
950
1006
|
def select_all(sql, name, stmt, results)
|
951
1007
|
end
|
952
1008
|
|
953
|
-
def execute(sql, name)
|
954
|
-
end
|
955
|
-
|
956
1009
|
def query_offset_limit(sql, offset, limit)
|
957
1010
|
end
|
958
1011
|
|
@@ -970,13 +1023,12 @@ module ActiveRecord
|
|
970
1023
|
return "INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 100) PRIMARY KEY"
|
971
1024
|
end
|
972
1025
|
|
973
|
-
#
|
974
|
-
#
|
975
|
-
# method
|
1026
|
+
# Returns the last automatically generated ID.
|
1027
|
+
# This method is required by the +insert+ method
|
976
1028
|
def last_generated_id
|
977
1029
|
# Queries the db to obtain the last ID that was automatically generated
|
978
1030
|
sql = "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1"
|
979
|
-
stmt = IBM_DB::exec(@connection, sql)
|
1031
|
+
stmt = IBM_DB::exec(@adapter.connection, sql)
|
980
1032
|
# Fetches the only record available (containing the last id)
|
981
1033
|
IBM_DB::fetch_row(stmt)
|
982
1034
|
# Retrieves and returns the result of the query with the last id.
|
@@ -984,22 +1036,33 @@ module ActiveRecord
|
|
984
1036
|
end
|
985
1037
|
|
986
1038
|
def change_column(table_name, column_name, type, options)
|
987
|
-
data_type = @
|
1039
|
+
data_type = @adapter.type_to_sql(type, options[:limit], options[:precision], options[:scale])
|
988
1040
|
begin
|
989
|
-
|
1041
|
+
execute "ALTER TABLE #{table_name} ALTER #{column_name} SET DATA TYPE #{data_type}"
|
990
1042
|
rescue StandardError => exec_err
|
991
1043
|
if exec_err.message.include?('SQLCODE=-190')
|
992
|
-
raise StatementInvalid,
|
1044
|
+
raise StatementInvalid,
|
1045
|
+
"Please consult documentation for compatible data types while changing column datatype. \
|
1046
|
+
The column datatype change to [#{data_type}] is not supported by this data server: #{exec_err}"
|
993
1047
|
else
|
994
1048
|
raise
|
995
1049
|
end
|
996
1050
|
end
|
997
1051
|
reorg_table(table_name)
|
998
1052
|
if !options[:default].nil?
|
999
|
-
|
1053
|
+
change_column_default(table_name, column_name, options[:default])
|
1000
1054
|
end
|
1001
1055
|
end
|
1002
1056
|
|
1057
|
+
def change_column_default(table_name, column_name, default)
|
1058
|
+
# SQL statement which alters column's default value
|
1059
|
+
change_column_sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} \
|
1060
|
+
SET WITH DEFAULT #{@adapter.quote(default)}"
|
1061
|
+
stmt = execute(change_column_sql)
|
1062
|
+
ensure
|
1063
|
+
IBM_DB::free_result stmt if stmt
|
1064
|
+
end
|
1065
|
+
|
1003
1066
|
# Fetches all the results available. IBM_DB::fetch_assoc(stmt) returns
|
1004
1067
|
# an hash for each single record.
|
1005
1068
|
# The loop stops when there aren't any more valid records to fetch
|
@@ -1057,13 +1120,14 @@ module ActiveRecord
|
|
1057
1120
|
@limit = nil
|
1058
1121
|
end
|
1059
1122
|
|
1060
|
-
def execute(sql, name)
|
1123
|
+
def execute(sql, name = nil)
|
1061
1124
|
# Check if there is a limit and/or an offset
|
1062
1125
|
# If so then make sure and use a static cursor type
|
1063
1126
|
if (!@offset.nil? && @offset >= 0) || (!@limit.nil? && @limit > 0)
|
1064
1127
|
begin
|
1065
1128
|
# Set the cursor type to static so we can later utilize the offset and limit correctly
|
1066
|
-
if stmt = IBM_DB::exec(@connection, sql,
|
1129
|
+
if stmt = IBM_DB::exec(@adapter.connection, sql,
|
1130
|
+
{IBM_DB::SQL_ATTR_CURSOR_TYPE => IBM_DB::SQL_CURSOR_STATIC})
|
1067
1131
|
stmt # Return the statement object
|
1068
1132
|
else
|
1069
1133
|
raise StatementInvalid, IBM_DB::stmt_errormsg
|
@@ -1078,7 +1142,7 @@ module ActiveRecord
|
|
1078
1142
|
end
|
1079
1143
|
else
|
1080
1144
|
begin
|
1081
|
-
if stmt = IBM_DB::exec(@connection, sql)
|
1145
|
+
if stmt = IBM_DB::exec(@adapter.connection, sql)
|
1082
1146
|
stmt # Return the statement object
|
1083
1147
|
else
|
1084
1148
|
raise StatementInvalid, IBM_DB::stmt_errormsg
|
@@ -1103,7 +1167,7 @@ module ActiveRecord
|
|
1103
1167
|
class IBM_DB2_LUW < IBM_DB2
|
1104
1168
|
# Reorganizes the table for column changes
|
1105
1169
|
def reorg_table(table_name)
|
1106
|
-
|
1170
|
+
execute("CALL ADMIN_CMD('REORG TABLE #{table_name}')")
|
1107
1171
|
end
|
1108
1172
|
|
1109
1173
|
def select_all(sql, name, stmt, results)
|
@@ -1116,9 +1180,9 @@ module ActiveRecord
|
|
1116
1180
|
end
|
1117
1181
|
end
|
1118
1182
|
|
1119
|
-
def execute(sql, name)
|
1183
|
+
def execute(sql, name = nil)
|
1120
1184
|
begin
|
1121
|
-
if stmt = IBM_DB::exec(@connection, sql)
|
1185
|
+
if stmt = IBM_DB::exec(@adapter.connection, sql)
|
1122
1186
|
stmt # Return the statement object
|
1123
1187
|
else
|
1124
1188
|
raise StatementInvalid, IBM_DB::stmt_errormsg
|
@@ -1167,21 +1231,29 @@ module ActiveRecord
|
|
1167
1231
|
|
1168
1232
|
class IBM_DB2_ZOS < IBM_DB2
|
1169
1233
|
# since v9 doesn't need, suggest putting it in HostedDataServer?
|
1170
|
-
def create_index_after_table(table_name
|
1171
|
-
|
1234
|
+
def create_index_after_table(table_name)
|
1235
|
+
@adapter.add_index(table_name, "id", :unique => true)
|
1172
1236
|
end
|
1173
1237
|
|
1174
1238
|
def remove_column(table_name, column_name)
|
1175
|
-
raise NotImplementedError,
|
1239
|
+
raise NotImplementedError,
|
1240
|
+
"remove_column is not supported by the DB2 for zOS data server"
|
1176
1241
|
end
|
1177
|
-
|
1178
|
-
# DB2 z/OS only allows
|
1179
|
-
#
|
1180
|
-
# if value is not empty or equivalent to the string "null",
|
1181
|
-
# the server will complain
|
1242
|
+
|
1243
|
+
# DB2 z/OS only allows NULL or "" (empty) string as DEFAULT value for a BLOB column.
|
1244
|
+
# For non-empty string and non-NULL values, the server returns error
|
1182
1245
|
def set_blob_default(value)
|
1183
1246
|
"#{value}"
|
1184
1247
|
end
|
1248
|
+
|
1249
|
+
def change_column_default(table_name, column_name, default)
|
1250
|
+
unless default
|
1251
|
+
raise NotImplementedError,
|
1252
|
+
"DB2 for zOS data server version 9 does not support changing the column default to NULL"
|
1253
|
+
else
|
1254
|
+
super
|
1255
|
+
end
|
1256
|
+
end
|
1185
1257
|
end # class IBM_DB2_ZOS
|
1186
1258
|
|
1187
1259
|
class IBM_DB2_ZOS_8 < IBM_DB2_ZOS
|
@@ -1189,7 +1261,7 @@ module ActiveRecord
|
|
1189
1261
|
# Setting the SQLID on z/OS will also update the CURRENT SCHEMA
|
1190
1262
|
# special register, but not vice versa
|
1191
1263
|
def set_schema(schema)
|
1192
|
-
|
1264
|
+
execute("SET CURRENT SQLID ='#{schema.upcase}'")
|
1193
1265
|
end
|
1194
1266
|
|
1195
1267
|
# This call is needed on DB2 z/OS v8 for the creation of tables
|
@@ -1197,7 +1269,12 @@ module ActiveRecord
|
|
1197
1269
|
# DB2 creates LOB table spaces, auxiliary tables, and indexes on auxiliary
|
1198
1270
|
# tables for LOB columns.
|
1199
1271
|
def setup_for_lob_table()
|
1200
|
-
|
1272
|
+
execute "SET CURRENT RULES = 'STD'"
|
1273
|
+
end
|
1274
|
+
|
1275
|
+
def change_column_default(table_name, column_name, default)
|
1276
|
+
raise NotImplementedError,
|
1277
|
+
"DB2 for zOS data server version 8 does not support changing the column default"
|
1201
1278
|
end
|
1202
1279
|
end # class IBM_DB2_ZOS_8
|
1203
1280
|
|
@@ -185,10 +185,10 @@ CREATE TABLE binaries (
|
|
185
185
|
);
|
186
186
|
CREATE UNIQUE INDEX binaries_id_idx ON
|
187
187
|
binaries (id);
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
188
|
+
CREATE LOB TABLESPACE datalob;
|
189
|
+
CREATE AUXILIARY TABLE data_aux IN datalob
|
190
|
+
STORES binaries COLUMN data;
|
191
|
+
CREATE UNIQUE INDEX lob_data_idx ON data_aux;
|
192
192
|
|
193
193
|
CREATE TABLE computers (
|
194
194
|
id INT GENERATED BY DEFAULT AS IDENTITY (START WITH 100),
|
data/test/migration_test.rb
CHANGED
@@ -140,6 +140,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
140
140
|
clasz.connection.create_table clasz.table_name do |t|
|
141
141
|
t.column "test_varchar", :string, :limit => 10
|
142
142
|
t.column "test_integer", :integer, :limit => 5
|
143
|
+
t.column "test_boolean", :boolean, :limit => 5
|
143
144
|
t.column "test_double", :double, :limit => 10
|
144
145
|
t.column "test_date", :date, :limit => 10
|
145
146
|
t.column "test_time", :time, :limit => 10
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ibm_db
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.6.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.6.5
|
7
|
+
date: 2007-05-14 00:00:00 -04:00
|
8
8
|
summary: "Rails Driver and Adapter for IBM Data Servers: {LUW, zOS, i5, IDS}"
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,9 +31,10 @@ authors:
|
|
31
31
|
files:
|
32
32
|
- CHANGES
|
33
33
|
- ext
|
34
|
-
- ext/ruby_ibm_db.h
|
35
34
|
- ext/extconf.rb
|
36
35
|
- ext/ibm_db.c
|
36
|
+
- ext/ruby_ibm_db.h
|
37
|
+
- init.rb
|
37
38
|
- lib
|
38
39
|
- lib/active_record
|
39
40
|
- lib/active_record/connection_adapters
|
@@ -46,12 +47,15 @@ files:
|
|
46
47
|
- LICENSE
|
47
48
|
- MANIFEST
|
48
49
|
- README
|
49
|
-
- init.rb
|
50
50
|
- test
|
51
|
+
- test/adapter_test.rb
|
52
|
+
- test/associations
|
53
|
+
- test/associations/eager_test.rb
|
54
|
+
- test/associations_test.rb
|
55
|
+
- test/base_test.rb
|
51
56
|
- test/connections
|
52
57
|
- test/connections/native_ibm_db
|
53
58
|
- test/connections/native_ibm_db/connection.rb
|
54
|
-
- test/base_test.rb
|
55
59
|
- test/fixtures
|
56
60
|
- test/fixtures/db_definitions
|
57
61
|
- test/fixtures/db_definitions/i5
|
@@ -70,13 +74,9 @@ files:
|
|
70
74
|
- test/fixtures/db_definitions/zOS/ibm_db.sql
|
71
75
|
- test/fixtures/db_definitions/zOS/ibm_db2.drop.sql
|
72
76
|
- test/fixtures/db_definitions/zOS/ibm_db2.sql
|
73
|
-
- test/migration_test.rb
|
74
77
|
- test/ibm_db_test.rb
|
75
78
|
- test/locking_test.rb
|
76
|
-
- test/
|
77
|
-
- test/associations/eager_test.rb
|
78
|
-
- test/adapter_test.rb
|
79
|
-
- test/associations_test.rb
|
79
|
+
- test/migration_test.rb
|
80
80
|
test_files:
|
81
81
|
- test/ibm_db_test.rb
|
82
82
|
rdoc_options: []
|