ActiveRecord-JDBC 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +45 -9
- data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +9 -1132
- data/lib/jdbc_adapter/jdbc_db2.rb +83 -0
- data/lib/jdbc_adapter/jdbc_derby.rb +113 -0
- data/lib/jdbc_adapter/jdbc_firebird.rb +103 -0
- data/lib/jdbc_adapter/jdbc_hsqldb.rb +104 -0
- data/lib/jdbc_adapter/jdbc_mimer.rb +122 -0
- data/lib/jdbc_adapter/jdbc_mssql.rb +208 -0
- data/lib/jdbc_adapter/jdbc_mysql.rb +119 -0
- data/lib/jdbc_adapter/jdbc_oracle.rb +237 -0
- data/lib/jdbc_adapter/jdbc_postgre.rb +173 -0
- data/test/db/hsqldb.rb +14 -0
- data/test/db/logger.rb +3 -0
- data/test/db/mysql.rb +20 -0
- data/test/hsqldb_simple_test.rb +9 -0
- data/test/manualTestDatabase.rb +5 -5
- data/test/minirunit/testHsqldb.rb +8 -6
- data/test/minirunit/testMysql.rb +1 -1
- data/test/models/entry.rb +22 -0
- data/test/mysql_simple_test.rb +15 -0
- data/test/simple.rb +65 -0
- metadata +21 -2
@@ -10,7 +10,7 @@ module ActiveRecord
|
|
10
10
|
alias :attributes_with_quotes_pre_oracle :attributes_with_quotes
|
11
11
|
def attributes_with_quotes(include_primary_key = true) #:nodoc:
|
12
12
|
aq = attributes_with_quotes_pre_oracle(include_primary_key)
|
13
|
-
if connection.class == ConnectionAdapters::JdbcAdapter && connection.is_a?(JdbcSpec::Oracle)
|
13
|
+
if connection.class == ConnectionAdapters::JdbcAdapter && (connection.is_a?(JdbcSpec::Oracle) || connection.is_a?(JdbcSpec::Mimer))
|
14
14
|
aq[self.class.primary_key] = "?" if include_primary_key && aq[self.class.primary_key].nil?
|
15
15
|
end
|
16
16
|
aq
|
@@ -18,6 +18,12 @@ module ActiveRecord
|
|
18
18
|
end
|
19
19
|
|
20
20
|
module ConnectionAdapters
|
21
|
+
module Java
|
22
|
+
include_class 'java.lang.Class'
|
23
|
+
include_class 'java.net.URL'
|
24
|
+
include_class 'java.net.URLClassLoader'
|
25
|
+
end
|
26
|
+
|
21
27
|
module Jdbc
|
22
28
|
require 'java'
|
23
29
|
include_class 'java.sql.DriverManager'
|
@@ -41,16 +47,20 @@ module ActiveRecord
|
|
41
47
|
AR_TO_JDBC_TYPES = {
|
42
48
|
:string => [ lambda {|r| Jdbc::Types::VARCHAR == r['data_type']},
|
43
49
|
lambda {|r| r['type_name'] =~ /^varchar/i},
|
44
|
-
lambda {|r| r['type_name'] =~ /^varchar$/i}
|
50
|
+
lambda {|r| r['type_name'] =~ /^varchar$/i},
|
51
|
+
lambda {|r| r['type_name'] =~ /varying/i}],
|
45
52
|
:text => [ lambda {|r| [Jdbc::Types::LONGVARCHAR, Jdbc::Types::CLOB].include?(r['data_type'])},
|
46
|
-
lambda {|r| r['type_name'] =~ /^(text|clob)/i}
|
53
|
+
lambda {|r| r['type_name'] =~ /^(text|clob)/i},
|
54
|
+
lambda {|r| r['type_name'] =~ /^character large object$/i},
|
55
|
+
lambda {|r| r['sql_data_type'] == 2005}],
|
47
56
|
:integer => [ lambda {|r| Jdbc::Types::INTEGER == r['data_type']},
|
48
57
|
lambda {|r| r['type_name'] =~ /^integer$/i},
|
49
58
|
lambda {|r| r['type_name'] =~ /^int4$/i},
|
50
59
|
lambda {|r| r['type_name'] =~ /^int$/i}],
|
51
60
|
:float => [ lambda {|r| [Jdbc::Types::FLOAT,Jdbc::Types::DOUBLE].include?(r['data_type'])},
|
52
61
|
lambda {|r| r['type_name'] =~ /^float/i},
|
53
|
-
lambda {|r| r['type_name'] =~ /^double$/i}
|
62
|
+
lambda {|r| r['type_name'] =~ /^double$/i},
|
63
|
+
lambda {|r| r['precision'] == 15}],
|
54
64
|
:datetime => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type']},
|
55
65
|
lambda {|r| r['type_name'] =~ /^datetime/i},
|
56
66
|
lambda {|r| r['type_name'] =~ /^timestamp$/i}],
|
@@ -65,6 +75,7 @@ module ActiveRecord
|
|
65
75
|
:binary => [ lambda {|r| [Jdbc::Types::LONGVARBINARY,Jdbc::Types::BINARY,Jdbc::Types::BLOB].include?(r['data_type'])},
|
66
76
|
lambda {|r| r['type_name'] =~ /^blob/i},
|
67
77
|
lambda {|r| r['type_name'] =~ /sub_type 0$/i}, # For FireBird
|
78
|
+
lambda {|r| r['type_name'] =~ /^varbinary$/i}, # We want this sucker for Mimer
|
68
79
|
lambda {|r| r['type_name'] =~ /^binary$/i}, ],
|
69
80
|
:boolean => [ lambda {|r| [Jdbc::Types::TINYINT].include?(r['data_type'])},
|
70
81
|
lambda {|r| r['type_name'] =~ /^bool/i},
|
@@ -95,7 +106,7 @@ module ActiveRecord
|
|
95
106
|
return new_types.first if new_types.length == 1
|
96
107
|
types = new_types if new_types.length > 0
|
97
108
|
end
|
98
|
-
raise "unable to choose type from: #{types.collect{|t| t['type_name']}.inspect} for #{ar_type}"
|
109
|
+
raise "unable to choose type from: #{types.collect{|t| [t['type_name'],t]}.inspect} for #{ar_type}"
|
99
110
|
end
|
100
111
|
end
|
101
112
|
|
@@ -106,8 +117,7 @@ module ActiveRecord
|
|
106
117
|
Jdbc.module_eval do
|
107
118
|
include_class(driver) {|p,c| driver_class_const }
|
108
119
|
end
|
109
|
-
|
110
|
-
Jdbc::DriverManager.registerDriver(driver_class.new)
|
120
|
+
Jdbc::DriverManager.registerDriver(Jdbc.const_get(driver_class_const).new)
|
111
121
|
end
|
112
122
|
end
|
113
123
|
end
|
@@ -193,7 +203,7 @@ module ActiveRecord
|
|
193
203
|
def execute_insert(sql, pk)
|
194
204
|
stmt = @connection.createStatement
|
195
205
|
stmt.executeUpdate(sql,Jdbc::Statement::RETURN_GENERATED_KEYS)
|
196
|
-
row =
|
206
|
+
row = unmarshal_id_result(stmt.getGeneratedKeys)
|
197
207
|
row.first && row.first.values.first
|
198
208
|
ensure
|
199
209
|
stmt.close
|
@@ -256,6 +266,30 @@ module ActiveRecord
|
|
256
266
|
results
|
257
267
|
end
|
258
268
|
|
269
|
+
def unmarshal_id_result(resultset)
|
270
|
+
metadata = resultset.getMetaData
|
271
|
+
column_count = metadata.getColumnCount
|
272
|
+
column_types = ['']
|
273
|
+
column_scale = ['']
|
274
|
+
|
275
|
+
1.upto(column_count) do |i|
|
276
|
+
column_types << metadata.getColumnType(i)
|
277
|
+
column_scale << metadata.getScale(i)
|
278
|
+
end
|
279
|
+
|
280
|
+
results = []
|
281
|
+
|
282
|
+
while resultset.next
|
283
|
+
row = {}
|
284
|
+
1.upto(column_count) do |i|
|
285
|
+
row[i] = row[i.to_s] = convert_jdbc_type_to_ruby(i, column_types[i], column_scale[i], resultset)
|
286
|
+
end
|
287
|
+
results << row
|
288
|
+
end
|
289
|
+
|
290
|
+
results
|
291
|
+
end
|
292
|
+
|
259
293
|
def to_ruby_time(java_date)
|
260
294
|
if java_date
|
261
295
|
tm = java_date.getTime
|
@@ -283,7 +317,7 @@ module ActiveRecord
|
|
283
317
|
to_ruby_time(resultset.getTime(row))
|
284
318
|
when Jdbc::Types::DATE
|
285
319
|
to_ruby_time(resultset.getDate(row))
|
286
|
-
when Jdbc::Types::LONGVARBINARY, Jdbc::Types::BLOB, Jdbc::Types::BINARY
|
320
|
+
when Jdbc::Types::LONGVARBINARY, Jdbc::Types::BLOB, Jdbc::Types::BINARY, Jdbc::Types::VARBINARY
|
287
321
|
resultset.getString(row)
|
288
322
|
else
|
289
323
|
types = Jdbc::Types.constants
|
@@ -300,6 +334,7 @@ module ActiveRecord
|
|
300
334
|
@config = config
|
301
335
|
case config[:driver].to_s
|
302
336
|
when /oracle/i: self.extend(JdbcSpec::Oracle)
|
337
|
+
when /mimer/i: self.extend(JdbcSpec::Mimer)
|
303
338
|
when /postgre/i: self.extend(JdbcSpec::PostgreSQL)
|
304
339
|
when /mysql/i: self.extend(JdbcSpec::MySQL)
|
305
340
|
when /sqlserver|tds/i: self.extend(JdbcSpec::MsSQL)
|
@@ -444,6 +479,7 @@ module ActiveRecord
|
|
444
479
|
rescue Exception => e
|
445
480
|
# Log message and raise exception.
|
446
481
|
message = "#{e.class.name}: #{e.message}: #{sql}"
|
482
|
+
|
447
483
|
log_info(message, name, 0)
|
448
484
|
raise ActiveRecord::StatementInvalid, message
|
449
485
|
end
|