activerecord-jdbc-adapter 0.9.1 → 0.9.2

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 (52) hide show
  1. data/History.txt +33 -0
  2. data/Manifest.txt +17 -0
  3. data/README.txt +48 -20
  4. data/Rakefile +2 -169
  5. data/lib/active_record/connection_adapters/jdbc_adapter.rb +11 -5
  6. data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +12 -0
  7. data/lib/jdbc_adapter.rb +1 -1
  8. data/lib/jdbc_adapter/jdbc.rake +43 -30
  9. data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
  10. data/lib/jdbc_adapter/jdbc_db2.rb +2 -2
  11. data/lib/jdbc_adapter/jdbc_derby.rb +11 -0
  12. data/lib/jdbc_adapter/jdbc_hsqldb.rb +6 -1
  13. data/lib/jdbc_adapter/jdbc_mimer.rb +14 -7
  14. data/lib/jdbc_adapter/jdbc_mssql.rb +18 -2
  15. data/lib/jdbc_adapter/jdbc_mysql.rb +3 -0
  16. data/lib/jdbc_adapter/jdbc_oracle.rb +24 -14
  17. data/lib/jdbc_adapter/jdbc_postgre.rb +38 -18
  18. data/lib/jdbc_adapter/jdbc_sqlite3.rb +96 -26
  19. data/lib/jdbc_adapter/missing_functionality_helper.rb +40 -34
  20. data/lib/jdbc_adapter/rake_tasks.rb +1 -1
  21. data/lib/jdbc_adapter/tsql_helper.rb +1 -0
  22. data/lib/jdbc_adapter/version.rb +1 -1
  23. data/lib/pg.rb +4 -0
  24. data/rails_generators/jdbc_generator.rb +15 -0
  25. data/rails_generators/templates/jdbc.rake +8 -0
  26. data/rails_generators/templates/jdbc.rb +7 -0
  27. data/rakelib/compile.rake +23 -0
  28. data/rakelib/package.rake +85 -0
  29. data/rakelib/rails.rake +41 -0
  30. data/rakelib/test.rake +71 -0
  31. data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +1 -0
  32. data/src/java/jdbc_adapter/JdbcDerbySpec.java +11 -46
  33. data/src/java/jdbc_adapter/JdbcMySQLSpec.java +3 -2
  34. data/src/java/jdbc_adapter/MssqlRubyJdbcConnection.java +71 -0
  35. data/src/java/jdbc_adapter/PostgresRubyJdbcConnection.java +24 -4
  36. data/src/java/jdbc_adapter/RubyJdbcConnection.java +57 -44
  37. data/test/abstract_db_create.rb +45 -0
  38. data/test/db/mysql.rb +2 -2
  39. data/test/db/postgres.rb +2 -2
  40. data/test/helper.rb +5 -0
  41. data/test/jdbc_adapter/jdbc_db2_test.rb +5 -0
  42. data/test/jdbc_common.rb +2 -0
  43. data/test/models/entry.rb +3 -0
  44. data/test/models/validates_uniqueness_of_string.rb +19 -0
  45. data/test/mysql_db_create_test.rb +25 -0
  46. data/test/mysql_nonstandard_primary_key_test.rb +42 -0
  47. data/test/mysql_simple_test.rb +5 -0
  48. data/test/postgres_db_create_test.rb +21 -0
  49. data/test/postgres_nonseq_pkey_test.rb +40 -0
  50. data/test/simple.rb +62 -1
  51. data/test/sqlite3_simple_test.rb +153 -10
  52. metadata +26 -5
@@ -8,7 +8,10 @@ module JdbcSpec
8
8
  caller = lambda {|definition| yield definition if block_given?}
9
9
 
10
10
  transaction do
11
- move_table(table_name, altered_table_name, options)
11
+ # A temporary table might improve performance here, but
12
+ # it doesn't seem to maintain indices across the whole move.
13
+ move_table(table_name, altered_table_name,
14
+ options)
12
15
  move_table(altered_table_name, table_name, &caller)
13
16
  end
14
17
  end
@@ -19,28 +22,30 @@ module JdbcSpec
19
22
  end
20
23
 
21
24
  def copy_table(from, to, options = {}) #:nodoc:
22
- create_table(to, options) do |@definition|
25
+ options = options.merge(:id => (!columns(from).detect{|c| c.name == 'id'}.nil? && 'id' == primary_key(from).to_s))
26
+ create_table(to, options) do |definition|
27
+ @definition = definition
23
28
  columns(from).each do |column|
24
29
  column_name = options[:rename] ?
25
- (options[:rename][column.name] ||
26
- options[:rename][column.name.to_sym] ||
27
- column.name) : column.name
28
- column_name = column_name.to_s
29
- @definition.column(column_name, column.type,
30
- :limit => column.limit, :default => column.default,
31
- :null => column.null)
30
+ (options[:rename][column.name] ||
31
+ options[:rename][column.name.to_sym] ||
32
+ column.name) : column.name
33
+
34
+ @definition.column(column_name, column.type,
35
+ :limit => column.limit, :default => column.default,
36
+ :null => column.null)
32
37
  end
33
- @definition.primary_key(primary_key(from))
38
+ @definition.primary_key(primary_key(from)) if primary_key(from)
34
39
  yield @definition if block_given?
35
40
  end
36
-
37
- copy_table_indexes(from, to, options)
38
- copy_table_contents(from, to,
39
- @definition.columns,
40
- options[:rename] || {})
41
+
42
+ copy_table_indexes(from, to, options[:rename] || {})
43
+ copy_table_contents(from, to,
44
+ @definition.columns.map {|column| column.name},
45
+ options[:rename] || {})
41
46
  end
42
47
 
43
- def copy_table_indexes(from, to, options={}) #:nodoc:
48
+ def copy_table_indexes(from, to, rename = {}) #:nodoc:
44
49
  indexes(from).each do |index|
45
50
  name = index.name.downcase
46
51
  if to == "altered_#{from}"
@@ -48,31 +53,32 @@ module JdbcSpec
48
53
  elsif from == "altered_#{to}"
49
54
  name = name[5..-1]
50
55
  end
51
-
52
- # index name can't be the same
53
- opts = { :name => name.gsub(/_(#{from})_/, "_#{to}_") }
54
- opts[:unique] = true if index.unique
55
- if options[:rename]
56
- new_columns = index.columns.map {|column_name|
57
- (options[:rename][column_name] ||
58
- options[:rename][column_name.to_sym] ||
59
- column_name)
60
- }
61
- else
62
- new_columns = index.columns
56
+
57
+ to_column_names = columns(to).map(&:name)
58
+ columns = index.columns.map {|c| rename[c] || c }.select do |column|
59
+ to_column_names.include?(column)
60
+ end
61
+
62
+ unless columns.empty?
63
+ # index name can't be the same
64
+ opts = { :name => name.gsub(/(_?)(#{from})_/, "\\1#{to}_") }
65
+ opts[:unique] = true if index.unique
66
+ add_index(to, columns, opts)
63
67
  end
64
- add_index(to, new_columns, opts)
65
68
  end
66
69
  end
67
70
 
68
71
  def copy_table_contents(from, to, columns, rename = {}) #:nodoc:
69
- column_mappings = Hash[*columns.map {|col| [col.name, col.name]}.flatten]
72
+ column_mappings = Hash[*columns.map {|name| [name, name]}.flatten]
70
73
  rename.inject(column_mappings) {|map, a| map[a.last] = a.first; map}
71
74
  from_columns = columns(from).collect {|col| col.name}
72
- columns = columns.find_all{|col| from_columns.include?(column_mappings[col.name])}
73
- execute("SELECT * FROM #{from}").each do |row|
74
- sql = "INSERT INTO #{to} ("+columns.map(&:name)*','+") VALUES ("
75
- sql << columns.map {|col| quote(row[column_mappings[col.name]],col)} * ', '
75
+ columns = columns.find_all{|col| from_columns.include?(column_mappings[col])}
76
+ quoted_columns = columns.map { |col| quote_column_name(col) } * ','
77
+
78
+ quoted_to = quote_table_name(to)
79
+ execute("SELECT * FROM #{quote_table_name(from)}").each do |row|
80
+ sql = "INSERT INTO #{quoted_to} (#{quoted_columns}) VALUES ("
81
+ sql << columns.map {|col| quote row[column_mappings[col]]} * ', '
76
82
  sql << ')'
77
83
  execute sql
78
84
  end
@@ -1,6 +1,6 @@
1
1
  if defined?(Rake.application) && Rake.application && ENV["SKIP_AR_JDBC_RAKE_REDEFINES"].nil?
2
2
  jdbc_rakefile = File.dirname(__FILE__) + "/jdbc.rake"
3
- if Rake.application.lookup("environment")
3
+ if Rake.application.lookup("db:create")
4
4
  # rails tasks already defined; load the override tasks now
5
5
  load jdbc_rakefile
6
6
  else
@@ -10,6 +10,7 @@ module TSqlMethods
10
10
  end
11
11
 
12
12
  def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
13
+ return 'uniqueidentifier' if (type.to_s == 'uniqueidentifier')
13
14
  return super unless type.to_s == 'integer'
14
15
 
15
16
  if limit.nil? || limit == 4
@@ -1,5 +1,5 @@
1
1
  module JdbcAdapter
2
2
  module Version
3
- VERSION = "0.9.1"
3
+ VERSION = "0.9.2"
4
4
  end
5
5
  end
data/lib/pg.rb ADDED
@@ -0,0 +1,4 @@
1
+ # Stub library for postgresql -- allows Rails to load
2
+ # postgresql_adapter without error Other than postgres-pr, there's no
3
+ # other way to use PostgreSQL on JRuby anyway, right? If you've
4
+ # installed ar-jdbc you probably want to use that to connect to pg.
@@ -0,0 +1,15 @@
1
+ class JdbcGenerator < Rails::Generator::Base
2
+ def manifest
3
+ record do |m|
4
+ m.directory 'config/initializers'
5
+ m.template 'jdbc.rb', File.join('config', 'initializers', 'jdbc.rb')
6
+ m.directory 'lib/tasks'
7
+ m.template 'jdbc.rake', File.join('lib', 'tasks', 'jdbc.rake')
8
+ end
9
+ end
10
+
11
+ protected
12
+ def banner
13
+ "Usage: #{$0} jdbc\nGenerate JDBC bootstrapping files for your Rails application."
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ # This file was generated by the "jdbc" generator, which is provided
2
+ # by the activerecord-jdbc-adapter gem.
3
+ #
4
+ # This file allows you to use Rails' various db:* tasks with JDBC.
5
+ if defined?(JRUBY_VERSION)
6
+ require 'jdbc_adapter'
7
+ require 'jdbc_adapter/rake_tasks'
8
+ end
@@ -0,0 +1,7 @@
1
+ # This file was generated by the "jdbc" generator, which is provided
2
+ # by the activerecord-jdbc-adapter gem.
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.
7
+ require 'jdbc_adapter' if defined?(JRUBY_VERSION)
@@ -0,0 +1,23 @@
1
+ def java_classpath_arg # myriad of ways to discover JRuby classpath
2
+ begin
3
+ cpath = Java::java.lang.System.getProperty('java.class.path').split(File::PATH_SEPARATOR)
4
+ cpath += Java::java.lang.System.getProperty('sun.boot.class.path').split(File::PATH_SEPARATOR)
5
+ jruby_cpath = cpath.compact.join(File::PATH_SEPARATOR)
6
+ rescue => e
7
+ end
8
+ unless jruby_cpath
9
+ jruby_cpath = ENV['JRUBY_PARENT_CLASSPATH'] || ENV['JRUBY_HOME'] &&
10
+ FileList["#{ENV['JRUBY_HOME']}/lib/*.jar"].join(File::PATH_SEPARATOR)
11
+ end
12
+ jruby_cpath ? "-cp \"#{jruby_cpath}\"" : ""
13
+ end
14
+
15
+ desc "Compile the native Java code."
16
+ task :java_compile do
17
+ pkg_classes = File.join(*%w(pkg classes))
18
+ jar_name = File.join(*%w(lib jdbc_adapter jdbc_adapter_internal.jar))
19
+ mkdir_p pkg_classes
20
+ sh "javac -target 1.5 -source 1.5 -d pkg/classes #{java_classpath_arg} #{FileList['src/java/**/*.java'].join(' ')}"
21
+ sh "jar cf #{jar_name} -C #{pkg_classes} ."
22
+ end
23
+ file "lib/jdbc_adapter/jdbc_adapter_internal.jar" => :java_compile
@@ -0,0 +1,85 @@
1
+ MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt",
2
+ "Rakefile", "LICENSE.txt", "lib/**/*.rb", "lib/jdbc_adapter/jdbc_adapter_internal.jar", "test/**/*.rb",
3
+ "lib/**/*.rake", "src/**/*.java", "rakelib/*.rake", "rails_generators/**/*"]
4
+
5
+ file "Manifest.txt" => :manifest
6
+ task :manifest do
7
+ File.open("Manifest.txt", "w") {|f| MANIFEST.each {|n| f << "#{n}\n"} }
8
+ end
9
+ Rake::Task['manifest'].invoke # Always regen manifest, so Hoe has up-to-date list of files
10
+
11
+ require File.dirname(__FILE__) + "/../lib/jdbc_adapter/version"
12
+ begin
13
+ require 'hoe'
14
+ hoe = Hoe.spec("activerecord-jdbc-adapter") do |p|
15
+ p.version = JdbcAdapter::Version::VERSION
16
+ p.rubyforge_name = "jruby-extras"
17
+ p.url = "http://jruby-extras.rubyforge.org/activerecord-jdbc-adapter"
18
+ p.author = "Nick Sieger, Ola Bini and JRuby contributors"
19
+ p.email = "nick@nicksieger.com, ola.bini@gmail.com"
20
+ p.summary = "JDBC adapter for ActiveRecord, for use within JRuby on Rails."
21
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
22
+ p.description = p.paragraphs_of('README.txt', 0...1).join("\n\n")
23
+ end
24
+ hoe.spec.files = MANIFEST
25
+ hoe.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
26
+
27
+ rescue LoadError => le
28
+ puts le.to_s, *le.backtrace
29
+ puts "Problem loading Hoe; please check the error above to ensure that Hoe is installed correctly"
30
+ rescue => e
31
+ puts "ignoring error while loading Hoe: #{e.to_s}"
32
+ end
33
+
34
+ def rake(*args)
35
+ ruby "-S", "rake", *args
36
+ end
37
+
38
+ %w(test package install_gem release clean).each do |task|
39
+ desc "Run rake #{task} on all available adapters and drivers"
40
+ task "all:#{task}" => task
41
+ end
42
+
43
+ (Dir["drivers/*/Rakefile"] + Dir["adapters/*/Rakefile"]).each do |rakefile|
44
+ dir = File.dirname(rakefile)
45
+ prefix = dir.sub(%r{/}, ':')
46
+ tasks = %w(package install_gem debug_gem clean)
47
+ tasks << "test" if File.directory?(File.join(dir, "test"))
48
+ tasks.each do |task|
49
+ desc "Run rake #{task} on #{dir}"
50
+ task "#{prefix}:#{task}" do
51
+ Dir.chdir(dir) do
52
+ rake task
53
+ end
54
+ end
55
+
56
+ task "#{File.dirname(dir)}:#{task}" => "#{prefix}:#{task}"
57
+ task "all:#{task}" => "#{prefix}:#{task}"
58
+ end
59
+
60
+ # Copy all generated gems to the top-level pkg directory for convenience
61
+ task "#{prefix}:package" do
62
+ FileList["#{dir}/pkg/*.gem"].each {|gem| cp gem, "pkg"}
63
+ end
64
+
65
+ desc "Run rake release on #{dir}"
66
+ task "#{prefix}:release" do
67
+ Dir.chdir(dir) do
68
+ version = nil
69
+ if dir =~ /adapters/
70
+ version = ENV['VERSION']
71
+ else
72
+ Dir["lib/**/*.rb"].each do |file|
73
+ version ||= File.open(file) {|f| f.read =~ /VERSION = "([^"]+)"/ && $1}
74
+ end
75
+ end
76
+ rake "release", "VERSION=#{version}"
77
+ end
78
+ end
79
+ # Only release adapters synchronously with main release. Drivers are versioned
80
+ # according to their JDBC driver versions.
81
+ if dir =~ /adapters/
82
+ task "adapters:release" => "#{prefix}:release"
83
+ task "all:release" => "#{prefix}:release"
84
+ end
85
+ end
@@ -0,0 +1,41 @@
1
+ namespace :rails do
2
+ def _adapter(n)
3
+ case n
4
+ when /postgres/
5
+ 'postgresql'
6
+ else
7
+ n
8
+ end
9
+ end
10
+
11
+ def _driver(n)
12
+ case n
13
+ when /postgres/
14
+ 'postgres'
15
+ else
16
+ n
17
+ end
18
+ end
19
+
20
+ def _target(n)
21
+ case n
22
+ when /postgres/
23
+ 'test_jdbcpostgresql'
24
+ else
25
+ "test_jdbc#{n}"
26
+ end
27
+ end
28
+
29
+ task :test => "java_compile" do
30
+ driver = ENV['DRIVER']
31
+ raise "need a DRIVER" unless driver
32
+ activerecord = ENV['RAILS']
33
+ raise "need location of RAILS source code" unless activerecord
34
+ activerecord = File.join(activerecord, 'activerecord') unless activerecord =~ /activerecord$/
35
+ ar_jdbc = File.expand_path(File.dirname(__FILE__) + '/..')
36
+ rubylib = "#{ar_jdbc}/lib:#{ar_jdbc}/drivers/#{_driver(driver)}/lib:#{ar_jdbc}/adapters/#{_adapter(driver)}/lib"
37
+ Dir.chdir(activerecord) do
38
+ rake "RUBYLIB=#{rubylib}", "#{_target(driver)}"
39
+ end
40
+ end
41
+ end
data/rakelib/test.rake ADDED
@@ -0,0 +1,71 @@
1
+ require File.dirname(__FILE__) + '/../test/helper'
2
+ if defined?(JRUBY_VERSION)
3
+ databases = [:test_mysql, :test_jdbc, :test_derby, :test_hsqldb, :test_h2, :test_sqlite3]
4
+ if find_executable?("psql") && `psql -c '\\l'` && $?.exitstatus == 0
5
+ databases << :test_postgres
6
+ end
7
+ task :test => databases
8
+ else
9
+ task :test => [:test_mysql]
10
+ end
11
+
12
+ FileList['drivers/*'].each do |d|
13
+ next unless File.directory?(d)
14
+ driver = File.basename(d)
15
+ Rake::TestTask.new("test_#{driver}") do |t|
16
+ files = FileList["test/#{driver}*test.rb"]
17
+ if driver == "derby"
18
+ files << 'test/activerecord/connection_adapters/type_conversion_test.rb'
19
+ end
20
+ t.test_files = files
21
+ t.libs = []
22
+ if defined?(JRUBY_VERSION)
23
+ t.ruby_opts << "-rjdbc/#{driver}"
24
+ t.libs << "lib" << "#{d}/lib"
25
+ t.libs.push *FileList["adapters/#{driver}*/lib"]
26
+ end
27
+ t.libs << "test"
28
+ t.verbose = true
29
+ end
30
+ end
31
+
32
+ Rake::TestTask.new(:test_jdbc) do |t|
33
+ t.test_files = FileList['test/generic_jdbc_connection_test.rb', 'test/jndi_callbacks_test.rb']
34
+ t.libs << 'test' << 'drivers/mysql/lib'
35
+ end
36
+
37
+ Rake::TestTask.new(:test_jndi) do |t|
38
+ t.test_files = FileList['test/jndi_test.rb']
39
+ t.libs << 'test' << 'drivers/derby/lib'
40
+ end
41
+
42
+ task :test_postgresql => [:test_postgres]
43
+ task :test_pgsql => [:test_postgres]
44
+
45
+ # Ensure driver for these DBs is on your classpath
46
+ %w(oracle db2 cachedb mssql informix).each do |d|
47
+ Rake::TestTask.new("test_#{d}") do |t|
48
+ t.test_files = FileList["test/#{d}_simple_test.rb"]
49
+ t.libs = []
50
+ t.libs << 'lib' if defined?(JRUBY_VERSION)
51
+ t.libs << 'test'
52
+ end
53
+ end
54
+
55
+ # Tests for JDBC adapters that don't require a database.
56
+ Rake::TestTask.new(:test_jdbc_adapters) do | t |
57
+ t.test_files = FileList[ 'test/jdbc_adapter/jdbc_sybase_test.rb' ]
58
+ t.libs << 'test'
59
+ end
60
+
61
+ # Ensure that the jTDS driver is in your classpath before launching rake
62
+ Rake::TestTask.new(:test_sybase_jtds) do |t|
63
+ t.test_files = FileList['test/sybase_jtds_simple_test.rb']
64
+ t.libs << 'test'
65
+ end
66
+
67
+ # Ensure that the jConnect driver is in your classpath before launching rake
68
+ Rake::TestTask.new(:test_sybase_jconnect) do |t|
69
+ t.test_files = FileList['test/sybase_jconnect_simple_test.rb']
70
+ t.libs << 'test'
71
+ end
@@ -41,6 +41,7 @@ public class JdbcAdapterInternalService implements BasicLibraryService {
41
41
  public boolean basicLoad(final Ruby runtime) throws IOException {
42
42
  RubyClass jdbcConnection = RubyJdbcConnection.createJdbcConnectionClass(runtime);
43
43
  PostgresRubyJdbcConnection.createPostgresJdbcConnectionClass(runtime, jdbcConnection);
44
+ MssqlRubyJdbcConnection.createMssqlJdbcConnectionClass(runtime, jdbcConnection);
44
45
  Sqlite3RubyJdbcConnection.createSqlite3JdbcConnectionClass(runtime, jdbcConnection);
45
46
  RubyModule jdbcSpec = runtime.getOrCreateModule("JdbcSpec");
46
47
 
@@ -274,55 +274,20 @@ public class JdbcDerbySpec {
274
274
  }
275
275
  }
276
276
 
277
- @JRubyMethod(name = "add_limit_offset!", required = 2)
278
- public static IRubyObject add_limit_offset(IRubyObject recv, IRubyObject sql, IRubyObject options) {
279
- IRubyObject limit = rubyApi.callMethod(options, "[]", recv.getRuntime().newSymbol("limit"));
280
- rubyApi.setInstanceVariable(recv, "@limit",limit);
281
- IRubyObject offset = rubyApi.callMethod(options, "[]", recv.getRuntime().newSymbol("offset"));
282
- return rubyApi.setInstanceVariable(recv, "@offset",offset);
283
- }
284
-
285
277
  @JRubyMethod(name = "_execute", required = 1, optional = 1)
286
278
  public static IRubyObject _execute(ThreadContext context, IRubyObject recv, IRubyObject[] args) throws SQLException, java.io.IOException {
287
279
  Ruby runtime = recv.getRuntime();
288
- try {
289
- // TODO: Ouch....this looks fragile
290
- RubyJdbcConnection conn = (RubyJdbcConnection) rubyApi.getInstanceVariable(recv, "@connection");
291
- String sql = args[0].toString().trim().toLowerCase();
292
- if (sql.charAt(0) == '(') {
293
- sql = sql.substring(1).trim();
294
- }
295
- if (sql.startsWith("insert")) {
296
- return conn.execute_insert(context, args[0]);
297
- } else if (sql.startsWith("select") || sql.startsWith("show")) {
298
- IRubyObject offset = rubyApi.getInstanceVariable(recv, "@offset");
299
- if(offset == null || offset.isNil()) {
300
- offset = RubyFixnum.zero(runtime);
301
- }
302
- IRubyObject limit = rubyApi.getInstanceVariable(recv, "@limit");
303
- IRubyObject range;
304
- IRubyObject max;
305
- if (limit == null || limit.isNil() || RubyNumeric.fix2int(limit) == -1) {
306
- range = RubyRange.newRange(runtime, context, offset, runtime.newFixnum(-1), false);
307
- max = RubyFixnum.zero(runtime);
308
- } else {
309
- IRubyObject v1 = rubyApi.callMethod(offset, "+", limit);
310
- range = RubyRange.newRange(runtime, context, offset, v1, true);
311
- max = rubyApi.callMethod(v1, "+", RubyFixnum.one(runtime));
312
- }
313
- IRubyObject result = conn.execute_query(context, args[0], max);
314
- IRubyObject ret = rubyApi.callMethod(result, "[]", range);
315
- if (ret.isNil()) {
316
- return runtime.newArray();
317
- } else {
318
- return ret;
319
- }
320
- } else {
321
- return conn.execute_update(context, args[0]);
322
- }
323
- } finally {
324
- rubyApi.setInstanceVariable(recv, "@limit", runtime.getNil());
325
- rubyApi.setInstanceVariable(recv, "@offset", runtime.getNil());
280
+ RubyJdbcConnection conn = (RubyJdbcConnection) rubyApi.getInstanceVariable(recv, "@connection");
281
+ String sql = args[0].toString().trim().toLowerCase();
282
+ if (sql.charAt(0) == '(') {
283
+ sql = sql.substring(1).trim();
284
+ }
285
+ if (sql.startsWith("insert")) {
286
+ return conn.execute_insert(context, args[0]);
287
+ } else if (sql.startsWith("select") || sql.startsWith("show")) {
288
+ return conn.execute_query(context, args[0]);
289
+ } else {
290
+ return conn.execute_update(context, args[0]);
326
291
  }
327
292
  }
328
293
  }