ActiveRecord-JDBC 0.2.4 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
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