From 18247a6c5811db5dcb2af969af2b277f21db2e66 Mon Sep 17 00:00:00 2001
From: Holger Just <h.just@finn.de>
Date: Sun, 22 May 2011 18:56:10 +0200
Subject: [PATCH] [112] Detect SQLite3 version on JRuby

---
 lib/chili_project/database.rb                | 10 ++--
 test/unit/lib/chili_project/database_test.rb | 49 ++++++++++++++++----
 2 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/lib/chili_project/database.rb b/lib/chili_project/database.rb
index c78376671..3c0303682 100644
--- a/lib/chili_project/database.rb
+++ b/lib/chili_project/database.rb
@@ -66,10 +66,14 @@ module ChiliProject
         version = ActiveRecord::Base.connection.select_value('SELECT version()')
         raw ? version : version.match(/^PostgreSQL (\S+)/i)[1]
       when :sqlite
-        if SQLite3.const_defined? 'SQLITE_VERSION'
-          SQLite3::SQLITE_VERSION
+        if RUBY_ENGINE == 'jruby'
+          Jdbc::SQLite3::VERSION
         else
-          SQLite3::Driver::Native::API.sqlite3_libversion
+          if SQLite3.const_defined? 'SQLITE_VERSION'
+            SQLite3::SQLITE_VERSION
+          else
+            SQLite3::Driver::Native::API.sqlite3_libversion
+          end
         end
       end
     end
diff --git a/test/unit/lib/chili_project/database_test.rb b/test/unit/lib/chili_project/database_test.rb
index d105c78b3..16253729d 100644
--- a/test/unit/lib/chili_project/database_test.rb
+++ b/test/unit/lib/chili_project/database_test.rb
@@ -36,22 +36,53 @@ class ChiliProject::DatabaseTest < ActiveSupport::TestCase
     begin
       ChiliProject::Database.stubs(:adapter_name).returns "SQLite"
 
-      # if we run the tests on sqlite, just stub the version method
-      if Object.const_defined? 'SQLite3'
-        SQLite3::Driver::Native::API.stubs(:sqlite3_libversion).returns "1.2.3"
+      if RUBY_ENGINE == 'jruby'
+        # If we have the SQLite3 gem installed, save the old constant
+        if Object.const_defined?('Jdbc') && Jdbc::SQLite3.const_defined?('SQLite3')
+          sqlite3_version = Jdbc::SQLite3::VERSION
+        # else create the module for this test
+        else
+          module ::Jdbc; module SQLite3; end ;end
+          created_module = true
+        end
+        silence_warnings { ::Jdbc::SQLite3.const_set('VERSION', "1.2.3") }
       else
-        # if we don't have any sqlite3 module, stub the whole module
-        module ::SQLite3; module Driver; module Native; module API
-          def self.sqlite3_libversion; "1.2.3"; end
-        end; end; end; end
-        created_stub = true
+        # If we run the tests on a newer SQLite3, stub the VERSION constant
+        if Object.const_defined?('SQLite3') && SQLite3.const_defined?('SQLITE_VERSION')
+          sqlite3_version = SQLite3::SQLITE_VERSION
+          silence_warnings { ::SQLite3.const_set('SQLITE_VERSION', "1.2.3") }
+        # On an older SQLite3, stub the C-provided sqlite3_libversion method
+        elsif %w(SQLite3 Driver Native API).inject(Object){ |m, defined|
+          m = (m && m.const_defined?(defined)) ? m.const_get(defined) : false
+        }
+          SQLite3::Driver::Native::API.stubs('sqlite3_libversion').returns "1.2.3"
+        # Fallback if nothing else worked: Stub the old SQLite3 API
+        else
+          # if we don't have any sqlite3 module, stub the whole module
+          module ::SQLite3; module Driver; module Native; module API
+            def self.sqlite3_libversion; "1.2.3"; end
+          end; end; end; end
+          created_module = true
+        end
       end
 
       assert_equal "1.2.3", ChiliProject::Database.version
       assert_equal "1.2.3", ChiliProject::Database.version(true)
     ensure
       # Clean up after us
-      Object.instance_eval{remove_const :SQLite3 } if created_stub
+      if RUBY_ENGINE == 'jruby'
+        if created_module
+          Jdbc.instance_eval{remove_const 'SQLite3' }
+        elsif sqlite3_version
+          silence_warnings { Jdbc::SQLite3.const_set('VERSION', sqlite3_version) }
+        end
+      else
+        if created_module
+          Object.instance_eval{remove_const 'SQLite3' }
+        elsif sqlite3_version
+          silence_warnings { SQLite3.const_set('SQLITE_VERSION', sqlite3_version) }
+        end
+      end
     end
   end
 
-- 
GitLab