ActiveRecord-JDBC 0.2.4 → 0.3

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/History.txt CHANGED
@@ -1,3 +1,9 @@
1
+ == 0.3
2
+
3
+ * Release coincides with JRuby 1.0.0RC1 release
4
+ * Improvements for Derby, Postgres, and Oracle, all of which are running
5
+ > 95% of AR tests
6
+
1
7
  == 0.2.4
2
8
 
3
9
  * Release coincides with JRuby 0.9.9 release
data/Rakefile CHANGED
@@ -84,7 +84,7 @@ begin
84
84
  Rake::Task['manifest'].invoke # Always regen manifest, so Hoe has up-to-date list of files
85
85
 
86
86
  require 'hoe'
87
- Hoe.new("ActiveRecord-JDBC", "0.2.4") do |p|
87
+ Hoe.new("ActiveRecord-JDBC", "0.3") do |p|
88
88
  p.rubyforge_name = "jruby-extras"
89
89
  p.url = "http://jruby-extras.rubyforge.org/ActiveRecord-JDBC"
90
90
  p.author = "Nick Sieger, Ola Bini and JRuby contributors"
@@ -88,6 +88,7 @@ module ActiveRecord
88
88
  lambda {|r| r['precision'] == '38'},
89
89
  lambda {|r| r['data_type'] == '2'}],
90
90
  :float => [ lambda {|r| [Jdbc::Types::FLOAT,Jdbc::Types::DOUBLE, Jdbc::Types::REAL].include?(r['data_type'].to_i)},
91
+ lambda {|r| r['data_type'].to_i == Jdbc::Types::REAL}, #Prefer REAL to DOUBLE for Postgresql
91
92
  lambda {|r| r['type_name'] =~ /^float/i},
92
93
  lambda {|r| r['type_name'] =~ /^double$/i},
93
94
  lambda {|r| r['type_name'] =~ /^real$/i},
@@ -110,6 +111,7 @@ module ActiveRecord
110
111
  lambda {|r| r['type_name'] =~ /^binary$/i}, ],
111
112
  :boolean => [ lambda {|r| [Jdbc::Types::TINYINT].include?(r['data_type'].to_i)},
112
113
  lambda {|r| r['type_name'] =~ /^bool/i},
114
+ lambda {|r| r['data_type'] == '-7'},
113
115
  lambda {|r| r['type_name'] =~ /^tinyint$/i},
114
116
  lambda {|r| r['type_name'] =~ /^decimal$/i}],
115
117
  }
@@ -262,6 +264,8 @@ module ActiveRecord
262
264
  else
263
265
  raise
264
266
  end
267
+ ensure
268
+ metadata.close rescue nil
265
269
  end
266
270
 
267
271
  private
@@ -397,6 +401,13 @@ module ActiveRecord
397
401
  end
398
402
 
399
403
  def execute(sql, name = nil)
404
+ _execute(sql,name)
405
+ end
406
+
407
+ # we need to do it this way, to allow Rails stupid tests to always work
408
+ # even if we define a new execute method. Instead of mixing in a new
409
+ # execute, an _execute should be mixed in.
410
+ def _execute(sql, name = nil)
400
411
  log_no_bench(sql, name) do
401
412
  case sql.strip
402
413
  when /^(select|show)/i:
@@ -408,7 +419,7 @@ module ActiveRecord
408
419
  end
409
420
  end
410
421
  end
411
-
422
+
412
423
  def update(sql, name = nil) #:nodoc:
413
424
  execute(sql, name)
414
425
  end
@@ -34,6 +34,11 @@ module JdbcSpec
34
34
  (value.hour == 0 and value.min == 0 and value.sec == 0) ?
35
35
  Date.new(value.year, value.month, value.day) : value
36
36
  end
37
+
38
+ def simplified_type(field_type)
39
+ return :boolean if field_type =~ /smallint/i
40
+ super
41
+ end
37
42
  end
38
43
 
39
44
  include JdbcSpec::MissingFunctionalityHelper
@@ -41,6 +46,7 @@ module JdbcSpec
41
46
  def modify_types(tp)
42
47
  tp[:primary_key] = "int generated by default as identity NOT NULL PRIMARY KEY"
43
48
  tp[:integer][:limit] = nil
49
+ tp[:boolean] = {:name => "smallint"}
44
50
  tp
45
51
  end
46
52
 
@@ -79,12 +85,21 @@ module JdbcSpec
79
85
  end
80
86
  end
81
87
 
82
- def execute(sql, name = nil)
88
+ def _execute(sql, name = nil)
83
89
  log_no_bench(sql, name) do
84
- if sql =~ /^select/i
85
- @limit ||= -1
90
+ case sql.strip
91
+ when /^(select|show)/i:
86
92
  @offset ||= 0
87
- @connection.execute_query(sql)[@offset..(@offset+@limit)]
93
+ if !@limit || @limit == -1
94
+ range = @offset..-1
95
+ max = 0
96
+ else
97
+ range = @offset...(@offset+@limit)
98
+ max = @offset+@limit+1
99
+ end
100
+ @connection.execute_query(sql,max)[range] || []
101
+ when /^insert/i:
102
+ @connection.execute_insert(sql)
88
103
  else
89
104
  @connection.execute_update(sql)
90
105
  end
@@ -139,8 +154,17 @@ module JdbcSpec
139
154
  end
140
155
  end
141
156
 
157
+ # There seems to be more than one thing wrong with
158
+ # changing defaults for VARCHAR columns right now... DERBY-2371
159
+ # among others
142
160
  def change_column_default(table_name, column_name, default) #:nodoc:
143
- execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DEFAULT #{quote(default)}"
161
+ begin
162
+ execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DEFAULT #{quote(default)}"
163
+ rescue
164
+ alter_table(table_name) do |definition|
165
+ definition[column_name].default = default
166
+ end
167
+ end
144
168
  end
145
169
 
146
170
  # Support for renaming columns:
@@ -149,9 +173,13 @@ module JdbcSpec
149
173
  # This feature is expect to arrive in version 10.3.0.0:
150
174
  # http://wiki.apache.org/db-derby/DerbyTenThreeRelease)
151
175
  #
152
- #def rename_column(table_name, column_name, new_column_name) #:nodoc:
153
- # execute "ALTER TABLE #{table_name} ALTER RENAME COLUMN #{column_name} TO #{new_column_name}"
154
- #end
176
+ def rename_column(table_name, column_name, new_column_name) #:nodoc:
177
+ begin
178
+ execute "ALTER TABLE #{table_name} ALTER RENAME COLUMN #{column_name} TO #{new_column_name}"
179
+ rescue
180
+ alter_table(table_name, :rename => {column_name => new_column_name})
181
+ end
182
+ end
155
183
 
156
184
  def primary_keys(table_name)
157
185
  @connection.primary_keys table_name.to_s.upcase
@@ -195,10 +223,18 @@ module JdbcSpec
195
223
  end
196
224
  end
197
225
 
226
+ def quote_string(s)
227
+ s.gsub(/'/, "''") # ' (for ruby-mode)
228
+ end
229
+
198
230
  # For DDL it appears you can quote "" column names, but in queries (like insert it errors out?)
199
- # def quote_column_name(name) #:nodoc:
200
- # %Q{"#{name}"}
201
- # end
231
+ def quote_column_name(name) #:nodoc:
232
+ if /^references$/i =~ name
233
+ %Q{"#{name.upcase}"}
234
+ else
235
+ name
236
+ end
237
+ end
202
238
 
203
239
  def quoted_true
204
240
  '1'
@@ -42,7 +42,7 @@ module JdbcSpec
42
42
  execute "UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='#{new_name}_seq' WHERE RDB$GENERATOR_NAME='#{name}_seq'" rescue nil
43
43
  end
44
44
 
45
- def drop_table(name) #:nodoc:
45
+ def drop_table(name, options = {}) #:nodoc:
46
46
  super(name)
47
47
  execute "DROP GENERATOR #{name}_seq" rescue nil
48
48
  end
@@ -22,7 +22,7 @@ module JdbcSpec
22
22
  execute "CREATE SEQUENCE #{name}_seq" unless options[:id] == false
23
23
  end
24
24
 
25
- def drop_table(name) #:nodoc:
25
+ def drop_table(name, options = {}) #:nodoc:
26
26
  super(name) rescue nil
27
27
  execute "DROP SEQUENCE #{name}_seq" rescue nil
28
28
  end
@@ -91,9 +91,13 @@ module JdbcSpec
91
91
  end
92
92
 
93
93
  def select_all(sql, name = nil)
94
- @limit ||= -1
95
94
  @offset ||= 0
96
- select(sql, name)[@offset..(@offset+@limit)]
95
+ if !@limit || @limit == -1
96
+ range = @offset..-1
97
+ else
98
+ range = @offset...(@offset+@limit)
99
+ end
100
+ select(sql, name)[range]
97
101
  ensure
98
102
  @limit = @offset = nil
99
103
  end
@@ -105,12 +109,16 @@ module JdbcSpec
105
109
  @limit = @offset = nil
106
110
  end
107
111
 
108
- def execute(sql, name = nil)
112
+ def _execute(sql, name = nil)
109
113
  log_no_bench(sql, name) do
110
114
  if sql =~ /^select/i
111
- @limit ||= -1
112
115
  @offset ||= 0
113
- @connection.execute_query(sql)[@offset..(@offset+@limit)]
116
+ if !@limit || @limit == -1
117
+ range = @offset..-1
118
+ else
119
+ range = @offset...(@offset+@limit)
120
+ end
121
+ @connection.execute_query(sql)[range]
114
122
  else
115
123
  @connection.execute_update(sql)
116
124
  end
@@ -58,7 +58,7 @@ module JdbcSpec
58
58
  execute "RENAME #{name}_seq TO #{new_name}_seq" rescue nil
59
59
  end
60
60
 
61
- def drop_table(name) #:nodoc:
61
+ def drop_table(name, options = {}) #:nodoc:
62
62
  super(name)
63
63
  execute "DROP SEQUENCE #{name}_seq" rescue nil
64
64
  end
@@ -69,21 +69,23 @@ module JdbcSpec
69
69
  elsif id_value # Pre-assigned id
70
70
  log(sql, name) { @connection.execute_insert sql,pk }
71
71
  else # Assume the sql contains a bind-variable for the id
72
- id_value = select_one("select #{sequence_name}.nextval id from dual")['id']
72
+ id_value = select_one("select #{sequence_name}.nextval id from dual")['id'].to_i
73
73
  log(sql, name) {
74
- execute_prepared_insert(sql,id_value)
74
+ @connection.execute_id_insert(sql,id_value)
75
75
  }
76
76
  end
77
77
  id_value
78
78
  end
79
-
80
- def execute_prepared_insert(sql, id)
81
- @stmts ||= {}
82
- @stmts[sql] ||= @connection.ps(sql)
83
- stmt = @stmts[sql]
84
- stmt.setLong(1,id)
85
- stmt.executeUpdate
86
- id
79
+
80
+ def _execute(sql, name = nil)
81
+ log_no_bench(sql, name) do
82
+ case sql.strip
83
+ when /^(select|show)/i:
84
+ @connection.execute_query(sql)
85
+ else
86
+ @connection.execute_update(sql)
87
+ end
88
+ end
87
89
  end
88
90
 
89
91
  def modify_types(tp)
@@ -1,19 +1,11 @@
1
1
  module JdbcSpec
2
2
  module PostgreSQL
3
3
  module Column
4
- def type_cast(value)
5
- return nil if value.nil? || value =~ /^\s*null\s*$/i
6
- case type
7
- when :string then value
8
- when :integer then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
9
- when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
10
- when :float then value.to_f
11
- when :datetime then cast_to_date_or_time(value)
12
- when :timestamp then cast_to_time(value)
13
- when :time then cast_to_time(value)
14
- else value
15
- end
4
+ def simplified_type(field_type)
5
+ return :integer if field_type =~ /^serial/i
6
+ super
16
7
  end
8
+
17
9
  def cast_to_date_or_time(value)
18
10
  return value if value.is_a? Date
19
11
  return nil if value.blank?
@@ -31,6 +23,7 @@ module JdbcSpec
31
23
  (value.hour == 0 and value.min == 0 and value.sec == 0) ?
32
24
  Date.new(value.year, value.month, value.day) : value
33
25
  end
26
+
34
27
  def default_value(value)
35
28
  # Boolean types
36
29
  return "t" if value =~ /true/i
@@ -38,7 +31,7 @@ module JdbcSpec
38
31
 
39
32
  # Char/String/Bytea type values
40
33
  return $1 if value =~ /^'(.*)'::(bpchar|text|character varying|bytea)$/
41
-
34
+
42
35
  # Numeric values
43
36
  return value if value =~ /^-?[0-9]+(\.[0-9]*)?/
44
37
 
@@ -50,7 +43,7 @@ module JdbcSpec
50
43
  return nil
51
44
  end
52
45
  end
53
-
46
+
54
47
  def modify_types(tp)
55
48
  tp[:primary_key] = "serial primary key"
56
49
  tp[:string][:limit] = 255
@@ -119,6 +112,17 @@ module JdbcSpec
119
112
  Integer(select_value("SELECT currval('#{sequence_name}')"))
120
113
  end
121
114
 
115
+ def _execute(sql, name = nil)
116
+ log_no_bench(sql, name) do
117
+ case sql.strip
118
+ when /^(select|show)/i:
119
+ @connection.execute_query(sql)
120
+ else
121
+ @connection.execute_update(sql)
122
+ end
123
+ end
124
+ end
125
+
122
126
  def quote(value, column = nil)
123
127
  if value.kind_of?(String) && column && column.type == :binary
124
128
  "'#{escape_bytea(value)}'"
@@ -169,5 +173,17 @@ module JdbcSpec
169
173
  def remove_index(table_name, options) #:nodoc:
170
174
  execute "DROP INDEX #{index_name(table_name, options)}"
171
175
  end
176
+
177
+ def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
178
+ return super unless type.to_s == 'integer'
179
+
180
+ if limit.nil? || limit == 4
181
+ 'integer'
182
+ elsif limit < 4
183
+ 'smallint'
184
+ else
185
+ 'bigint'
186
+ end
187
+ end
172
188
  end
173
189
  end
Binary file
@@ -1,30 +1,30 @@
1
- require 'java'
2
- require 'models/data_types'
3
- require 'db/derby'
4
- require 'test/unit'
5
-
6
- JInteger = java.lang.Integer
7
-
8
- class TypeConversionTest < Test::Unit::TestCase
9
-
10
- def setup
11
- DbTypeMigration.up
12
- DbType.create(
13
- :sample_timestamp => Time.at(1169964202),
14
- :sample_decimal => JInteger::MAX_VALUE + 1)
15
- end
16
-
17
- def teardown
18
- DbTypeMigration.down
19
- end
20
-
21
- def test_timestamp
22
- types = DbType.find(:first)
23
- assert_equal 'Sun Jan 28 06:03:22 UTC 2007', types.sample_timestamp.getutc.to_s
24
- end
25
-
26
- def test_decimal
27
- types = DbType.find(:first)
28
- assert_equal((JInteger::MAX_VALUE + 1), types.sample_decimal)
29
- end
30
- end
1
+ require 'java'
2
+ require 'models/data_types'
3
+ require 'db/derby'
4
+ require 'test/unit'
5
+
6
+ JInteger = java.lang.Integer
7
+
8
+ class TypeConversionTest < Test::Unit::TestCase
9
+ TEST_TIME = Time.at(1169964202)
10
+ def setup
11
+ DbTypeMigration.up
12
+ DbType.create(
13
+ :sample_timestamp => TEST_TIME,
14
+ :sample_decimal => JInteger::MAX_VALUE + 1)
15
+ end
16
+
17
+ def teardown
18
+ DbTypeMigration.down
19
+ end
20
+
21
+ def test_timestamp
22
+ types = DbType.find(:first)
23
+ assert_equal TEST_TIME, types.sample_timestamp.getutc
24
+ end
25
+
26
+ def test_decimal
27
+ types = DbType.find(:first)
28
+ assert_equal((JInteger::MAX_VALUE + 1), types.sample_decimal)
29
+ end
30
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: ActiveRecord-JDBC
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.4
7
- date: 2007-04-24 00:00:00 -05:00
6
+ version: "0.3"
7
+ date: 2007-05-07 00:00:00 -05:00
8
8
  summary: JDBC adapter for ActiveRecord, for use within JRuby on Rails.
9
9
  require_paths:
10
10
  - lib