activerecord-jdbc-adapter 1.2.8 → 1.2.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/.travis.yml +1 -1
  2. data/Gemfile +2 -1
  3. data/Gemfile.lock +5 -6
  4. data/History.txt +11 -0
  5. data/gemfiles/rails23.gemfile +2 -1
  6. data/gemfiles/rails23.gemfile.lock +5 -2
  7. data/gemfiles/rails30.gemfile +2 -1
  8. data/gemfiles/rails30.gemfile.lock +5 -2
  9. data/gemfiles/rails31.gemfile +2 -1
  10. data/gemfiles/rails31.gemfile.lock +5 -2
  11. data/gemfiles/rails32.gemfile +2 -1
  12. data/gemfiles/rails32.gemfile.lock +5 -2
  13. data/lib/arel/engines/sql/compilers/mssql_compiler.rb +1 -1
  14. data/lib/arel/visitors/sql_server.rb +4 -4
  15. data/lib/arjdbc/db2/adapter.rb +14 -3
  16. data/lib/arjdbc/discover.rb +1 -1
  17. data/lib/arjdbc/jdbc/adapter.rb +1 -0
  18. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  19. data/lib/arjdbc/jdbc/connection.rb +73 -63
  20. data/lib/arjdbc/jdbc/extension.rb +1 -1
  21. data/lib/arjdbc/mssql.rb +3 -0
  22. data/lib/arjdbc/mssql/adapter.rb +132 -115
  23. data/lib/arjdbc/mssql/connection_methods.rb +1 -1
  24. data/lib/arjdbc/mssql/limit_helpers.rb +62 -66
  25. data/lib/arjdbc/mssql/lock_helpers.rb +2 -2
  26. data/lib/arjdbc/mssql/tsql_methods.rb +58 -0
  27. data/lib/arjdbc/mssql/utils.rb +53 -0
  28. data/lib/arjdbc/oracle/adapter.rb +61 -39
  29. data/lib/arjdbc/sqlite3/adapter.rb +3 -6
  30. data/lib/arjdbc/version.rb +1 -1
  31. data/src/java/arjdbc/jdbc/AdapterJavaService.java +4 -2
  32. data/src/java/arjdbc/mssql/MSSQLModule.java +70 -0
  33. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +128 -0
  34. data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +25 -112
  35. data/test/db/mssql.rb +8 -8
  36. data/test/db2_simple_test.rb +7 -0
  37. data/test/models/entry.rb +2 -1
  38. data/test/mssql_binary_test.rb +6 -0
  39. data/test/mssql_db_create_test.rb +5 -2
  40. data/test/mssql_identity_insert_test.rb +1 -2
  41. data/test/mssql_ignore_system_views_test.rb +5 -5
  42. data/test/mssql_limit_offset_test.rb +51 -55
  43. data/test/mssql_multibyte_test.rb +1 -2
  44. data/test/mssql_row_locking_test.rb +1 -1
  45. data/test/mssql_simple_test.rb +6 -10
  46. data/test/{mssql_row_locking_sql_test.rb → mssql_test.rb} +110 -18
  47. data/test/mysql_db_create_test.rb +13 -7
  48. data/test/oracle_simple_test.rb +18 -0
  49. data/test/postgres_db_create_test.rb +26 -13
  50. data/test/simple.rb +45 -15
  51. data/test/sqlite3_schema_dump_test.rb +6 -0
  52. data/test/sqlite3_type_conversion_test.rb +20 -17
  53. data/test/test_helper.rb +44 -2
  54. metadata +9 -4
  55. data/lib/arjdbc/mssql/tsql_helper.rb +0 -53
@@ -24,4 +24,4 @@ branches:
24
24
  - 1-2-stable
25
25
  matrix:
26
26
  allow_failures:
27
- - gemfile: gemfiles/rails23.gemfile
27
+ - env: DB=jdbc
data/Gemfile CHANGED
@@ -11,7 +11,8 @@ gem 'appraisal'
11
11
  gem 'rake', :require => nil
12
12
  # appraisal ignores group block declarations :
13
13
  gem 'test-unit', :group => :test
14
- gem 'mocha', :require => nil, :group => :test # '>= 0.13.0'
14
+ gem 'test-unit-context', :group => :test
15
+ gem 'mocha', '~> 0.12.1', :require => nil, :group => :test # '>= 0.13.0'
15
16
  gem 'simplecov', :require => nil, :group => :test
16
17
  gem 'bcrypt-ruby', '~> 3.0.0', :require => nil, :group => :test
17
18
 
@@ -26,7 +26,6 @@ GEM
26
26
  bundler
27
27
  rake
28
28
  arel (3.0.2)
29
- bcrypt-ruby (3.0.1)
30
29
  bcrypt-ruby (3.0.1-java)
31
30
  bouncy-castle-java (1.5.0146.1)
32
31
  builder (3.0.4)
@@ -37,9 +36,8 @@ GEM
37
36
  journey (1.0.4)
38
37
  jruby-openssl (0.8.2)
39
38
  bouncy-castle-java (>= 1.5.0146.1)
40
- linecache (0.46-java)
41
39
  metaclass (0.0.1)
42
- mocha (0.13.2)
40
+ mocha (0.12.10)
43
41
  metaclass (~> 0.0.1)
44
42
  multi_json (1.5.0)
45
43
  rack (1.4.4)
@@ -51,8 +49,6 @@ GEM
51
49
  ruby-debug (0.10.4)
52
50
  columnize (>= 0.1)
53
51
  ruby-debug-base (~> 0.10.4.0)
54
- ruby-debug-base (0.10.4)
55
- linecache (>= 0.3)
56
52
  ruby-debug-base (0.10.4-java)
57
53
  simplecov (0.7.1)
58
54
  multi_json (~> 1.0)
@@ -64,6 +60,8 @@ GEM
64
60
  rack (~> 1.0)
65
61
  tilt (~> 1.1, != 1.3.0)
66
62
  test-unit (2.5.4)
63
+ test-unit-context (0.3.0)
64
+ test-unit (>= 2.4.0)
67
65
  tilt (1.3.3)
68
66
  tzinfo (0.3.35)
69
67
 
@@ -77,8 +75,9 @@ DEPENDENCIES
77
75
  bcrypt-ruby (~> 3.0.0)
78
76
  erubis
79
77
  jruby-openssl
80
- mocha
78
+ mocha (~> 0.12.1)
81
79
  rake
82
80
  ruby-debug
83
81
  simplecov
84
82
  test-unit
83
+ test-unit-context
@@ -1,3 +1,14 @@
1
+ == 1.2.9 (03/20/13)
2
+
3
+ - [oracle] native database types ala oracle-enhanced adapter
4
+ - [oracle] fix #insert (broken since execute+to_sql refactoring) keeping binds
5
+ respect 30 max identifier length with default sequence names
6
+ - [db2] add as400 primary key support and re-add explain method
7
+ - [mssql] fix table/column name quoting - do not quote if quoted already
8
+ - [mssql] change default constrain sql on 2005+ (closes #320)
9
+ - [mssql] fix substring issue that prevents detecting a query that contains *
10
+ - [mssql] adapter code cleanup + refactored (ArJdbc::) MsSQL -> MSSQL
11
+
1
12
  == 1.2.8 (03/13/13)
2
13
 
3
14
  - [derby] (native) types review & cleanup, externalize AR patch-ing
@@ -6,7 +6,8 @@ gem "jruby-openssl", :platform=>:jruby
6
6
  gem "appraisal"
7
7
  gem "rake", :require=>nil
8
8
  gem "test-unit", :group=>:test
9
- gem "mocha", :require=>nil, :group=>:test
9
+ gem "test-unit-context", :group=>:test
10
+ gem "mocha", "~> 0.12.1", :require=>nil, :group=>:test
10
11
  gem "simplecov", :require=>nil, :group=>:test
11
12
  gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
12
13
  gem "activerecord", "~> 2.3.16"
@@ -19,7 +19,7 @@ GEM
19
19
  jruby-openssl (0.7.7)
20
20
  bouncy-castle-java (>= 1.5.0146.1)
21
21
  metaclass (0.0.1)
22
- mocha (0.11.4)
22
+ mocha (0.12.8)
23
23
  metaclass (~> 0.0.1)
24
24
  multi_json (1.5.0)
25
25
  rack (1.1.5)
@@ -36,6 +36,8 @@ GEM
36
36
  simplecov-html (~> 0.7.1)
37
37
  simplecov-html (0.7.1)
38
38
  test-unit (2.5.3)
39
+ test-unit-context (0.3.0)
40
+ test-unit (>= 2.4.0)
39
41
 
40
42
  PLATFORMS
41
43
  java
@@ -45,8 +47,9 @@ DEPENDENCIES
45
47
  appraisal
46
48
  bcrypt-ruby (~> 3.0.0)
47
49
  jruby-openssl
48
- mocha
50
+ mocha (~> 0.12.1)
49
51
  rails (~> 2.3.16)
50
52
  rake
51
53
  simplecov
52
54
  test-unit
55
+ test-unit-context
@@ -6,7 +6,8 @@ gem "jruby-openssl", :platform=>:jruby
6
6
  gem "appraisal"
7
7
  gem "rake", :require=>nil
8
8
  gem "test-unit", :group=>:test
9
- gem "mocha", :require=>nil, :group=>:test
9
+ gem "test-unit-context", :group=>:test
10
+ gem "mocha", "~> 0.12.1", :require=>nil, :group=>:test
10
11
  gem "simplecov", :require=>nil, :group=>:test
11
12
  gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
12
13
  gem "activerecord", "~> 3.0.20"
@@ -22,7 +22,7 @@ GEM
22
22
  jruby-openssl (0.7.7)
23
23
  bouncy-castle-java (>= 1.5.0146.1)
24
24
  metaclass (0.0.1)
25
- mocha (0.11.4)
25
+ mocha (0.12.8)
26
26
  metaclass (~> 0.0.1)
27
27
  multi_json (1.5.0)
28
28
  rake (10.0.3)
@@ -31,6 +31,8 @@ GEM
31
31
  simplecov-html (~> 0.7.1)
32
32
  simplecov-html (0.7.1)
33
33
  test-unit (2.5.3)
34
+ test-unit-context (0.3.0)
35
+ test-unit (>= 2.4.0)
34
36
  tzinfo (0.3.35)
35
37
 
36
38
  PLATFORMS
@@ -41,7 +43,8 @@ DEPENDENCIES
41
43
  appraisal
42
44
  bcrypt-ruby (~> 3.0.0)
43
45
  jruby-openssl
44
- mocha
46
+ mocha (~> 0.12.1)
45
47
  rake
46
48
  simplecov
47
49
  test-unit
50
+ test-unit-context
@@ -6,7 +6,8 @@ gem "jruby-openssl", :platform=>:jruby
6
6
  gem "appraisal"
7
7
  gem "rake", :require=>nil
8
8
  gem "test-unit", :group=>:test
9
- gem "mocha", :require=>nil, :group=>:test
9
+ gem "test-unit-context", :group=>:test
10
+ gem "mocha", "~> 0.12.1", :require=>nil, :group=>:test
10
11
  gem "simplecov", :require=>nil, :group=>:test
11
12
  gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
12
13
  gem "activerecord", "~> 3.1.10"
@@ -23,7 +23,7 @@ GEM
23
23
  jruby-openssl (0.7.7)
24
24
  bouncy-castle-java (>= 1.5.0146.1)
25
25
  metaclass (0.0.1)
26
- mocha (0.11.4)
26
+ mocha (0.12.8)
27
27
  metaclass (~> 0.0.1)
28
28
  multi_json (1.2.0)
29
29
  rake (10.0.3)
@@ -32,6 +32,8 @@ GEM
32
32
  simplecov-html (~> 0.7.1)
33
33
  simplecov-html (0.7.1)
34
34
  test-unit (2.5.3)
35
+ test-unit-context (0.3.0)
36
+ test-unit (>= 2.4.0)
35
37
  tzinfo (0.3.35)
36
38
 
37
39
  PLATFORMS
@@ -42,7 +44,8 @@ DEPENDENCIES
42
44
  appraisal
43
45
  bcrypt-ruby (~> 3.0.0)
44
46
  jruby-openssl
45
- mocha
47
+ mocha (~> 0.12.1)
46
48
  rake
47
49
  simplecov
48
50
  test-unit
51
+ test-unit-context
@@ -6,7 +6,8 @@ gem "jruby-openssl", :platform=>:jruby
6
6
  gem "appraisal"
7
7
  gem "rake", :require=>nil
8
8
  gem "test-unit", :group=>:test
9
- gem "mocha", :require=>nil, :group=>:test
9
+ gem "test-unit-context", :group=>:test
10
+ gem "mocha", "~> 0.12.1", :require=>nil, :group=>:test
10
11
  gem "simplecov", :require=>nil, :group=>:test
11
12
  gem "bcrypt-ruby", "~> 3.0.0", :require=>nil, :group=>:test
12
13
  gem "activerecord", "~> 3.2.11"
@@ -23,7 +23,7 @@ GEM
23
23
  jruby-openssl (0.7.7)
24
24
  bouncy-castle-java (>= 1.5.0146.1)
25
25
  metaclass (0.0.1)
26
- mocha (0.11.4)
26
+ mocha (0.12.8)
27
27
  metaclass (~> 0.0.1)
28
28
  multi_json (1.5.0)
29
29
  rake (10.0.3)
@@ -32,6 +32,8 @@ GEM
32
32
  simplecov-html (~> 0.7.1)
33
33
  simplecov-html (0.7.1)
34
34
  test-unit (2.5.3)
35
+ test-unit-context (0.3.0)
36
+ test-unit (>= 2.4.0)
35
37
  tzinfo (0.3.35)
36
38
 
37
39
  PLATFORMS
@@ -42,7 +44,8 @@ DEPENDENCIES
42
44
  appraisal
43
45
  bcrypt-ruby (~> 3.0.0)
44
46
  jruby-openssl
45
- mocha
47
+ mocha (~> 0.12.1)
46
48
  rake
47
49
  simplecov
48
50
  test-unit
51
+ test-unit-context
@@ -1,6 +1,6 @@
1
1
  module Arel
2
2
  module SqlCompiler
3
- class MsSQLCompiler < GenericCompiler
3
+ class MSSQLCompiler < GenericCompiler
4
4
  def select_sql
5
5
  projections = @relation.projections
6
6
  offset = relation.skipped
@@ -2,9 +2,9 @@ require 'arel/visitors/compat'
2
2
 
3
3
  module Arel
4
4
  module Visitors
5
- class SQLServer < Arel::Visitors::ToSql
6
- include ArJdbc::MsSQL::LimitHelpers::SqlServerReplaceLimitOffset
7
- include ArJdbc::MsSQL::LockHelpers::SqlServerAddLock
5
+ class SQLServer < ToSql
6
+ include ArJdbc::MSSQL::LimitHelpers::SqlServerReplaceLimitOffset
7
+ include ArJdbc::MSSQL::LockHelpers::SqlServerAddLock
8
8
 
9
9
  def select_count? o
10
10
  sel = o.cores.length == 1 && o.cores.first
@@ -50,7 +50,7 @@ module Arel
50
50
  end
51
51
 
52
52
  class SQLServer2000 < SQLServer
53
- include ArJdbc::MsSQL::LimitHelpers::SqlServer2000ReplaceLimitOffset
53
+ include ArJdbc::MSSQL::LimitHelpers::SqlServer2000ReplaceLimitOffset
54
54
  end
55
55
  end
56
56
  end
@@ -14,6 +14,10 @@ module ArJdbc
14
14
  def self.lob_callback_added! # :nodoc
15
15
  @@_lob_callback_added = true
16
16
  end
17
+
18
+ def explain(query, *binds)
19
+ # TODO: Explain this! Do not remove !
20
+ end
17
21
 
18
22
  def self.extended(base)
19
23
  if ADD_LOB_CALLBACK && ! lob_callback_added?
@@ -173,9 +177,16 @@ module ArJdbc
173
177
  def prefetch_primary_key?(table_name = nil)
174
178
  # TRUE if the table has no identity column
175
179
  names = table_name.upcase.split(".")
176
- sql = "SELECT 1 FROM SYSCAT.COLUMNS WHERE IDENTITY = 'Y' "
177
- sql += "AND TABSCHEMA = '#{names.first}' " if names.size == 2
178
- sql += "AND TABNAME = '#{names.last}'"
180
+ sql = ""
181
+ if as400?
182
+ sql = "SELECT 1 FROM SYSIBM.SQLPRIMARYKEYS WHERE "
183
+ sql += "TABLE_SCHEM = '#{names.first}' AND " if names.size == 2
184
+ sql += "TABLE_NAME = '#{names.last}'"
185
+ else
186
+ sql = "SELECT 1 FROM SYSCAT.COLUMNS WHERE IDENTITY = 'Y' "
187
+ sql += "AND TABSCHEMA = '#{names.first}' " if names.size == 2
188
+ sql += "AND TABNAME = '#{names.last}'"
189
+ end
179
190
  select_one(sql).nil?
180
191
  end
181
192
 
@@ -84,7 +84,7 @@ module ::ArJdbc
84
84
  end
85
85
  end
86
86
 
87
- extension :MsSQL do |name|
87
+ extension :MSSQL do |name|
88
88
  if name =~ /sqlserver|tds|Microsoft SQL/i
89
89
  require 'arjdbc/mssql'
90
90
  true
@@ -196,6 +196,7 @@ module ActiveRecord
196
196
 
197
197
  def reconnect!
198
198
  @connection.reconnect!
199
+ configure_connection if respond_to?(:configure_connection)
199
200
  @connection
200
201
  end
201
202
 
@@ -1,18 +1,85 @@
1
1
  module ActiveRecord
2
2
  module ConnectionAdapters
3
3
  class JdbcConnection
4
+
5
+ attr_reader :adapter, :connection_factory
6
+
7
+ # @native_database_types - setup properly by adapter= versus set_native_database_types.
8
+ # This contains type information for the adapter. Individual adapters can make tweaks
9
+ # by defined modify_types
10
+ #
11
+ # @native_types - This is the default type settings sans any modifications by the
12
+ # individual adapter. My guess is that if we loaded two adapters of different types
13
+ # then this is used as a base to be tweaked by each adapter to create @native_database_types
14
+
15
+ def initialize(config)
16
+ self.config = config
17
+ @connection = nil
18
+ @jndi_connection = false
19
+ configure_connection # ConfigHelper#configure_connection
20
+ connection # force the connection to load (@see RubyJDbcConnection.connection)
21
+ set_native_database_types
22
+ @stmts = {} # AR compatibility - statement cache not used
23
+ rescue ::ActiveRecord::ActiveRecordError
24
+ raise
25
+ rescue Java::JavaSql::SQLException => e
26
+ e = e.cause if defined?(NativeException) && e.is_a?(NativeException) # JRuby-1.6.8
27
+ error = e.getMessage || e.getSQLState
28
+ error = error ? "#{e.java_class.name}: #{error}" : e.java_class.name
29
+ error = ::ActiveRecord::JDBCError.new("The driver encountered an unknown error: #{error}")
30
+ error.errno = e.getErrorCode
31
+ error.sql_exception = e
32
+ raise error
33
+ end
34
+
35
+ def jndi_connection?
36
+ @jndi_connection == true
37
+ end
38
+
39
+ def active?
40
+ !! @connection
41
+ end
42
+
43
+ def adapter=(adapter)
44
+ @adapter = adapter
45
+ @native_database_types = dup_native_types
46
+ @adapter.modify_types(@native_database_types)
47
+ @adapter.config.replace(config)
48
+ end
49
+
50
+ private
51
+
52
+ # Duplicate all native types into new hash structure so it can be modified
53
+ # without destroying original structure.
54
+ def dup_native_types
55
+ types = {}
56
+ @native_types.each_pair do |k, v|
57
+ types[k] = v.inject({}) do |memo, kv|
58
+ last = kv.last
59
+ memo[kv.first] = last.is_a?(Numeric) ? last : (last.dup rescue last)
60
+ memo
61
+ end
62
+ end
63
+ types
64
+ end
65
+
4
66
  module ConfigHelper
67
+
5
68
  attr_reader :config
6
69
 
7
70
  def config=(config)
8
71
  @config = config.symbolize_keys
9
72
  end
10
73
 
74
+ # Configure this connection from the available configuration.
75
+ # @see #configure_jdbc
76
+ # @see #configure_jndi
77
+ #
78
+ # @note this has nothing to do with the configure_connection implemented
79
+ # on some of the concrete adapters (e.g. {#ArJdbc::Postgres})
11
80
  def configure_connection
12
81
  config[:retry_count] ||= 5
13
82
  config[:connection_alive_sql] ||= "select 1"
14
- @jndi_connection = false
15
- @connection = nil
16
83
  if config[:jndi]
17
84
  begin
18
85
  configure_jndi
@@ -50,6 +117,7 @@ module ActiveRecord
50
117
  end
51
118
 
52
119
  private
120
+
53
121
  def configure_url
54
122
  url = config[:url].to_s
55
123
  if Hash === config[:options]
@@ -65,68 +133,10 @@ module ActiveRecord
65
133
  url
66
134
  end
67
135
 
68
- end
69
-
70
- attr_reader :adapter, :connection_factory
71
-
72
- # @native_database_types - setup properly by adapter= versus set_native_database_types.
73
- # This contains type information for the adapter. Individual adapters can make tweaks
74
- # by defined modify_types
75
- #
76
- # @native_types - This is the default type settings sans any modifications by the
77
- # individual adapter. My guess is that if we loaded two adapters of different types
78
- # then this is used as a base to be tweaked by each adapter to create @native_database_types
79
-
80
- def initialize(config)
81
- self.config = config
82
- configure_connection
83
- connection # force the connection to load
84
- set_native_database_types
85
- @stmts = {}
86
- rescue ::ActiveRecord::ActiveRecordError
87
- raise
88
- rescue Java::JavaSql::SQLException => e
89
- e = e.cause if defined?(NativeException) && e.is_a?(NativeException) # JRuby-1.6.8
90
- error = e.getMessage || e.getSQLState
91
- error = error ? "#{e.java_class.name}: #{error}" : e.java_class.name
92
- error = ::ActiveRecord::JDBCError.new("The driver encountered an unknown error: #{error}")
93
- error.errno = e.getErrorCode
94
- error.sql_exception = e
95
- raise error
96
- end
97
-
98
- def adapter=(adapter)
99
- @adapter = adapter
100
- @native_database_types = dup_native_types
101
- @adapter.modify_types(@native_database_types)
102
- @adapter.config.replace(config)
103
- end
104
-
105
- # Duplicate all native types into new hash structure so it can be modified
106
- # without destroying original structure.
107
- def dup_native_types
108
- types = {}
109
- @native_types.each_pair do |k, v|
110
- types[k] = v.inject({}) do |memo, kv|
111
- last = kv.last
112
- memo[kv.first] = last.is_a?(Numeric) ? last : (last.dup rescue last)
113
- memo
114
- end
115
- end
116
- types
117
- end
118
- private :dup_native_types
119
-
120
- def jndi_connection?
121
- @jndi_connection == true
122
- end
123
-
124
- def active?
125
- @connection
126
- end
127
-
128
- private
136
+ end # ConfigHelper
137
+
129
138
  include ConfigHelper
139
+
130
140
  end
131
141
  end
132
142
  end