activerecord-jdbc-adapter 1.3.9 → 1.3.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -0
- data/History.md +14 -0
- data/Rakefile +3 -1
- data/lib/arel/visitors/sql_server.rb +6 -7
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/arel_support.rb +3 -2
- data/lib/arjdbc/jdbc/connection.rb +0 -4
- data/lib/arjdbc/mssql/limit_helpers.rb +52 -45
- data/lib/arjdbc/mssql/utils.rb +10 -15
- data/lib/arjdbc/mysql/adapter.rb +1 -1
- data/lib/arjdbc/oracle/adapter.rb +1 -1
- data/lib/arjdbc/postgresql/adapter.rb +12 -6
- data/lib/arjdbc/postgresql/column.rb +18 -0
- data/lib/arjdbc/version.rb +1 -1
- data/rakelib/01-tomcat.rake +4 -5
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +36 -5
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +10 -6
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11049989079fcc38fceef1db1689c5db555fd37e
|
4
|
+
data.tar.gz: 01a9dab21474a9548126ee80d840264f8d0018f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed02de30c898c0a8fba369ef315572e16997b19436828294a367c93fd1101ae7bd077c7989d0372f524b87bf66cb6a421b4ac8e6d682d7d4655eb5cfc2157156
|
7
|
+
data.tar.gz: 1dafdc93914c961ae1894d79e23b8f7b10c957fd183c96fd471031c16ff2dd6f87b786a8554770ea79612131f406742088c0bbb3dc2ab7ae7fb94fcd32f255be
|
data/Gemfile
CHANGED
@@ -51,3 +51,7 @@ end
|
|
51
51
|
gem 'mysql2', :require => nil, :platform => :mri, :group => :test
|
52
52
|
gem 'pg', :require => nil, :platform => :mri, :group => :test
|
53
53
|
gem 'sqlite3', :require => nil, :platform => :mri, :group => :test
|
54
|
+
group :mssql do
|
55
|
+
gem 'tiny_tds', :require => nil, :platform => :mri, :group => :test
|
56
|
+
gem 'activerecord-sqlserver-adapter', :require => nil, :platform => :mri, :group => :test
|
57
|
+
end
|
data/History.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## 1.3.10 (08/29/14)
|
2
|
+
|
3
|
+
- [postgres] preliminary (temp) fix for Marshal.dump broken since 1.3.8 (#573)
|
4
|
+
- [postgres] adapter was missing the custom rename_index method (fixes #577)
|
5
|
+
- [postgres] user defined types should not raise an error
|
6
|
+
- [postgres] align with Rails distict white-space fix (regression in 4.0.10)
|
7
|
+
- [mssql] allow for `offset(x)` without `limit(y)` to work ... (fixes #564)
|
8
|
+
- [mssql] correctly parse set_table_name string with owner (#574)
|
9
|
+
- allow database.yml or config option to set `:insert_returning` (#570)
|
10
|
+
- [sqlite3] savepoint without passed explicit name not supported
|
11
|
+
- synchronize setting resolved visitor type
|
12
|
+
- [mssql] (hopefully) fix ORDER BY mis-detection - closes #532 (improved #549)
|
13
|
+
- [mysql] columns were sometimes instantiated with the wrong column class (#566)
|
14
|
+
|
1
15
|
## 1.3.9 (07/07/14)
|
2
16
|
|
3
17
|
- [postgres] improve Range's type cast - fixing minor quoting failure on AR 4.x
|
data/Rakefile
CHANGED
@@ -73,7 +73,9 @@ task 'release:do' => 'build:adapters' do
|
|
73
73
|
sh("git diff-index --quiet --cached HEAD") { |ok| fail "git index is not clean" unless ok }
|
74
74
|
|
75
75
|
sh "git tag -a -m \"AR-JDBC #{version}\" #{version_tag}"
|
76
|
-
sh "for gem in `ls pkg/*-#{version}.gem`; do gem push $gem; done"
|
76
|
+
sh "for gem in `ls pkg/*-#{version}.gem`; do gem push $gem; done" do |ok|
|
77
|
+
sh "git push origin master --tags" if ok
|
78
|
+
end
|
77
79
|
end
|
78
80
|
|
79
81
|
# ALL
|
@@ -8,11 +8,7 @@ module Arel
|
|
8
8
|
def visit_Arel_Nodes_SelectStatement(*args) # [o] AR <= 4.0 [o, a] on 4.1
|
9
9
|
o, a = args.first, args.last
|
10
10
|
|
11
|
-
if ! o.limit && ! o.offset
|
12
|
-
return super
|
13
|
-
elsif ! o.limit && o.offset
|
14
|
-
raise ActiveRecord::ActiveRecordError, "must specify :limit with :offset"
|
15
|
-
end
|
11
|
+
return super if ! o.limit && ! o.offset # NOTE: really?
|
16
12
|
|
17
13
|
unless o.orders.empty?
|
18
14
|
select_order_by = "ORDER BY #{do_visit_columns(o.orders, a).join(', ')}"
|
@@ -46,10 +42,13 @@ module Arel
|
|
46
42
|
sql
|
47
43
|
end
|
48
44
|
|
45
|
+
# @private
|
46
|
+
MAX_LIMIT_VALUE = 9_223_372_036_854_775_807
|
47
|
+
|
49
48
|
def visit_Arel_Nodes_UpdateStatement(*args) # [o] AR <= 4.0 [o, a] on 4.1
|
50
49
|
o = args.first
|
51
50
|
if o.orders.any? && o.limit.nil?
|
52
|
-
o.limit = Nodes::Limit.new(
|
51
|
+
o.limit = Nodes::Limit.new(MAX_LIMIT_VALUE)
|
53
52
|
end
|
54
53
|
super
|
55
54
|
end
|
@@ -67,7 +66,7 @@ module Arel
|
|
67
66
|
# User.select("distinct first_name").limit(10)
|
68
67
|
# would generate "select top 10 distinct first_name from users",
|
69
68
|
# which is invalid should be "select distinct top 10 first_name ..."
|
70
|
-
|
69
|
+
''
|
71
70
|
end
|
72
71
|
|
73
72
|
def visit_Arel_Nodes_Limit o, a = nil
|
Binary file
|
@@ -49,8 +49,9 @@ module ActiveRecord::ConnectionAdapters
|
|
49
49
|
visitor_type ||= ::Arel::Visitors::VISITORS[ arel_visitor_name(adapter_spec) ]
|
50
50
|
visitor_type ||= ::Arel::Visitors::ToSql # default (if nothing resolved)
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
RESOLVED_VISITORS.to_java.synchronized do
|
53
|
+
RESOLVED_VISITORS[ adapter ] = ::Arel::Visitors::VISITORS[ adapter ] = visitor_type
|
54
|
+
end
|
54
55
|
end
|
55
56
|
|
56
57
|
visitor_type
|
@@ -38,10 +38,6 @@ module ActiveRecord
|
|
38
38
|
ArJdbc.deprecate "set_native_database_types is no longer used and does nothing override native_database_types instead"
|
39
39
|
end
|
40
40
|
|
41
|
-
def self.jndi_config?(config)
|
42
|
-
config[:jndi] || config[:data_source]
|
43
|
-
end
|
44
|
-
|
45
41
|
def jndi?; @jndi; end
|
46
42
|
alias_method :jndi_connection?, :jndi?
|
47
43
|
|
@@ -4,64 +4,71 @@ module ArJdbc
|
|
4
4
|
|
5
5
|
# @private
|
6
6
|
FIND_SELECT = /\b(SELECT(\s+DISTINCT)?)\b(.*)/mi
|
7
|
-
|
7
|
+
# @private
|
8
|
+
FIND_AGGREGATE_FUNCTION = /(AVG|COUNT|COUNT_BIG|MAX|MIN|SUM|STDDEV|STDEVP|VAR|VARP)\(/i
|
8
9
|
|
9
10
|
module SqlServerReplaceLimitOffset
|
10
11
|
|
11
12
|
module_function
|
12
13
|
|
13
14
|
def replace_limit_offset!(sql, limit, offset, order)
|
14
|
-
|
15
|
-
offset ||= 0
|
16
|
-
start_row, end_row = offset + 1, offset + limit.to_i
|
15
|
+
offset ||= 0
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
17
|
+
if match = FIND_SELECT.match(sql)
|
18
|
+
select, distinct, rest_of_query = match[1], match[2], match[3]
|
19
|
+
rest_of_query.strip!
|
20
|
+
end
|
21
|
+
rest_of_query[0] = '*' if rest_of_query[0...1] == '1' && rest_of_query !~ /1 AS/i
|
22
|
+
if rest_of_query[0...1] == '*'
|
23
|
+
from_table = Utils.get_table_name(rest_of_query, true)
|
24
|
+
rest_of_query = "#{from_table}.#{rest_of_query}"
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
27
|
+
# Ensure correct queries if the rest_of_query contains a 'GROUP BY'. Otherwise the following error occurs:
|
28
|
+
# ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: Column 'users.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
|
29
|
+
# SELECT t.* FROM ( SELECT ROW_NUMBER() OVER(ORDER BY users.id) AS _row_num, [users].[lft], COUNT([users].[lft]) FROM [users] GROUP BY [users].[lft] HAVING COUNT([users].[lft]) > 1 ) AS t WHERE t._row_num BETWEEN 1 AND 1
|
30
|
+
if rest_of_query.downcase.include?('group by')
|
31
|
+
order_start = order.strip[0, 8]; order_start.upcase!
|
32
|
+
if order_start == 'ORDER BY' && order.match(FIND_AGGREGATE_FUNCTION)
|
33
|
+
# do nothing
|
34
|
+
elsif order.count(',') == 0
|
35
|
+
order.gsub!(/ORDER +BY +([^\s]+)(\s+ASC|\s+DESC)?/i, 'ORDER BY MIN(\1)\2')
|
36
|
+
else
|
37
|
+
raise('Only one order condition allowed.')
|
39
38
|
end
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
41
|
+
if distinct # select =~ /DISTINCT/i
|
42
|
+
order = order.gsub(/([a-z0-9_])+\./, 't.')
|
43
|
+
new_sql = "SELECT t.* FROM "
|
44
|
+
new_sql << "( SELECT ROW_NUMBER() OVER(#{order}) AS _row_num, t.* FROM (#{select} #{rest_of_query}) AS t ) AS t"
|
45
|
+
append_limit_row_num_clause(new_sql, limit, offset)
|
46
|
+
else
|
47
|
+
select_columns_before_from = rest_of_query.gsub(/FROM.*/, '').strip
|
48
|
+
only_one_column = !select_columns_before_from.include?(',')
|
49
|
+
only_one_id_column = only_one_column && (select_columns_before_from.ends_with?('.id') || select_columns_before_from.ends_with?('.[id]'))
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
new_sql << "( SELECT ROW_NUMBER() OVER(#{order}) AS _row_num, #{rest_of_query} ) AS t"
|
59
|
-
new_sql << " WHERE t._row_num BETWEEN #{start_row} AND #{end_row}"
|
51
|
+
if only_one_id_column
|
52
|
+
# If there's only one id column a subquery will be created which only contains this column
|
53
|
+
new_sql = "#{select} t.id FROM "
|
54
|
+
else
|
55
|
+
# All selected columns are used
|
56
|
+
new_sql = "#{select} t.* FROM "
|
60
57
|
end
|
58
|
+
new_sql << "( SELECT ROW_NUMBER() OVER(#{order}) AS _row_num, #{rest_of_query} ) AS t"
|
59
|
+
append_limit_row_num_clause(new_sql, limit, offset)
|
60
|
+
end
|
61
61
|
|
62
|
-
|
62
|
+
sql.replace new_sql
|
63
|
+
end
|
64
|
+
|
65
|
+
def append_limit_row_num_clause(sql, limit, offset)
|
66
|
+
if limit
|
67
|
+
start_row = offset + 1; end_row = offset + limit.to_i
|
68
|
+
sql << " WHERE t._row_num BETWEEN #{start_row} AND #{end_row}"
|
69
|
+
else
|
70
|
+
sql << " WHERE t._row_num > #{offset}"
|
63
71
|
end
|
64
|
-
sql
|
65
72
|
end
|
66
73
|
|
67
74
|
end
|
@@ -75,7 +82,7 @@ module ArJdbc
|
|
75
82
|
offset ||= 0
|
76
83
|
start_row = offset + 1
|
77
84
|
end_row = offset + limit.to_i
|
78
|
-
|
85
|
+
|
79
86
|
if match = FIND_SELECT.match(sql)
|
80
87
|
select, distinct, rest_of_query = match[1], match[2], match[3]
|
81
88
|
end
|
data/lib/arjdbc/mssql/utils.rb
CHANGED
@@ -21,19 +21,6 @@ module ArJdbc
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
# protected
|
25
|
-
|
26
|
-
# See "Delimited Identifiers": http://msdn.microsoft.com/en-us/library/ms176027.aspx
|
27
|
-
def remove_identifier_delimiters(keyword)
|
28
|
-
if /\A(\[|")(.*)/m.match(keyword)
|
29
|
-
delim, rest = $1, $2
|
30
|
-
if delim == '[' && rest =~ /]\z/ || delim == '"' && rest =~ /"\z/
|
31
|
-
return rest.chop
|
32
|
-
end
|
33
|
-
end
|
34
|
-
keyword
|
35
|
-
end
|
36
|
-
|
37
24
|
def unquote_table_name(table_name)
|
38
25
|
remove_identifier_delimiters(table_name)
|
39
26
|
end
|
@@ -51,7 +38,8 @@ module ArJdbc
|
|
51
38
|
end
|
52
39
|
|
53
40
|
def unqualify_table_schema(table_name)
|
54
|
-
|
41
|
+
schema_name = table_name.to_s.split('.')[-2]
|
42
|
+
schema_name.nil? ? nil : remove_identifier_delimiters(schema_name)
|
55
43
|
end
|
56
44
|
|
57
45
|
def unqualify_db_name(table_name)
|
@@ -59,6 +47,13 @@ module ArJdbc
|
|
59
47
|
table_names.length == 3 ? remove_identifier_delimiters(table_names.first) : nil
|
60
48
|
end
|
61
49
|
|
50
|
+
# private
|
51
|
+
|
52
|
+
# See "Delimited Identifiers": http://msdn.microsoft.com/en-us/library/ms176027.aspx
|
53
|
+
def remove_identifier_delimiters(keyword)
|
54
|
+
keyword.to_s.tr("\]\[\"", '')
|
55
|
+
end
|
56
|
+
|
62
57
|
end
|
63
58
|
end
|
64
|
-
end
|
59
|
+
end
|
data/lib/arjdbc/mysql/adapter.rb
CHANGED
@@ -332,7 +332,7 @@ module ArJdbc
|
|
332
332
|
sql = "SHOW FULL COLUMNS FROM #{quote_table_name(table_name)}"
|
333
333
|
columns = execute(sql, name || 'SCHEMA')
|
334
334
|
strict = strict_mode?
|
335
|
-
column =
|
335
|
+
column = ::ActiveRecord::ConnectionAdapters::MysqlAdapter::Column
|
336
336
|
pass_cast_type = respond_to?(:lookup_cast_type)
|
337
337
|
columns.map! do |field|
|
338
338
|
sql_type = field['Type']
|
@@ -58,7 +58,7 @@ module ArJdbc
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def use_insert_returning?
|
61
|
-
if
|
61
|
+
if @use_insert_returning.nil?
|
62
62
|
@use_insert_returning = supports_insert_with_returning?
|
63
63
|
end
|
64
64
|
@use_insert_returning
|
@@ -777,11 +777,13 @@ module ArJdbc
|
|
777
777
|
end
|
778
778
|
|
779
779
|
order_columns = orders.reject(&:blank?).map! do |column|
|
780
|
-
column = column.
|
781
|
-
column.gsub(/\s+(ASC|DESC)\s
|
780
|
+
column = column.is_a?(String) ? column.dup : column.to_sql # AREL node
|
781
|
+
column.gsub!(/\s+(?:ASC|DESC)\s*/i, '') # remove any ASC/DESC modifiers
|
782
|
+
column.gsub!(/\s*NULLS\s+(?:FIRST|LAST)?\s*/i, '')
|
783
|
+
column
|
782
784
|
end
|
783
|
-
order_columns.reject!(&:
|
784
|
-
i = -1; order_columns.map! { |
|
785
|
+
order_columns.reject!(&:empty?)
|
786
|
+
i = -1; order_columns.map! { |column| "#{column} AS alias_#{i += 1}" }
|
785
787
|
|
786
788
|
columns = [ columns ]; columns.flatten!
|
787
789
|
columns.push( *order_columns ).join(', ')
|
@@ -805,7 +807,7 @@ module ArJdbc
|
|
805
807
|
# @return [String]
|
806
808
|
# @override
|
807
809
|
def quote(value, column = nil)
|
808
|
-
return super unless column
|
810
|
+
return super unless column && column.type
|
809
811
|
return value if sql_literal?(value)
|
810
812
|
|
811
813
|
case value
|
@@ -1065,6 +1067,10 @@ module ArJdbc
|
|
1065
1067
|
execute "DROP INDEX #{quote_table_name(index_name)}"
|
1066
1068
|
end
|
1067
1069
|
|
1070
|
+
def rename_index(table_name, old_name, new_name)
|
1071
|
+
execute "ALTER INDEX #{quote_column_name(old_name)} RENAME TO #{quote_table_name(new_name)}"
|
1072
|
+
end
|
1073
|
+
|
1068
1074
|
def index_name_length
|
1069
1075
|
63
|
1070
1076
|
end
|
@@ -327,6 +327,24 @@ module ArJdbc
|
|
327
327
|
::Float::INFINITY * (options[:negative] ? -1 : 1)
|
328
328
|
end if AR4_COMPAT
|
329
329
|
|
330
|
+
private
|
331
|
+
|
332
|
+
# TODO marshaling worked in 1.3.7 ,,, got broken in 1.3.8 (due @adapter)
|
333
|
+
# but the fix introduced in 1.3.10 causes backwards (1.3) incompatibility
|
334
|
+
# ... for now should be fine - there's likely more refactoring to happen!
|
335
|
+
|
336
|
+
def marshal_dump
|
337
|
+
# NOTE: disabled oid_type ... due range warnings (maybe they're fine) :
|
338
|
+
# unknown OID 3904: failed to recognize type of 'int4_range'. It will be treated as String.
|
339
|
+
#oid_type if respond_to?(:oid_type)
|
340
|
+
@adapter = nil
|
341
|
+
instance_variables.map { |var| [ var, instance_variable_get(var) ] }
|
342
|
+
end
|
343
|
+
|
344
|
+
def marshal_load(data)
|
345
|
+
data.each { |pair| instance_variable_set( pair[0], pair[1] ) }
|
346
|
+
end
|
347
|
+
|
330
348
|
# @note Based on *active_record/connection_adapters/postgresql/cast.rb* (4.0).
|
331
349
|
module Cast
|
332
350
|
|
data/lib/arjdbc/version.rb
CHANGED
data/rakelib/01-tomcat.rake
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
|
2
1
|
namespace :'tomcat-jndi' do # contains a FS JNDI impl (for tests)
|
3
|
-
|
2
|
+
|
4
3
|
TOMCAT_MAVEN_REPO = 'http://repo2.maven.org/maven2/org/apache/tomcat'
|
5
|
-
TOMCAT_VERSION = '7.0.
|
4
|
+
TOMCAT_VERSION = '7.0.54'
|
6
5
|
|
7
6
|
DOWNLOAD_DIR = File.expand_path('../test/jars', File.dirname(__FILE__))
|
8
7
|
|
@@ -36,7 +35,7 @@ namespace :'tomcat-jndi' do # contains a FS JNDI impl (for tests)
|
|
36
35
|
|
37
36
|
FileUtils.rm_r temp_dir
|
38
37
|
end
|
39
|
-
|
38
|
+
|
40
39
|
task :check do
|
41
40
|
jar_path = File.join(DOWNLOAD_DIR, catalina_jar)
|
42
41
|
unless File.exist?(jar_path)
|
@@ -49,4 +48,4 @@ namespace :'tomcat-jndi' do # contains a FS JNDI impl (for tests)
|
|
49
48
|
rm jar_path if File.exist?(jar_path)
|
50
49
|
end
|
51
50
|
|
52
|
-
end
|
51
|
+
end
|
@@ -1394,6 +1394,37 @@ public class RubyJdbcConnection extends RubyObject {
|
|
1394
1394
|
return value;
|
1395
1395
|
}
|
1396
1396
|
|
1397
|
+
@JRubyMethod(name = "jndi_config?", meta = true)
|
1398
|
+
public static IRubyObject jndi_config_p(final ThreadContext context,
|
1399
|
+
final IRubyObject self, final IRubyObject config) {
|
1400
|
+
// config[:jndi] || config[:data_source]
|
1401
|
+
|
1402
|
+
final Ruby runtime = context.getRuntime();
|
1403
|
+
|
1404
|
+
IRubyObject configValue;
|
1405
|
+
|
1406
|
+
if ( config.getClass() == RubyHash.class ) { // "optimized" version
|
1407
|
+
final RubyHash configHash = ((RubyHash) config);
|
1408
|
+
configValue = configHash.fastARef(runtime.newSymbol("jndi"));
|
1409
|
+
if ( configValue == null ) {
|
1410
|
+
configValue = configHash.fastARef(runtime.newSymbol("data_source"));
|
1411
|
+
}
|
1412
|
+
}
|
1413
|
+
else {
|
1414
|
+
configValue = config.callMethod(context, "[]", runtime.newSymbol("jndi"));
|
1415
|
+
if ( configValue.isNil() ) configValue = null;
|
1416
|
+
if ( configValue == null ) {
|
1417
|
+
configValue = config.callMethod(context, "[]", runtime.newSymbol("data_source"));
|
1418
|
+
}
|
1419
|
+
}
|
1420
|
+
|
1421
|
+
final IRubyObject rubyFalse = runtime.newBoolean( false );
|
1422
|
+
if ( configValue == null || configValue.isNil() || configValue == rubyFalse ) {
|
1423
|
+
return rubyFalse;
|
1424
|
+
}
|
1425
|
+
return context.getRuntime().newBoolean( true );
|
1426
|
+
}
|
1427
|
+
|
1397
1428
|
protected final IRubyObject getConfigValue(final ThreadContext context, final String key) {
|
1398
1429
|
final IRubyObject config = callMethod(context, "config");
|
1399
1430
|
return config.callMethod(context, "[]", context.getRuntime().newSymbol(key));
|
@@ -3380,17 +3411,17 @@ public class RubyJdbcConnection extends RubyObject {
|
|
3380
3411
|
|
3381
3412
|
final IRubyObject[] args;
|
3382
3413
|
|
3383
|
-
final RubyArray cols =
|
3414
|
+
final RubyArray cols = RubyArray.newArray(runtime, columns.length);
|
3384
3415
|
|
3385
3416
|
if ( INIT_COLUMN_TYPES ) { // NOTE: NOT IMPLEMENTED
|
3386
|
-
for ( int i=0; i<columns.length; i++ ) {
|
3387
|
-
cols.
|
3417
|
+
for ( int i = 0; i < columns.length; i++ ) {
|
3418
|
+
cols.append( columns[i].name );
|
3388
3419
|
}
|
3389
3420
|
args = new IRubyObject[] { cols, rows };
|
3390
3421
|
}
|
3391
3422
|
else {
|
3392
|
-
for ( int i=0; i<columns.length; i++ ) {
|
3393
|
-
cols.
|
3423
|
+
for ( int i = 0; i < columns.length; i++ ) {
|
3424
|
+
cols.append( columns[i].name );
|
3394
3425
|
}
|
3395
3426
|
args = new IRubyObject[] { cols, rows };
|
3396
3427
|
}
|
@@ -119,11 +119,12 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
|
|
119
119
|
|
120
120
|
@Override
|
121
121
|
protected IRubyObject indexes(final ThreadContext context, String tableName, final String name, String schemaName) {
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
122
|
+
if ( tableName != null ) {
|
123
|
+
final int i = tableName.indexOf('.');
|
124
|
+
if ( i > 0 && schemaName == null ) {
|
125
|
+
schemaName = tableName.substring(0, i);
|
126
|
+
tableName = tableName.substring(i + 1);
|
127
|
+
}
|
127
128
|
}
|
128
129
|
return super.indexes(context, tableName, name, schemaName);
|
129
130
|
}
|
@@ -214,7 +215,10 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
|
|
214
215
|
@Override
|
215
216
|
@JRubyMethod(name = "create_savepoint", optional = 1)
|
216
217
|
public IRubyObject create_savepoint(final ThreadContext context, final IRubyObject[] args) {
|
217
|
-
IRubyObject name = args.length > 0 ? args[0] : null;
|
218
|
+
final IRubyObject name = args.length > 0 ? args[0] : null;
|
219
|
+
if ( name == null || name.isNil() ) {
|
220
|
+
throw new IllegalArgumentException("create_savepoint (without name) not implemented!");
|
221
|
+
}
|
218
222
|
final Connection connection = getConnection(true);
|
219
223
|
try {
|
220
224
|
connection.setAutoCommit(false);
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-jdbc-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sieger, Ola Bini, Karol Bucek and JRuby contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -243,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
243
243
|
version: '0'
|
244
244
|
requirements: []
|
245
245
|
rubyforge_project: jruby-extras
|
246
|
-
rubygems_version: 2.
|
246
|
+
rubygems_version: 2.4.1
|
247
247
|
signing_key:
|
248
248
|
specification_version: 4
|
249
249
|
summary: JDBC adapter for ActiveRecord, for use within JRuby on Rails.
|