activerecord-jdbc-adapter 1.3.0.beta1 → 1.3.0.beta2

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.
Files changed (161) hide show
  1. data/.gitignore +12 -11
  2. data/.travis.yml +36 -7
  3. data/Appraisals +3 -3
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +13 -6
  6. data/History.txt +64 -0
  7. data/README.md +8 -1
  8. data/Rakefile +3 -1
  9. data/gemfiles/rails23.gemfile +1 -1
  10. data/gemfiles/rails23.gemfile.lock +6 -5
  11. data/gemfiles/rails30.gemfile +1 -1
  12. data/gemfiles/rails30.gemfile.lock +7 -6
  13. data/gemfiles/rails31.gemfile +1 -1
  14. data/gemfiles/rails31.gemfile.lock +6 -5
  15. data/gemfiles/rails32.gemfile +1 -1
  16. data/gemfiles/rails32.gemfile.lock +6 -5
  17. data/gemfiles/rails40.gemfile +2 -4
  18. data/gemfiles/rails40.gemfile.lock +37 -51
  19. data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
  20. data/lib/active_record/connection_adapters/db2_adapter.rb +1 -1
  21. data/lib/arel/visitors/db2.rb +5 -1
  22. data/lib/arel/visitors/hsqldb.rb +1 -0
  23. data/lib/arel/visitors/sql_server.rb +55 -13
  24. data/lib/arjdbc/db2/adapter.rb +197 -227
  25. data/lib/arjdbc/db2/as400.rb +124 -0
  26. data/lib/arjdbc/db2/connection_methods.rb +20 -1
  27. data/lib/arjdbc/derby/adapter.rb +17 -85
  28. data/lib/arjdbc/derby/connection_methods.rb +2 -1
  29. data/lib/arjdbc/discover.rb +55 -47
  30. data/lib/arjdbc/h2/adapter.rb +52 -18
  31. data/lib/arjdbc/h2/connection_methods.rb +10 -2
  32. data/lib/arjdbc/hsqldb/adapter.rb +33 -9
  33. data/lib/arjdbc/hsqldb/connection_methods.rb +10 -2
  34. data/lib/arjdbc/informix.rb +2 -1
  35. data/lib/arjdbc/jdbc.rb +5 -1
  36. data/lib/arjdbc/jdbc/adapter.rb +167 -89
  37. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  38. data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
  39. data/lib/arjdbc/jdbc/base_ext.rb +25 -3
  40. data/lib/arjdbc/jdbc/callbacks.rb +9 -8
  41. data/lib/arjdbc/jdbc/column.rb +8 -20
  42. data/lib/arjdbc/jdbc/connection.rb +69 -80
  43. data/lib/arjdbc/jdbc/extension.rb +6 -8
  44. data/lib/arjdbc/jdbc/jdbc.rake +3 -141
  45. data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
  46. data/lib/arjdbc/mssql/adapter.rb +108 -34
  47. data/lib/arjdbc/mssql/connection_methods.rb +3 -1
  48. data/lib/arjdbc/mssql/limit_helpers.rb +3 -2
  49. data/lib/arjdbc/mssql/lock_helpers.rb +5 -1
  50. data/lib/arjdbc/mysql/adapter.rb +127 -70
  51. data/lib/arjdbc/mysql/connection_methods.rb +5 -2
  52. data/lib/arjdbc/oracle/adapter.rb +124 -94
  53. data/lib/arjdbc/oracle/connection_methods.rb +2 -1
  54. data/lib/arjdbc/postgresql/adapter.rb +99 -67
  55. data/lib/arjdbc/postgresql/column_cast.rb +3 -5
  56. data/lib/arjdbc/postgresql/connection_methods.rb +6 -6
  57. data/lib/arjdbc/railtie.rb +3 -1
  58. data/lib/arjdbc/sqlite3/adapter.rb +60 -43
  59. data/lib/arjdbc/sqlite3/connection_methods.rb +9 -9
  60. data/lib/arjdbc/sybase.rb +1 -1
  61. data/lib/arjdbc/tasks.rb +13 -0
  62. data/lib/arjdbc/tasks/database_tasks.rb +50 -0
  63. data/lib/arjdbc/tasks/databases.rake +89 -0
  64. data/lib/arjdbc/tasks/databases3.rake +203 -0
  65. data/lib/arjdbc/tasks/databases4.rake +39 -0
  66. data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
  67. data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
  68. data/lib/arjdbc/tasks/h2_database_tasks.rb +29 -0
  69. data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
  70. data/lib/arjdbc/tasks/jdbc_database_tasks.rb +122 -0
  71. data/lib/arjdbc/tasks/mssql_database_tasks.rb +36 -0
  72. data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
  73. data/lib/arjdbc/tasks/oracle_database_tasks.rb +62 -0
  74. data/lib/arjdbc/version.rb +1 -1
  75. data/pom.xml +11 -12
  76. data/rails_generators/jdbc_generator.rb +1 -1
  77. data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
  78. data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
  79. data/rakelib/02-test.rake +42 -15
  80. data/rakelib/compile.rake +29 -2
  81. data/rakelib/db.rake +2 -1
  82. data/rakelib/rails.rake +23 -6
  83. data/src/java/arjdbc/ArJdbcModule.java +175 -0
  84. data/src/java/arjdbc/db2/DB2Module.java +2 -1
  85. data/src/java/arjdbc/derby/DerbyModule.java +5 -24
  86. data/src/java/arjdbc/hsqldb/HSQLDBModule.java +3 -2
  87. data/src/java/arjdbc/jdbc/AdapterJavaService.java +3 -46
  88. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1001 -259
  89. data/src/java/arjdbc/mssql/MSSQLModule.java +2 -1
  90. data/src/java/arjdbc/mysql/MySQLModule.java +4 -3
  91. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +12 -7
  92. data/src/java/arjdbc/oracle/OracleModule.java +2 -1
  93. data/src/java/arjdbc/sqlite3/SQLite3Module.java +2 -1
  94. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +12 -0
  95. data/test/db/db2.rb +14 -7
  96. data/test/db/db2/rake_test.rb +82 -0
  97. data/test/db/db2/rake_test_data.sql +35 -0
  98. data/test/db/db2/simple_test.rb +20 -0
  99. data/test/db/db2/unit_test.rb +3 -1
  100. data/test/db/derby.rb +7 -5
  101. data/test/db/derby/rake_test.rb +96 -0
  102. data/test/db/derby/simple_test.rb +10 -2
  103. data/test/db/h2.rb +6 -8
  104. data/test/db/h2/identity_column_test.rb +35 -0
  105. data/test/db/h2/offset_test.rb +49 -0
  106. data/test/db/h2/rake_test.rb +98 -0
  107. data/test/db/h2/schema_dump_test.rb +5 -1
  108. data/test/db/hsqldb.rb +6 -10
  109. data/test/db/hsqldb/rake_test.rb +101 -0
  110. data/test/db/hsqldb/schema_dump_test.rb +5 -1
  111. data/test/db/hsqldb/simple_test.rb +8 -0
  112. data/test/db/jndi_config.rb +1 -3
  113. data/test/db/jndi_pooled_config.rb +1 -3
  114. data/test/db/mssql/limit_offset_test.rb +23 -14
  115. data/test/db/mssql/rake_test.rb +143 -0
  116. data/test/db/mysql/_rails_test_mysql.32.out +1069 -1252
  117. data/test/db/mysql/nonstandard_primary_key_test.rb +21 -24
  118. data/test/db/mysql/rake_test.rb +97 -0
  119. data/test/db/mysql/schema_dump_test.rb +11 -11
  120. data/test/db/mysql/simple_test.rb +52 -3
  121. data/test/db/mysql/statement_escaping_test.rb +46 -0
  122. data/test/db/oracle/rake_test.rb +100 -0
  123. data/test/db/oracle/simple_test.rb +48 -0
  124. data/test/db/postgres/_rails_test_postgres.32.out +998 -1370
  125. data/test/db/postgres/active_schema_unit_test.rb +68 -0
  126. data/test/db/postgres/connection_test.rb +10 -2
  127. data/test/db/postgres/data_types_test.rb +2 -2
  128. data/test/db/postgres/ltree_test.rb +6 -5
  129. data/test/db/postgres/native_types_test.rb +1 -5
  130. data/test/db/postgres/rake_test.rb +117 -0
  131. data/test/db/postgres/schema_dump_test.rb +9 -2
  132. data/test/db/postgres/schema_test.rb +4 -2
  133. data/test/db/postgres/simple_test.rb +57 -16
  134. data/test/db/sqlite3.rb +3 -10
  135. data/test/db/sqlite3/_rails_test_sqlite3.32.out +1070 -1298
  136. data/test/db/sqlite3/rake_test.rb +71 -0
  137. data/test/db/sqlite3/simple_test.rb +9 -9
  138. data/test/has_many_through.rb +4 -1
  139. data/test/jdbc/db2.rb +14 -1
  140. data/test/jdbc_column_test.rb +23 -0
  141. data/test/{generic_jdbc_connection_test.rb → jdbc_connection_test.rb} +22 -17
  142. data/test/jndi_callbacks_test.rb +26 -28
  143. data/test/jndi_test.rb +7 -16
  144. data/test/models/data_types.rb +2 -1
  145. data/test/models/thing.rb +1 -0
  146. data/test/rails/mysql.rb +13 -0
  147. data/test/rails/sqlite3/version.rb +6 -0
  148. data/test/rails_stub.rb +31 -0
  149. data/test/rake_test_support.rb +298 -0
  150. data/test/serialize.rb +2 -4
  151. data/test/{helper.rb → shared_helper.rb} +0 -0
  152. data/test/simple.rb +167 -93
  153. data/test/test_helper.rb +52 -16
  154. metadata +388 -354
  155. data/lib/pg.rb +0 -26
  156. data/test/abstract_db_create.rb +0 -139
  157. data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -36
  158. data/test/db/mssql/db_create_test.rb +0 -29
  159. data/test/db/mysql/db_create_test.rb +0 -33
  160. data/test/db/postgres/db_create_test.rb +0 -44
  161. data/test/db/postgres/db_drop_test.rb +0 -17
@@ -10,6 +10,6 @@ class JdbcGenerator < Rails::Generator::Base
10
10
 
11
11
  protected
12
12
  def banner
13
- "Usage: #{$0} jdbc\nGenerate JDBC bootstrapping files for your Rails application."
13
+ "Usage: #{$0} jdbc\nGenerate JDBC bootstrapping files for your Rails (2.x) application."
14
14
  end
15
15
  end
@@ -1,7 +1,10 @@
1
- # This file was generated by the "jdbc" generator, which is provided
2
- # by the activerecord-jdbc-adapter gem.
1
+ # This file was generated by the "jdbc" generator, which is provided by the
2
+ # activerecord-jdbc-adapter gem.
3
3
  #
4
- # This file allows the JDBC drivers to be hooked into ActiveRecord
5
- # such that you don't have to change anything else in your Rails
6
- # application.
4
+ # This file allows the JDBC adapters to be hooked into ActiveRecord such that
5
+ # you don't have to change anything else in your Rails application.
6
+ #
7
+ # NOTE: This is only needed on Rails 2.x - without Bundler since when you're
8
+ # using Bundler than `gem 'activerecord-jdbc-adapter'` will automatically
9
+ # `require 'arjdbc'` by default (unless you set it to `require: false`).
7
10
  require 'arjdbc' if defined?(JRUBY_VERSION)
@@ -1,8 +1,11 @@
1
- # This file was generated by the "jdbc" generator, which is provided
2
- # by the activerecord-jdbc-adapter gem.
1
+ # This file was generated by the "jdbc" generator, which is provided by the
2
+ # activerecord-jdbc-adapter gem.
3
3
  #
4
- # This file allows you to use Rails' various db:* tasks with JDBC.
4
+ # This file allows you to use Rails' various db:* tasks with the JDBC adapters.
5
+ #
6
+ # NOTE: Only needed on Rails 2.x and it's fine to delete this file otherwise,
7
+ # since on Rails 3.x AR-JDBC provides a Railtie that loads the Rake tasks.
5
8
  if defined?(JRUBY_VERSION)
6
9
  require 'arjdbc'
7
- require 'arjdbc/jdbc/rake_tasks'
10
+ require 'arjdbc/tasks'
8
11
  end
data/rakelib/02-test.rake CHANGED
@@ -1,4 +1,5 @@
1
- require File.expand_path('../../test/helper', __FILE__)
1
+ require File.expand_path('../../test/shared_helper', __FILE__)
2
+
2
3
  if defined?(JRUBY_VERSION)
3
4
  databases = [ :test_mysql, :test_sqlite3, :test_derby, :test_hsqldb, :test_h2 ]
4
5
  databases << :test_postgres if PostgresHelper.have_postgres?(false)
@@ -20,9 +21,8 @@ def set_compat_version(task)
20
21
  end
21
22
  end
22
23
 
23
- %w(derby h2 hsqldb mysql sqlite3 postgres mssql oracle db2 informix sybase).each do
24
- |adapter|
25
- task "test_#{adapter}_pre" do
24
+ %w(derby h2 hsqldb mysql sqlite3 postgres mssql oracle db2 as400 informix sybase).each do
25
+ |adapter| task "test_#{adapter}_pre" do
26
26
  unless (ENV['BUNDLE_GEMFILE'] rescue '') =~ /gemfiles\/.*?\.gemfile/
27
27
  appraisals = []; Appraisal::File.each { |file| appraisals << file.name }
28
28
  puts "Specify AR version with `rake appraisal:{version} test_#{adapter}'" +
@@ -56,9 +56,7 @@ def declare_test_task_for(adapter, options = {}, &block)
56
56
  end
57
57
  end
58
58
 
59
- declare_test_task_for :derby do |task|
60
- task.test_files << 'test/activerecord/connection_adapters/type_conversion_test.rb'
61
- end
59
+ declare_test_task_for :derby
62
60
  declare_test_task_for :h2
63
61
  declare_test_task_for :hsqldb
64
62
  declare_test_task_for :mssql, :driver => :jtds
@@ -81,16 +79,26 @@ declare_test_task_for :sqlite3
81
79
  end
82
80
  end
83
81
 
84
- Rake::TestTask.new(:test_jdbc) do |t|
85
- t.test_files = FileList['test/generic_jdbc_connection_test.rb']
86
- t.libs << 'test' << 'jdbc-mysql/lib' << 'jdbc-derby/lib'
87
- set_compat_version(t)
82
+ Rake::TestTask.new(:test_as400) do |task|
83
+ test_files = FileList["test/db2*_test.rb"]
84
+ test_files += FileList["test/db/db2/*_test.rb"]
85
+ task.test_files = test_files
86
+ task.libs = []
87
+ task.libs << 'lib' if defined?(JRUBY_VERSION)
88
+ task.libs << 'test'
89
+ set_compat_version(task)
90
+ end
91
+
92
+ Rake::TestTask.new(:test_jdbc) do |task|
93
+ task.test_files = FileList['test/*jdbc_*test.rb']
94
+ task.libs << 'test' << 'jdbc-mysql/lib' << 'jdbc-derby/lib'
95
+ set_compat_version(task)
88
96
  end
89
97
 
90
- Rake::TestTask.new(:test_jndi => 'tomcat-jndi:check') do |t|
91
- t.test_files = FileList['test/jndi_test.rb']
92
- t.libs << 'test' << 'jdbc-derby/lib'
93
- set_compat_version(t)
98
+ Rake::TestTask.new(:test_jndi => 'tomcat-jndi:check') do |task|
99
+ task.test_files = FileList['test/*jndi_*test.rb']
100
+ task.libs << 'test' << 'jdbc-derby/lib'
101
+ set_compat_version(task)
94
102
  end
95
103
 
96
104
  # tests for JDBC adapters that don't require a database :
@@ -113,3 +121,22 @@ Rake::TestTask.new(:test_sybase_jconnect) do |task|
113
121
  task.libs << 'test'
114
122
  set_compat_version(task)
115
123
  end
124
+
125
+ Rake::TraceOutput.module_eval do
126
+
127
+ # NOTE: avoid TypeError: String can't be coerced into Fixnum
128
+ # due this method gettings a strings == [ 1 ] argument ...
129
+ def trace_on(out, *strings)
130
+ sep = $\ || "\n"
131
+ if strings.empty?
132
+ output = sep
133
+ else
134
+ output = strings.map { |s|
135
+ next if s.nil?; s = s.to_s
136
+ s =~ /#{sep}$/ ? s : s + sep
137
+ }.join
138
+ end
139
+ out.print(output)
140
+ end
141
+
142
+ end
data/rakelib/compile.rake CHANGED
@@ -15,7 +15,34 @@ begin
15
15
  :classpath => "${java.class.path}:${sun.boot.class.path}:#{driver_jars.join(':')}",
16
16
  :includeantRuntime => false
17
17
 
18
- ant.jar :basedir => "pkg/classes", :destfile => jar_file, :includes => "**/*.class"
18
+ ant.tstamp do |ts|
19
+ ts.format(:property => 'TODAY', :pattern => 'yyyy-MM-dd HH:mm:ss')
20
+ end
21
+
22
+ require 'arjdbc/version'
23
+ gem_version = Gem::Version.create(ArJdbc::VERSION)
24
+ if gem_version.segments.last == 'DEV'
25
+ version = gem_version.segments[0...-1] # 1.3.0.DEV -> 1.3.0
26
+ else
27
+ version = gem_version.segments.dup
28
+ end
29
+ version = version.join('.')
30
+
31
+ ant.manifest :file => 'MANIFEST.MF' do |mf|
32
+ mf.attribute :name => 'Built-By', :value => '${user.name}'
33
+ mf.attribute :name => 'Built-Time', :value => '${TODAY}'
34
+ mf.attribute :name => 'Built-Jdk', :value => '${java.version}'
35
+ mf.attribute :name => 'Built-JRuby', :value => JRUBY_VERSION
36
+
37
+ mf.attribute :name => 'Specification-Title', :value => 'ActiveRecord-JDBC'
38
+ mf.attribute :name => 'Specification-Version', :value => '1.3'
39
+ mf.attribute :name => 'Specification-Vendor', :value => 'JRuby'
40
+ mf.attribute :name => 'Implementation-Version', :value => version
41
+ mf.attribute :name => 'Implementation-Vendor', :value => 'The JRuby Team'
42
+ end
43
+
44
+ ant.jar :basedir => "pkg/classes", :includes => "**/*.class",
45
+ :destfile => jar_file, :manifest => 'MANIFEST.MF'
19
46
  end
20
47
 
21
48
  desc "Compile the native Java code."
@@ -23,7 +50,7 @@ begin
23
50
 
24
51
  namespace :jar do
25
52
  task :force do
26
- rm jar_file
53
+ rm jar_file if File.exist?(jar_file)
27
54
  Rake::Task['jar'].invoke
28
55
  end
29
56
  end
data/rakelib/db.rake CHANGED
@@ -1,4 +1,5 @@
1
- require File.expand_path '../../test/helper', __FILE__
1
+ require File.expand_path('../../test/shared_helper', __FILE__)
2
+
2
3
  namespace :db do
3
4
  desc "Creates the test database for MySQL."
4
5
  task :mysql do
data/rakelib/rails.rake CHANGED
@@ -8,17 +8,23 @@ namespace :rails do
8
8
 
9
9
  ar_jdbc_dir = File.expand_path('..', File.dirname(__FILE__))
10
10
 
11
- rubylib = [
11
+ ruby_lib = [
12
12
  "#{ar_jdbc_dir}/lib",
13
+ "#{ar_jdbc_dir}/test/rails",
13
14
  "#{ar_jdbc_dir}/jdbc-#{_driver(driver)}/lib",
14
15
  "#{ar_jdbc_dir}/activerecord-jdbc#{_adapter(driver)}-adapter/lib"
15
16
  ]
16
- rubylib << File.expand_path('activesupport/lib', rails_dir)
17
- rubylib << File.expand_path('activemodel/lib', rails_dir)
18
- rubylib << File.expand_path(File.join(activerecord_dir, 'lib'))
19
- #rubylib << File.expand_path('actionpack/lib', rails_dir)
17
+ ruby_lib << File.expand_path('activesupport/lib', rails_dir)
18
+ ruby_lib << File.expand_path('activemodel/lib', rails_dir)
19
+ ruby_lib << File.expand_path(File.join(activerecord_dir, 'lib'))
20
+ requires = _requires(driver) || []
20
21
 
21
- Dir.chdir(activerecord_dir) { rake "RUBYLIB=#{rubylib.join(':')}", "#{_target(driver)}" }
22
+ Dir.chdir(activerecord_dir) do
23
+ ruby = FileUtils::RUBY
24
+ rubylib = ruby_lib.join(':') # i_lib = "-I#{rubylib}"
25
+ r_requires = requires.map { |feat| "-r#{feat}" }.join(' ')
26
+ sh "#{ruby} -S rake RUBYLIB=#{rubylib} RUBYOPT=\"#{r_requires}\" #{_target(driver)}"
27
+ end
22
28
  end
23
29
 
24
30
  %w(MySQL SQLite3 Postgres).each do |adapter|
@@ -56,5 +62,16 @@ namespace :rails do
56
62
  "test_jdbc#{name.downcase}"
57
63
  end
58
64
  end
65
+
66
+ def _requires(name)
67
+ requires = []
68
+ requires << 'ubygems'
69
+ requires << 'active_support/json' # avoid uninitialized constant BasicsTest::JSON
70
+ case name
71
+ when /mysql/i
72
+ requires << 'mysql' # -rmysql - so Rails tests do not complain about Mysql
73
+ end
74
+ requires
75
+ end
59
76
 
60
77
  end
@@ -0,0 +1,175 @@
1
+ /*
2
+ * The MIT License
3
+ *
4
+ * Copyright 2013 Karol Bucek.
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in
14
+ * all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ * THE SOFTWARE.
23
+ */
24
+ package arjdbc;
25
+
26
+ import arjdbc.jdbc.RubyJdbcConnection;
27
+
28
+ import java.lang.reflect.InvocationTargetException;
29
+ import java.util.Collection;
30
+
31
+ import org.jruby.NativeException;
32
+ import org.jruby.Ruby;
33
+ import org.jruby.RubyArray;
34
+ import org.jruby.RubyClass;
35
+ import org.jruby.RubyModule;
36
+ import org.jruby.anno.JRubyMethod;
37
+ import org.jruby.exceptions.RaiseException;
38
+ import org.jruby.runtime.ThreadContext;
39
+ import org.jruby.runtime.builtin.IRubyObject;
40
+
41
+ /**
42
+ * ::ArJdbc
43
+ *
44
+ * @author kares
45
+ */
46
+ public class ArJdbcModule {
47
+
48
+ public static RubyModule load(final Ruby runtime) {
49
+ final RubyModule arJdbc = runtime.getOrCreateModule("ArJdbc");
50
+ arJdbc.defineAnnotatedMethods( ArJdbcModule.class );
51
+ return arJdbc;
52
+ }
53
+
54
+ /**
55
+ * Load the Java parts for the given adapter spec module, e.g. to load
56
+ * ArJdbc::MySQL's Java part: <code>ArJdbc.load_java_part :MySQL</code>
57
+ *
58
+ * NOTE: this method is not intended to be called twice for a given adapter !
59
+ * @param context
60
+ * @param self
61
+ * @param args ( moduleName, [ connectionClass, moduleClass ] )
62
+ * @return true
63
+ */
64
+ @JRubyMethod(name = "load_java_part", meta = true, required = 1, optional = 2)
65
+ public static IRubyObject load_java_part(final ThreadContext context,
66
+ final IRubyObject self, final IRubyObject[] args) {
67
+
68
+ String connectionClass = args.length > 1 ? args[1].toString() : null;
69
+ String moduleClass = args.length > 2 ? args[2].toString() : null;
70
+
71
+ final String moduleName = args[0].toString(); // e.g. 'MySQL'
72
+ final String packagePrefix = "arjdbc." + moduleName.toLowerCase() + "."; // arjdbc.mysql
73
+
74
+ // NOTE: due previous (backwards compatible) conventions there are
75
+ // 2 things we load, the adapter spec module's Java implemented methods
76
+ // and a custom JdbcConnection class (both are actually optional) e.g. :
77
+ //
78
+ // MySQLModule.load(RubyModule); // 'arjdbc.mysql' package is assumed
79
+ // MySQLRubyJdbcConnection.createMySQLJdbcConnectionClass(Ruby, RubyClass);
80
+ //
81
+
82
+ String connectionClass2 = null;
83
+ if (connectionClass == null) {
84
+ // 'arjdbc.mysql.' + 'MySQL' + 'RubyJdbcConnection'
85
+ connectionClass = packagePrefix + moduleName + "RubyJdbcConnection";
86
+ connectionClass2 = packagePrefix + moduleName + "JdbcConnection";
87
+ }
88
+ if (moduleClass == null) {
89
+ // 'arjdbc.mysql.' + 'MySQL' + 'Module'
90
+ moduleClass = packagePrefix + moduleName + "Module";
91
+ }
92
+
93
+ final Ruby runtime = context.getRuntime();
94
+ final RubyModule arJdbc = runtime.getModule("ArJdbc");
95
+
96
+ try {
97
+ final Class<?> module = Class.forName(moduleClass);
98
+ // MySQLModule.load( arJdbc ) :
99
+ module.getMethod("load", RubyModule.class).invoke(null, arJdbc);
100
+ }
101
+ catch (ClassNotFoundException e) { /* ignored */ }
102
+ catch (NoSuchMethodException e) {
103
+ throw newNativeException(runtime, e);
104
+ }
105
+ catch (IllegalAccessException e) {
106
+ throw newNativeException(runtime, e);
107
+ }
108
+ catch (InvocationTargetException e) {
109
+ throw newNativeException(runtime, e);
110
+ }
111
+
112
+ try {
113
+ Class<?> connection = null;
114
+ try {
115
+ connection = Class.forName(connectionClass);
116
+ }
117
+ catch (ClassNotFoundException e) {
118
+ if ( connectionClass2 != null ) {
119
+ connection = Class.forName(connectionClass2);
120
+ }
121
+ }
122
+ if ( connection != null ) {
123
+ final String method = "create" + moduleName + "JdbcConnectionClass";
124
+ // MySQLRubyJdbcConnection.createMySQLJdbcConnectionClass(runtime, jdbcConnection)
125
+ connection.getMethod(method, Ruby.class, RubyClass.class).
126
+ invoke(null, runtime, RubyJdbcConnection.getJdbcConnectionClass(runtime));
127
+ }
128
+ }
129
+ catch (ClassNotFoundException e) { /* ignored */ }
130
+ catch (NoSuchMethodException e) {
131
+ throw newNativeException(runtime, e);
132
+ }
133
+ catch (IllegalAccessException e) {
134
+ throw newNativeException(runtime, e);
135
+ }
136
+ catch (InvocationTargetException e) {
137
+ throw newNativeException(runtime, e);
138
+ }
139
+
140
+ return runtime.getTrue();
141
+ }
142
+
143
+ /**
144
+ * <code>ArJdbc.modules</code>
145
+ * @param context
146
+ * @param self
147
+ * @return nested constant values that are modules
148
+ */
149
+ @JRubyMethod(name = "modules", meta = true)
150
+ public static IRubyObject modules(final ThreadContext context, final IRubyObject self) {
151
+ final Ruby runtime = context.getRuntime();
152
+ final RubyModule arJdbc = (RubyModule) self;
153
+
154
+ final Collection<String> constants = arJdbc.getConstantNames();
155
+ final RubyArray modules = runtime.newArray( constants.size() );
156
+
157
+ for ( final String name : constants ) {
158
+ IRubyObject value = arJdbc.getConstant(name, false);
159
+ // isModule: return false for Ruby Classes
160
+ if ( value != null && value.isModule() ) {
161
+ if ( "MissingFunctionalityHelper".equals(name) ) continue;
162
+ if ( "Version".equals(name) ) continue;
163
+ modules.append(value);
164
+ }
165
+ }
166
+ return modules;
167
+ }
168
+
169
+ private static RaiseException newNativeException(final Ruby runtime, final Throwable cause) {
170
+ RubyClass nativeClass = runtime.getClass(NativeException.CLASS_NAME);
171
+ NativeException nativeException = new NativeException(runtime, nativeClass, cause);
172
+ throw new RaiseException(cause, nativeException);
173
+ }
174
+
175
+ }
@@ -40,9 +40,10 @@ import org.jruby.runtime.builtin.IRubyObject;
40
40
  */
41
41
  public class DB2Module {
42
42
 
43
- public static void load(final RubyModule arJdbc) {
43
+ public static RubyModule load(final RubyModule arJdbc) {
44
44
  RubyModule db2 = arJdbc.defineModuleUnder("DB2");
45
45
  db2.defineAnnotatedMethods( DB2Module.class );
46
+ return db2;
46
47
  }
47
48
 
48
49
  @JRubyMethod(name = "quote_string", required = 1, frame = false)
@@ -45,14 +45,14 @@ import org.jruby.util.ByteList;
45
45
 
46
46
  public class DerbyModule {
47
47
 
48
- private static RubyObjectAdapter rubyApi;
48
+ static final RubyObjectAdapter rubyApi = JavaEmbedUtils.newObjectAdapter();
49
49
 
50
- public static void load(final RubyModule arJdbc) {
50
+ public static RubyModule load(final RubyModule arJdbc) {
51
51
  RubyModule derby = arJdbc.defineModuleUnder("Derby");
52
- derby.defineAnnotatedMethods(DerbyModule.class);
52
+ derby.defineAnnotatedMethods( DerbyModule.class );
53
53
  RubyModule column = derby.defineModuleUnder("Column");
54
54
  column.defineAnnotatedMethods(Column.class);
55
- rubyApi = JavaEmbedUtils.newObjectAdapter();
55
+ return derby;
56
56
  }
57
57
 
58
58
  public static class Column {
@@ -306,29 +306,10 @@ public class DerbyModule {
306
306
  final IRubyObject self) {
307
307
  return RubyString.newString(context.getRuntime(), BYTES_0);
308
308
  }
309
-
310
- @JRubyMethod(name = "select_all", rest = true)
311
- public static IRubyObject select_all(IRubyObject recv, IRubyObject[] args) {
312
- return rubyApi.callMethod(recv, "execute", args);
313
- }
314
-
315
- @JRubyMethod(name = "select_one", rest = true)
316
- public static IRubyObject select_one(IRubyObject recv, IRubyObject[] args) {
317
- IRubyObject limit = rubyApi.getInstanceVariable(recv, "@limit");
318
- if (limit == null || limit.isNil()) {
319
- rubyApi.setInstanceVariable(recv, "@limit", recv.getRuntime().newFixnum(1));
320
- }
321
- try {
322
- IRubyObject result = rubyApi.callMethod(recv, "execute", args);
323
- return rubyApi.callMethod(result, "first");
324
- } finally {
325
- rubyApi.setInstanceVariable(recv, "@limit", recv.getRuntime().getNil());
326
- }
327
- }
328
309
 
329
310
  @JRubyMethod(name = "_execute", required = 1, optional = 1)
330
311
  public static IRubyObject _execute(final ThreadContext context, final IRubyObject self, final IRubyObject[] args)
331
- throws SQLException, java.io.IOException {
312
+ throws SQLException {
332
313
  final IRubyObject sql = args[0];
333
314
 
334
315
  String sqlStr = sql.toString().trim();