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.
@@ -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