ibm_db 0.6.0 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +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: []
|