ibm_db 0.4.0 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +19 -9
- data/README +29 -20
- data/ext/extconf.rb +55 -50
- data/ext/ibm_db.c +6267 -6259
- data/ext/ruby_ibm_db.h +164 -164
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +167 -142
- data/lib/active_record/vendor/db2-i5-zOS.yaml +68 -68
- data/lib/linux32/ibm_db.so +0 -0
- data/test/adapter_test.rb +128 -0
- data/test/base_test.rb +1579 -0
- data/test/{activerecord → connections}/native_ibm_db/connection.rb +6 -7
- data/test/fixtures/db_definitions/i5/ibm_db.drop.sql +32 -0
- data/test/fixtures/db_definitions/i5/ibm_db.sql +232 -0
- data/test/fixtures/db_definitions/i5/ibm_db2.drop.sql +2 -0
- data/test/fixtures/db_definitions/i5/ibm_db2.sql +5 -0
- data/test/fixtures/db_definitions/luw/ibm_db.drop.sql +31 -0
- data/test/fixtures/db_definitions/luw/ibm_db.sql +226 -0
- data/test/fixtures/db_definitions/luw/ibm_db2.drop.sql +2 -0
- data/test/fixtures/db_definitions/luw/ibm_db2.sql +5 -0
- data/test/fixtures/db_definitions/zOS/ibm_db.drop.sql +32 -0
- data/test/fixtures/db_definitions/zOS/ibm_db.sql +284 -0
- data/test/fixtures/db_definitions/zOS/ibm_db2.drop.sql +2 -0
- data/test/fixtures/db_definitions/zOS/ibm_db2.sql +7 -0
- data/test/locking_test.rb +190 -0
- data/test/migration_test.rb +779 -0
- metadata +39 -17
@@ -1,6 +1,6 @@
|
|
1
1
|
add : ADD
|
2
2
|
after : AFTER
|
3
|
-
alias : ALIAS
|
3
|
+
alias : ALIAS
|
4
4
|
all : ALL
|
5
5
|
allocate : ALLOCATE
|
6
6
|
allow : ALLOW
|
@@ -12,19 +12,19 @@
|
|
12
12
|
associate : ASSOCIATE
|
13
13
|
asutime : ASUTIME
|
14
14
|
audit : AUDIT
|
15
|
-
authorization : AUTHORIZATION
|
15
|
+
authorization : AUTHORIZATION
|
16
16
|
aux : AUX
|
17
17
|
auxiliary : AUXILIARY
|
18
18
|
before : BEFORE
|
19
19
|
begin : BEGIN
|
20
20
|
between : BETWEEN
|
21
|
-
binary : BINARY
|
21
|
+
binary : BINARY
|
22
22
|
bufferpool : BUFFERPOOL
|
23
23
|
by : BY
|
24
|
-
cache : CACHE
|
24
|
+
cache : CACHE
|
25
25
|
call : CALL
|
26
|
-
called : CALLED
|
27
|
-
cardinality : CARDINALITY
|
26
|
+
called : CALLED
|
27
|
+
cardinality : CARDINALITY
|
28
28
|
capture : CAPTURE
|
29
29
|
cascaded : CASCADED
|
30
30
|
case : CASE
|
@@ -47,31 +47,31 @@
|
|
47
47
|
constraint : CONSTRAINT
|
48
48
|
contains : CONTAINS
|
49
49
|
continue : CONTINUE
|
50
|
-
count : COUNT
|
51
|
-
count_big : COUNT_BIG
|
50
|
+
count : COUNT
|
51
|
+
count_big : COUNT_BIG
|
52
52
|
create : CREATE
|
53
|
-
cross : CROSS
|
53
|
+
cross : CROSS
|
54
54
|
current : CURRENT
|
55
55
|
current_date : CURRENT_DATE
|
56
56
|
current_lc_ctype : CURRENT_LC_CTYPE
|
57
57
|
current_path : CURRENT_PATH
|
58
58
|
current_time : CURRENT_TIME
|
59
59
|
current_timestamp : CURRENT_TIMESTAMP
|
60
|
-
current_timezone : CURRENT_TIMEZONE
|
61
|
-
current_user : CURRENT_USER
|
60
|
+
current_timezone : CURRENT_TIMEZONE
|
61
|
+
current_user : CURRENT_USER
|
62
62
|
cursor : CURSOR
|
63
|
-
cycle : CYCLE
|
63
|
+
cycle : CYCLE
|
64
64
|
data : DATA
|
65
65
|
database : DATABASE
|
66
66
|
day : DAY
|
67
67
|
days : DAYS
|
68
68
|
dbinfo : DBINFO
|
69
|
-
db2genrl : DB2GENRL
|
70
|
-
db2sql : DB2SQL
|
69
|
+
db2genrl : DB2GENRL
|
70
|
+
db2sql : DB2SQL
|
71
71
|
declare : DECLARE
|
72
72
|
default : DEFAULT
|
73
|
-
defaults : DEFAULTS
|
74
|
-
definition : DEFINITION
|
73
|
+
defaults : DEFAULTS
|
74
|
+
definition : DEFINITION
|
75
75
|
delete : DELETE
|
76
76
|
descriptor : DESCRIPTOR
|
77
77
|
deterministic : DETERMINISTIC
|
@@ -83,7 +83,7 @@
|
|
83
83
|
drop : DROP
|
84
84
|
dssize : DSSIZE
|
85
85
|
dynamic : DYNAMIC
|
86
|
-
each : EACH
|
86
|
+
each : EACH
|
87
87
|
editproc : EDITPROC
|
88
88
|
else : ELSE
|
89
89
|
elseif : ELSEIF
|
@@ -95,7 +95,7 @@
|
|
95
95
|
erase : ERASE
|
96
96
|
escape : ESCAPE
|
97
97
|
except : EXCEPT
|
98
|
-
excluding : EXCLUDING
|
98
|
+
excluding : EXCLUDING
|
99
99
|
exception : EXCEPTION
|
100
100
|
execute : EXECUTE
|
101
101
|
exists : EXISTS
|
@@ -105,50 +105,50 @@
|
|
105
105
|
fenced : FENCED
|
106
106
|
fetch : FETCH
|
107
107
|
fieldproc : FIELDPROC
|
108
|
-
file : FILE
|
108
|
+
file : FILE
|
109
109
|
final : FINAL
|
110
110
|
for : FOR
|
111
|
-
foreign : FOREIGN
|
111
|
+
foreign : FOREIGN
|
112
112
|
free : FREE
|
113
113
|
from : FROM
|
114
114
|
full : FULL
|
115
115
|
function : FUNCTION
|
116
|
-
general : GENERAL
|
116
|
+
general : GENERAL
|
117
117
|
generated : GENERATED
|
118
118
|
get : GET
|
119
119
|
global : GLOBAL
|
120
120
|
go : GO
|
121
121
|
goto : GOTO
|
122
122
|
grant : GRANT
|
123
|
-
graphic : GRAPHIC
|
123
|
+
graphic : GRAPHIC
|
124
124
|
group : GROUP
|
125
125
|
handler : HANDLER
|
126
126
|
having : HAVING
|
127
127
|
hold : HOLD
|
128
128
|
hour : HOUR
|
129
129
|
hours : HOURS
|
130
|
-
identity : IDENTITY
|
130
|
+
identity : IDENTITY
|
131
131
|
if : IF
|
132
132
|
immediate : IMMEDIATE
|
133
133
|
in : IN
|
134
|
-
including : INCLUDING
|
134
|
+
including : INCLUDING
|
135
135
|
inclusive : INCLUSIVE
|
136
|
-
increment : INCREMENT
|
136
|
+
increment : INCREMENT
|
137
137
|
index : INDEX
|
138
|
-
indicator : INDICATOR
|
138
|
+
indicator : INDICATOR
|
139
139
|
inherit : INHERIT
|
140
140
|
inner : INNER
|
141
141
|
inout : INOUT
|
142
142
|
insensitive : INSENSITIVE
|
143
143
|
insert : INSERT
|
144
|
-
integrity : INTEGRITY
|
144
|
+
integrity : INTEGRITY
|
145
145
|
into : INTO
|
146
146
|
is : IS
|
147
147
|
isobid : ISOBID
|
148
|
-
isolation : ISOLATION
|
148
|
+
isolation : ISOLATION
|
149
149
|
iterate : ITERATE
|
150
150
|
jar : JAR
|
151
|
-
java : JAVA
|
151
|
+
java : JAVA
|
152
152
|
join : JOIN
|
153
153
|
key : KEY
|
154
154
|
label : LABEL
|
@@ -157,7 +157,7 @@
|
|
157
157
|
leave : LEAVE
|
158
158
|
left : LEFT
|
159
159
|
like : LIKE
|
160
|
-
linktype : LINKTYPE
|
160
|
+
linktype : LINKTYPE
|
161
161
|
local : LOCAL
|
162
162
|
locale : LOCALE
|
163
163
|
locator : LOCATOR
|
@@ -169,46 +169,46 @@
|
|
169
169
|
loop : LOOP
|
170
170
|
maintained : MAINTAINED
|
171
171
|
materialized : MATERIALIZED
|
172
|
-
maxvalue : MAXVALUE
|
172
|
+
maxvalue : MAXVALUE
|
173
173
|
microsecond : MICROSECOND
|
174
174
|
microseconds : MICROSECONDS
|
175
175
|
minute : MINUTE
|
176
176
|
minutes : MINUTES
|
177
|
-
minvalue : MINVALUE
|
178
|
-
mode : MODE
|
177
|
+
minvalue : MINVALUE
|
178
|
+
mode : MODE
|
179
179
|
modifies : MODIFIES
|
180
180
|
month : MONTH
|
181
181
|
months : MONTHS
|
182
|
-
new : NEW
|
183
|
-
new_table : NEW_TABLE
|
182
|
+
new : NEW
|
183
|
+
new_table : NEW_TABLE
|
184
184
|
nextval : NEXTVAL
|
185
185
|
no : NO
|
186
|
-
nocache : NOCACHE
|
187
|
-
nocycle : NOCYCLE
|
188
|
-
nodename : NODENAME
|
189
|
-
nodenumber : NODENUMBER
|
190
|
-
nomaxvalue : NOMAXVALUE
|
191
|
-
nominvalue : NOMINVALUE
|
186
|
+
nocache : NOCACHE
|
187
|
+
nocycle : NOCYCLE
|
188
|
+
nodename : NODENAME
|
189
|
+
nodenumber : NODENUMBER
|
190
|
+
nomaxvalue : NOMAXVALUE
|
191
|
+
nominvalue : NOMINVALUE
|
192
192
|
none : NONE
|
193
|
-
noorder : NOORDER
|
193
|
+
noorder : NOORDER
|
194
194
|
not : NOT
|
195
195
|
null : NULL
|
196
196
|
nulls : NULLS
|
197
197
|
numparts : NUMPARTS
|
198
198
|
obid : OBID
|
199
199
|
of : OF
|
200
|
-
old : OLD
|
201
|
-
old_table : OLD_TABLE
|
200
|
+
old : OLD
|
201
|
+
old_table : OLD_TABLE
|
202
202
|
on : ON
|
203
203
|
open : OPEN
|
204
204
|
optimization : OPTIMIZATION
|
205
205
|
optimize : OPTIMIZE
|
206
|
-
option : OPTION
|
206
|
+
option : OPTION
|
207
207
|
or : OR
|
208
208
|
order : ORDER
|
209
209
|
out : OUT
|
210
210
|
outer : OUTER
|
211
|
-
overriding : OVERRIDING
|
211
|
+
overriding : OVERRIDING
|
212
212
|
package : PACKAGE
|
213
213
|
parameter : PARAMETER
|
214
214
|
part : PART
|
@@ -219,11 +219,11 @@
|
|
219
219
|
path : PATH
|
220
220
|
piecesize : PIECESIZE
|
221
221
|
plan : PLAN
|
222
|
-
position : POSITION
|
222
|
+
position : POSITION
|
223
223
|
precision : PRECISION
|
224
224
|
prepare : PREPARE
|
225
225
|
prevval : PREVVAL
|
226
|
-
primary : PRIMARY
|
226
|
+
primary : PRIMARY
|
227
227
|
priqty : PRIQTY
|
228
228
|
privileges : PRIVILEGES
|
229
229
|
procedure : PROCEDURE
|
@@ -231,19 +231,19 @@
|
|
231
231
|
psid : PSID
|
232
232
|
query : QUERY
|
233
233
|
queryno : QUERYNO
|
234
|
-
read : READ
|
234
|
+
read : READ
|
235
235
|
reads : READS
|
236
|
-
recovery : RECOVERY
|
236
|
+
recovery : RECOVERY
|
237
237
|
references : REFERENCES
|
238
|
-
referencing : REFERENCING
|
238
|
+
referencing : REFERENCING
|
239
239
|
refresh : REFRESH
|
240
240
|
resignal : RESIGNAL
|
241
241
|
release : RELEASE
|
242
242
|
rename : RENAME
|
243
243
|
repeat : REPEAT
|
244
|
-
reset : RESET
|
245
|
-
resignal : RESIGNAL
|
246
|
-
restart : RESTART
|
244
|
+
reset : RESET
|
245
|
+
resignal : RESIGNAL
|
246
|
+
restart : RESTART
|
247
247
|
restrict : RESTRICT
|
248
248
|
result : RESULT
|
249
249
|
result_set_locator : RESULT_SET_LOCATOR
|
@@ -252,11 +252,11 @@
|
|
252
252
|
revoke : REVOKE
|
253
253
|
right : RIGHT
|
254
254
|
rollback : ROLLBACK
|
255
|
-
routine : ROUTINE
|
256
|
-
row : ROW
|
257
|
-
rows : ROWS
|
255
|
+
routine : ROUTINE
|
256
|
+
row : ROW
|
257
|
+
rows : ROWS
|
258
258
|
rowset : ROWSET
|
259
|
-
rrn : RRN
|
259
|
+
rrn : RRN
|
260
260
|
run : RUN
|
261
261
|
savepoint : SAVEPOINT
|
262
262
|
schema : SCHEMA
|
@@ -274,16 +274,16 @@
|
|
274
274
|
some : SOME
|
275
275
|
source : SOURCE
|
276
276
|
specific : SPECIFIC
|
277
|
-
sql : SQL
|
278
|
-
sqlid : SQLID
|
277
|
+
sql : SQL
|
278
|
+
sqlid : SQLID
|
279
279
|
standard : STANDARD
|
280
|
-
start : START
|
280
|
+
start : START
|
281
281
|
static : STATIC
|
282
282
|
stay : STAY
|
283
283
|
stogroup : STOGROUP
|
284
284
|
stores : STORES
|
285
285
|
style : STYLE
|
286
|
-
substring : SUBSTRING
|
286
|
+
substring : SUBSTRING
|
287
287
|
summary : SUMMARY
|
288
288
|
synonym : SYNONYM
|
289
289
|
sysfun : SYSFUN
|
@@ -294,18 +294,18 @@
|
|
294
294
|
tablespace : TABLESPACE
|
295
295
|
then : THEN
|
296
296
|
to : TO
|
297
|
-
transaction : TRANSACTION
|
297
|
+
transaction : TRANSACTION
|
298
298
|
trigger : TRIGGER
|
299
|
-
trim : TRIM
|
300
|
-
type : TYPE
|
299
|
+
trim : TRIM
|
300
|
+
type : TYPE
|
301
301
|
undo : UNDO
|
302
302
|
union : UNION
|
303
303
|
unique : UNIQUE
|
304
304
|
until : UNTIL
|
305
305
|
update : UPDATE
|
306
306
|
user : USER
|
307
|
-
usage : USAGE
|
308
|
-
user : USER
|
307
|
+
usage : USAGE
|
308
|
+
user : USER
|
309
309
|
using : USING
|
310
310
|
validproc : VALIDPROC
|
311
311
|
value : VALUE
|
@@ -322,7 +322,7 @@
|
|
322
322
|
while : WHILE
|
323
323
|
with : WITH
|
324
324
|
wlm : WLM
|
325
|
-
write : WRITE
|
325
|
+
write : WRITE
|
326
326
|
xmlelement : XMLELEMENT
|
327
327
|
year : YEAR
|
328
328
|
years : YEARS
|
data/lib/linux32/ibm_db.so
CHANGED
Binary file
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'abstract_unit'
|
2
|
+
|
3
|
+
class AdapterTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@connection = ActiveRecord::Base.connection
|
6
|
+
end
|
7
|
+
|
8
|
+
if current_adapter?(:IBM_DBAdapter)
|
9
|
+
def test_a_connection_attributes
|
10
|
+
if @connection.respond_to?(:schema)
|
11
|
+
previous_schema = ActiveRecord::Base.connection.schema
|
12
|
+
ActiveRecord::Base.connection.schema = 'SYSCAT'
|
13
|
+
assert_equal 'SYSCAT', ActiveRecord::Base.connection.schema
|
14
|
+
ActiveRecord::Base.connection.schema = previous_schema
|
15
|
+
else
|
16
|
+
warn "#{@connection.class} does not support client connection attribute schema_name"
|
17
|
+
end
|
18
|
+
|
19
|
+
if @connection.respond_to?(:app_user)
|
20
|
+
ActiveRecord::Base.connection.app_user = 'new_user'
|
21
|
+
assert_equal 'new_user', ActiveRecord::Base.connection.app_user
|
22
|
+
else
|
23
|
+
warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_USER"
|
24
|
+
end
|
25
|
+
|
26
|
+
if @connection.respond_to?(:account)
|
27
|
+
ActiveRecord::Base.connection.account = 'new_acct'
|
28
|
+
assert_equal 'new_acct', ActiveRecord::Base.connection.account
|
29
|
+
else
|
30
|
+
warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_ACCTSTR"
|
31
|
+
end
|
32
|
+
|
33
|
+
if @connection.respond_to?(:application)
|
34
|
+
ActiveRecord::Base.connection.application = 'new_app'
|
35
|
+
assert_equal 'new_app', ActiveRecord::Base.connection.application
|
36
|
+
else
|
37
|
+
warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_APPLNAME"
|
38
|
+
end
|
39
|
+
|
40
|
+
if @connection.respond_to?(:workstation)
|
41
|
+
ActiveRecord::Base.connection.workstation = 'new_wrkst'
|
42
|
+
assert_equal 'new_wrkst', ActiveRecord::Base.connection.workstation
|
43
|
+
else
|
44
|
+
warn "#{@connection.class} does not support client connection attribute SQL_ATTR_INFO_WRKSTNNAME"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_tables
|
50
|
+
if @connection.respond_to?(:tables)
|
51
|
+
tables = @connection.tables
|
52
|
+
assert tables.include?("accounts")
|
53
|
+
assert tables.include?("authors")
|
54
|
+
assert tables.include?("tasks")
|
55
|
+
assert tables.include?("topics")
|
56
|
+
else
|
57
|
+
warn "#{@connection.class} does not respond to #tables"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_indexes
|
62
|
+
idx_name = "accounts_idx"
|
63
|
+
|
64
|
+
if @connection.respond_to?(:indexes)
|
65
|
+
indexes = @connection.indexes("accounts")
|
66
|
+
assert indexes.empty?
|
67
|
+
|
68
|
+
@connection.add_index :accounts, :firm_id, :name => idx_name
|
69
|
+
indexes = @connection.indexes("accounts")
|
70
|
+
assert_equal "accounts", indexes.first.table
|
71
|
+
# OpenBase does not have the concept of a named index
|
72
|
+
# Indexes are merely properties of columns.
|
73
|
+
assert_equal idx_name, indexes.first.name unless current_adapter?(:OpenBaseAdapter)
|
74
|
+
assert !indexes.first.unique
|
75
|
+
assert_equal ["firm_id"], indexes.first.columns
|
76
|
+
else
|
77
|
+
warn "#{@connection.class} does not respond to #indexes"
|
78
|
+
end
|
79
|
+
|
80
|
+
ensure
|
81
|
+
@connection.remove_index(:accounts, :name => idx_name) rescue nil
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_current_database
|
85
|
+
if @connection.respond_to?(:current_database)
|
86
|
+
assert_equal ENV['ARUNIT_DB_NAME'] || "activerecord_unittest", @connection.current_database
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_table_alias
|
91
|
+
def @connection.test_table_alias_length() 10; end
|
92
|
+
class << @connection
|
93
|
+
alias_method :old_table_alias_length, :table_alias_length
|
94
|
+
alias_method :table_alias_length, :test_table_alias_length
|
95
|
+
end
|
96
|
+
|
97
|
+
assert_equal 'posts', @connection.table_alias_for('posts')
|
98
|
+
assert_equal 'posts_comm', @connection.table_alias_for('posts_comments')
|
99
|
+
assert_equal 'dbo_posts', @connection.table_alias_for('dbo.posts')
|
100
|
+
|
101
|
+
class << @connection
|
102
|
+
alias_method :table_alias_length, :old_table_alias_length
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# test resetting sequences in odd tables in postgreSQL
|
107
|
+
if ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!)
|
108
|
+
require 'fixtures/movie'
|
109
|
+
require 'fixtures/subscriber'
|
110
|
+
|
111
|
+
def test_reset_empty_table_with_custom_pk
|
112
|
+
Movie.delete_all
|
113
|
+
Movie.connection.reset_pk_sequence! 'movies'
|
114
|
+
assert_equal 1, Movie.create(:name => 'fight club').id
|
115
|
+
end
|
116
|
+
|
117
|
+
if ActiveRecord::Base.connection.adapter_name != "FrontBase"
|
118
|
+
def test_reset_table_with_non_integer_pk
|
119
|
+
Subscriber.delete_all
|
120
|
+
Subscriber.connection.reset_pk_sequence! 'subscribers'
|
121
|
+
sub = Subscriber.new(:name => 'robert drake')
|
122
|
+
sub.id = 'bob drake'
|
123
|
+
assert_nothing_raised { sub.save! }
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|