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.
@@ -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
- driver_class = Jdbc.const_get(driver_class_const.to_sym)
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 = unmarshal_result(stmt.getGeneratedKeys)
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