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 +6 -0
- data/Rakefile +1 -1
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +12 -1
- data/lib/jdbc_adapter/jdbc_derby.rb +47 -11
- data/lib/jdbc_adapter/jdbc_firebird.rb +1 -1
- data/lib/jdbc_adapter/jdbc_mimer.rb +14 -6
- data/lib/jdbc_adapter/jdbc_oracle.rb +13 -11
- data/lib/jdbc_adapter/jdbc_postgre.rb +30 -14
- data/lib/jdbc_adapter_internal.jar +0 -0
- data/test/activerecord/connection_adapters/type_conversion_test.rb +30 -30
- metadata +2 -2
data/History.txt
CHANGED
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.
|
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
|
88
|
+
def _execute(sql, name = nil)
|
83
89
|
log_no_bench(sql, name) do
|
84
|
-
|
85
|
-
|
90
|
+
case sql.strip
|
91
|
+
when /^(select|show)/i:
|
86
92
|
@offset ||= 0
|
87
|
-
@
|
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
|
-
|
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
|
-
|
153
|
-
|
154
|
-
|
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
|
-
|
200
|
-
|
201
|
-
#
|
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
|
-
|
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
|
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
|
-
@
|
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
|
-
|
74
|
+
@connection.execute_id_insert(sql,id_value)
|
75
75
|
}
|
76
76
|
end
|
77
77
|
id_value
|
78
78
|
end
|
79
|
-
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
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
|
5
|
-
return
|
6
|
-
|
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 =>
|
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
|
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.
|
7
|
-
date: 2007-
|
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
|