activerecord-jdbc-adapter 0.9.6-java → 0.9.7-java
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 +12 -0
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +3 -1
- data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
- data/lib/jdbc_adapter/jdbc_mssql.rb +77 -28
- data/lib/jdbc_adapter/jdbc_mysql.rb +18 -2
- data/lib/jdbc_adapter/jdbc_postgre.rb +12 -0
- data/lib/jdbc_adapter/version.rb +1 -1
- data/rakelib/package.rake +0 -1
- data/src/java/jdbc_adapter/RubyJdbcConnection.java +6 -3
- data/test/mssql_db_create_test.rb +4 -2
- metadata +22 -6
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== 0.9.7
|
2
|
+
|
3
|
+
- JRUBY-4781: Fix multiple database connection collision issue w/
|
4
|
+
Oracle
|
5
|
+
- ACTIVERECORD_JDBC-115: Support SAVEPOINTS for MySQL and PG so that
|
6
|
+
nested transactions can be faked
|
7
|
+
- ACTIVERECORD_JDBC-116: Handle schema.table better for MySQL (thanks
|
8
|
+
Dilshod Mukhtarov)
|
9
|
+
- Fix 'Wrong # of arguments (2 for 1)' issue with #create_database for
|
10
|
+
MySQL and AR 3.0
|
11
|
+
- SQLServer 2000 support (thanks Jay McGaffigan)
|
12
|
+
|
1
13
|
== 0.9.6
|
2
14
|
|
3
15
|
- The Oracle release!
|
@@ -74,7 +74,9 @@ module JdbcSpec
|
|
74
74
|
alias :#{meth}_pre_pk :#{meth}
|
75
75
|
def #{meth}(include_primary_key = true, *args) #:nodoc:
|
76
76
|
aq = #{meth}_pre_pk(include_primary_key, *args)
|
77
|
-
|
77
|
+
if connection.is_a?(JdbcSpec::Oracle) || connection.is_a?(JdbcSpec::Mimer)
|
78
|
+
aq[#{pk_hash_key}] = #{pk_hash_value} if include_primary_key && aq[#{pk_hash_key}].nil?
|
79
|
+
end
|
78
80
|
aq
|
79
81
|
end
|
80
82
|
}
|
Binary file
|
@@ -16,7 +16,7 @@ module ::JdbcSpec
|
|
16
16
|
end
|
17
17
|
|
18
18
|
module MsSQL
|
19
|
-
|
19
|
+
|
20
20
|
include TSqlMethods
|
21
21
|
|
22
22
|
def self.extended(mod)
|
@@ -36,6 +36,7 @@ module ::JdbcSpec
|
|
36
36
|
ActiveRecord::Base.after_save :after_save_with_mssql_lob
|
37
37
|
@lob_callback_added = true
|
38
38
|
end
|
39
|
+
mod.add_version_specific_add_limit_offset
|
39
40
|
end
|
40
41
|
|
41
42
|
def self.adapter_matcher(name, *)
|
@@ -50,15 +51,30 @@ module ::JdbcSpec
|
|
50
51
|
::ActiveRecord::ConnectionAdapters::MssqlJdbcConnection
|
51
52
|
end
|
52
53
|
|
54
|
+
def sqlserver_version
|
55
|
+
@sqlserver_version ||= select_value("select @@version")[/Microsoft SQL Server\s+(\d{4})/, 1]
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_version_specific_add_limit_offset
|
59
|
+
if sqlserver_version == "2000"
|
60
|
+
extend SqlServer2000LimitOffset
|
61
|
+
else
|
62
|
+
extend SqlServerLimitOffset
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
53
66
|
def modify_types(tp) #:nodoc:
|
54
67
|
super(tp)
|
55
68
|
tp[:string] = {:name => "NVARCHAR", :limit => 255}
|
56
|
-
|
69
|
+
if sqlserver_version == "2000"
|
70
|
+
tp[:text] = {:name => "NTEXT"}
|
71
|
+
else
|
72
|
+
tp[:text] = {:name => "NVARCHAR(MAX)"}
|
73
|
+
end
|
57
74
|
tp
|
58
75
|
end
|
59
|
-
|
76
|
+
|
60
77
|
module Column
|
61
|
-
|
62
78
|
attr_accessor :identity, :is_special
|
63
79
|
|
64
80
|
def simplified_type(field_type)
|
@@ -82,7 +98,7 @@ module ::JdbcSpec
|
|
82
98
|
return $1 if value =~ /^\(N?'(.*)'\)$/
|
83
99
|
value
|
84
100
|
end
|
85
|
-
|
101
|
+
|
86
102
|
def type_cast(value)
|
87
103
|
return nil if value.nil? || value == "(null)" || value == "(NULL)"
|
88
104
|
case type
|
@@ -97,7 +113,7 @@ module ::JdbcSpec
|
|
97
113
|
when :binary then unquote value
|
98
114
|
else value
|
99
115
|
end
|
100
|
-
|
116
|
+
|
101
117
|
end
|
102
118
|
|
103
119
|
def is_utf8?
|
@@ -139,7 +155,7 @@ module ::JdbcSpec
|
|
139
155
|
def self.string_to_binary(value)
|
140
156
|
''
|
141
157
|
end
|
142
|
-
|
158
|
+
|
143
159
|
end
|
144
160
|
|
145
161
|
def quote(value, column = nil)
|
@@ -184,19 +200,52 @@ module ::JdbcSpec
|
|
184
200
|
quote false
|
185
201
|
end
|
186
202
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
203
|
+
module SqlServer2000LimitOffset
|
204
|
+
def add_limit_offset!(sql, options)
|
205
|
+
limit = options[:limit]
|
206
|
+
if limit
|
207
|
+
offset = (options[:offset] || 0).to_i
|
208
|
+
start_row = offset + 1
|
209
|
+
end_row = offset + limit.to_i
|
210
|
+
order = (options[:order] || determine_order_clause(sql))
|
211
|
+
sql.sub!(/ ORDER BY.*$/i, '')
|
212
|
+
find_select = /\b(SELECT(?:\s+DISTINCT)?)\b(.*)/i
|
213
|
+
whole, select, rest_of_query = find_select.match(sql).to_a
|
214
|
+
if (start_row == 1) && (end_row ==1)
|
215
|
+
new_sql = "#{select} TOP 1 #{rest_of_query}"
|
216
|
+
sql.replace(new_sql)
|
217
|
+
else
|
218
|
+
#UGLY
|
219
|
+
#KLUDGY?
|
220
|
+
#removing out stuff before the FROM...
|
221
|
+
rest = rest_of_query[/FROM/i=~ rest_of_query.. -1]
|
222
|
+
#need the table name for avoiding amiguity
|
223
|
+
table_name = get_table_name(sql)
|
224
|
+
#I am not sure this will cover all bases. but all the tests pass
|
225
|
+
new_order = "#{order}, #{table_name}.id" if order.index("#{table_name}.id").nil?
|
226
|
+
new_order ||= order
|
227
|
+
new_sql = "#{select} TOP #{limit} #{rest_of_query} WHERE #{table_name}.id NOT IN (#{select} TOP #{offset} #{table_name}.id #{rest} ORDER BY #{new_order}) ORDER BY #{order} "
|
228
|
+
sql.replace(new_sql)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
module SqlServerLimitOffset
|
235
|
+
def add_limit_offset!(sql, options)
|
236
|
+
limit = options[:limit]
|
237
|
+
if limit
|
238
|
+
offset = (options[:offset] || 0).to_i
|
239
|
+
start_row = offset + 1
|
240
|
+
end_row = offset + limit.to_i
|
241
|
+
order = (options[:order] || determine_order_clause(sql))
|
242
|
+
sql.sub!(/ ORDER BY.*$/i, '')
|
243
|
+
find_select = /\b(SELECT(?:\s+DISTINCT)?)\b(.*)/i
|
244
|
+
whole, select, rest_of_query = find_select.match(sql).to_a
|
245
|
+
new_sql = "#{select} t.* FROM (SELECT ROW_NUMBER() OVER(ORDER BY #{order}) AS row_num, #{rest_of_query}"
|
246
|
+
new_sql << ") AS t WHERE t.row_num BETWEEN #{start_row.to_s} AND #{end_row.to_s}"
|
247
|
+
sql.replace(new_sql)
|
248
|
+
end
|
200
249
|
end
|
201
250
|
end
|
202
251
|
|
@@ -251,7 +300,7 @@ module ::JdbcSpec
|
|
251
300
|
change_column_type(table_name, column_name, type, options)
|
252
301
|
change_column_default(table_name, column_name, options[:default]) if options_include_default?(options)
|
253
302
|
end
|
254
|
-
|
303
|
+
|
255
304
|
def change_column_type(table_name, column_name, type, options = {}) #:nodoc:
|
256
305
|
sql = "ALTER TABLE #{table_name} ALTER COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
257
306
|
if options.has_key?(:null)
|
@@ -259,14 +308,14 @@ module ::JdbcSpec
|
|
259
308
|
end
|
260
309
|
execute(sql)
|
261
310
|
end
|
262
|
-
|
311
|
+
|
263
312
|
def change_column_default(table_name, column_name, default) #:nodoc:
|
264
313
|
remove_default_constraint(table_name, column_name)
|
265
314
|
unless default.nil?
|
266
315
|
execute "ALTER TABLE #{table_name} ADD CONSTRAINT DF_#{table_name}_#{column_name} DEFAULT #{quote(default)} FOR #{quote_column_name(column_name)}"
|
267
316
|
end
|
268
317
|
end
|
269
|
-
|
318
|
+
|
270
319
|
def remove_column(table_name, column_name)
|
271
320
|
remove_check_constraints(table_name, column_name)
|
272
321
|
remove_default_constraint(table_name, column_name)
|
@@ -400,20 +449,20 @@ module ::JdbcSpec
|
|
400
449
|
end
|
401
450
|
sql
|
402
451
|
end
|
403
|
-
|
452
|
+
|
404
453
|
def determine_order_clause(sql)
|
405
454
|
return $1 if sql =~ /ORDER BY (.*)$/
|
406
455
|
sql =~ /FROM +(\w+?)\b/ || raise("can't determine table name")
|
407
|
-
table_name = $1
|
408
|
-
"#{table_name}.#{determine_primary_key(table_name)}"
|
456
|
+
table_name = $1
|
457
|
+
"#{table_name}.#{determine_primary_key(table_name)}"
|
409
458
|
end
|
410
459
|
|
411
460
|
def determine_primary_key(table_name)
|
412
461
|
primary_key = columns(table_name).detect { |column| column.primary || column.identity }
|
413
462
|
primary_key ? primary_key.name : "id"
|
414
463
|
end
|
415
|
-
|
464
|
+
|
416
465
|
end
|
417
|
-
|
466
|
+
|
418
467
|
end
|
419
468
|
|
@@ -118,6 +118,22 @@ module ::JdbcSpec
|
|
118
118
|
# Transactions aren't supported
|
119
119
|
end
|
120
120
|
|
121
|
+
def supports_savepoints? #:nodoc:
|
122
|
+
true
|
123
|
+
end
|
124
|
+
|
125
|
+
def create_savepoint
|
126
|
+
execute("SAVEPOINT #{current_savepoint_name}")
|
127
|
+
end
|
128
|
+
|
129
|
+
def rollback_to_savepoint
|
130
|
+
execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}")
|
131
|
+
end
|
132
|
+
|
133
|
+
def release_savepoint
|
134
|
+
execute("RELEASE SAVEPOINT #{current_savepoint_name}")
|
135
|
+
end
|
136
|
+
|
121
137
|
def disable_referential_integrity(&block) #:nodoc:
|
122
138
|
old = select_value("SELECT @@FOREIGN_KEY_CHECKS")
|
123
139
|
begin
|
@@ -150,9 +166,9 @@ module ::JdbcSpec
|
|
150
166
|
end
|
151
167
|
end
|
152
168
|
|
153
|
-
def recreate_database(name) #:nodoc:
|
169
|
+
def recreate_database(name, options = {}) #:nodoc:
|
154
170
|
drop_database(name)
|
155
|
-
create_database(name)
|
171
|
+
create_database(name, options)
|
156
172
|
end
|
157
173
|
|
158
174
|
def character_set(options) #:nodoc:
|
@@ -144,6 +144,18 @@ module ::JdbcSpec
|
|
144
144
|
true
|
145
145
|
end
|
146
146
|
|
147
|
+
def create_savepoint
|
148
|
+
execute("SAVEPOINT #{current_savepoint_name}")
|
149
|
+
end
|
150
|
+
|
151
|
+
def rollback_to_savepoint
|
152
|
+
execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}")
|
153
|
+
end
|
154
|
+
|
155
|
+
def release_savepoint
|
156
|
+
execute("RELEASE SAVEPOINT #{current_savepoint_name}")
|
157
|
+
end
|
158
|
+
|
147
159
|
# Returns the configured supported identifier length supported by PostgreSQL,
|
148
160
|
# or report the default of 63 on PostgreSQL 7.x.
|
149
161
|
def table_alias_length
|
data/lib/jdbc_adapter/version.rb
CHANGED
data/rakelib/package.rake
CHANGED
@@ -24,7 +24,6 @@ begin
|
|
24
24
|
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
25
25
|
p.description = p.paragraphs_of('README.txt', 0...1).join("\n\n")
|
26
26
|
end
|
27
|
-
hoe.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
|
28
27
|
task :gemspec do
|
29
28
|
File.open("#{hoe.name}.gemspec", "w") {|f| f << hoe.spec.to_ruby }
|
30
29
|
end
|
@@ -135,15 +135,18 @@ public class RubyJdbcConnection extends RubyObject {
|
|
135
135
|
if (schemaName != null) schemaName = caseConvertIdentifierForJdbc(metadata, schemaName);
|
136
136
|
table_name = caseConvertIdentifierForJdbc(metadata, table_name);
|
137
137
|
|
138
|
+
String catalog = c.getCatalog();
|
139
|
+
if (schemaName != null) { catalog = schemaName; }
|
140
|
+
|
138
141
|
String[] tableTypes = new String[]{"TABLE","VIEW","SYNONYM"};
|
139
142
|
RubyArray matchingTables = (RubyArray) tableLookupBlock(context.getRuntime(),
|
140
|
-
|
143
|
+
catalog, schemaName, table_name, tableTypes, false).call(c);
|
141
144
|
if (matchingTables.isEmpty()) {
|
142
145
|
throw new SQLException("Table " + table_name + " does not exist");
|
143
146
|
}
|
144
147
|
|
145
|
-
results = metadata.getColumns(
|
146
|
-
pkeys = metadata.getPrimaryKeys(
|
148
|
+
results = metadata.getColumns(catalog,schemaName,table_name,null);
|
149
|
+
pkeys = metadata.getPrimaryKeys(catalog,schemaName,table_name);
|
147
150
|
return unmarshal_columns(context, metadata, results, pkeys);
|
148
151
|
} finally {
|
149
152
|
close(results);
|
@@ -7,7 +7,7 @@ class MysqlDbCreateTest < Test::Unit::TestCase
|
|
7
7
|
def db_config
|
8
8
|
MSSQL_CONFIG
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def test_rake_db_create
|
12
12
|
begin
|
13
13
|
Rake::Task["db:create"].invoke
|
@@ -18,7 +18,9 @@ class MysqlDbCreateTest < Test::Unit::TestCase
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
ActiveRecord::Base.establish_connection(db_config.merge(:database => "master"))
|
21
|
-
|
21
|
+
select = "SELECT NAME FROM sys.sysdatabases"
|
22
|
+
select = "SELECT name FROM master..sysdatabases ORDER BY name" if ActiveRecord::Base.connection.sqlserver_version == "2000"
|
23
|
+
databases = ActiveRecord::Base.connection.select_rows(select).flatten
|
22
24
|
assert databases.include?(@db_name)
|
23
25
|
end
|
24
26
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 9
|
8
|
-
-
|
9
|
-
version: 0.9.
|
8
|
+
- 7
|
9
|
+
version: 0.9.7
|
10
10
|
platform: java
|
11
11
|
authors:
|
12
12
|
- Nick Sieger, Ola Bini and JRuby contributors
|
@@ -14,10 +14,24 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-25 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: hoe
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 2
|
30
|
+
- 3
|
31
|
+
- 3
|
32
|
+
version: 2.3.3
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
21
35
|
description: |-
|
22
36
|
activerecord-jdbc-adapter is a database adapter for Rails' ActiveRecord
|
23
37
|
component that can be used with JRuby[http://www.jruby.org/]. It allows use of
|
@@ -178,6 +192,7 @@ rdoc_options:
|
|
178
192
|
require_paths:
|
179
193
|
- lib
|
180
194
|
required_ruby_version: !ruby/object:Gem::Requirement
|
195
|
+
none: false
|
181
196
|
requirements:
|
182
197
|
- - ">="
|
183
198
|
- !ruby/object:Gem::Version
|
@@ -185,6 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
200
|
- 0
|
186
201
|
version: "0"
|
187
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
|
+
none: false
|
188
204
|
requirements:
|
189
205
|
- - ">="
|
190
206
|
- !ruby/object:Gem::Version
|
@@ -194,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
210
|
requirements: []
|
195
211
|
|
196
212
|
rubyforge_project: jruby-extras
|
197
|
-
rubygems_version: 1.3.
|
213
|
+
rubygems_version: 1.3.7
|
198
214
|
signing_key:
|
199
215
|
specification_version: 3
|
200
216
|
summary: JDBC adapter for ActiveRecord, for use within JRuby on Rails.
|