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 +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
|