ActiveRecord-JDBC 0.2.1 → 0.2.2
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/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
|