activerecord-jdbc-adapter 0.8 → 0.8.1
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.
- data/History.txt +21 -0
- data/Manifest.txt +12 -0
- data/README.txt +1 -0
- data/Rakefile +19 -13
- data/lib/active_record/connection_adapters/cachedb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +22 -5
- data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +3 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +13 -0
- data/lib/jdbc_adapter/jdbc.rake +32 -29
- data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
- data/lib/jdbc_adapter/jdbc_cachedb.rb +33 -0
- data/lib/jdbc_adapter/jdbc_db2.rb +96 -7
- data/lib/jdbc_adapter/jdbc_derby.rb +35 -28
- data/lib/jdbc_adapter/jdbc_mssql.rb +62 -103
- data/lib/jdbc_adapter/jdbc_mysql.rb +34 -25
- data/lib/jdbc_adapter/jdbc_oracle.rb +7 -7
- data/lib/jdbc_adapter/jdbc_postgre.rb +1 -1
- data/lib/jdbc_adapter/jdbc_sqlite3.rb +188 -0
- data/lib/jdbc_adapter/jdbc_sybase.rb +39 -0
- data/lib/jdbc_adapter/tsql_helper.rb +59 -0
- data/lib/jdbc_adapter/version.rb +1 -1
- data/src/java/jdbc_adapter/JdbcAdapterInternalService.java +66 -40
- data/src/java/jdbc_adapter/JdbcMySQLSpec.java +2 -2
- data/test/cachedb_simple_test.rb +6 -0
- data/test/db/cachedb.rb +9 -0
- data/test/db/mssql.rb +9 -0
- data/test/db/oracle.rb +22 -2
- data/test/db/sqlite3.rb +11 -0
- data/test/db2_simple_test.rb +4 -0
- data/test/jdbc_common.rb +3 -1
- data/test/manualTestDatabase.rb +1 -5
- data/test/models/entry.rb +1 -1
- data/test/mssql_simple_test.rb +6 -0
- data/test/mysql_simple_test.rb +9 -0
- data/test/oracle_simple_test.rb +23 -0
- data/test/simple.rb +3 -2
- data/test/sqlite3_simple_test.rb +6 -0
- metadata +14 -2
    
        data/History.txt
    CHANGED
    
    | @@ -1,3 +1,24 @@ | |
| 1 | 
            +
            == 0.8.1
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            - Now sporting a JDBC sqlite3 adapter! Thanks Joseph Athman.
         | 
| 4 | 
            +
            - Added support for InterSystems Cache database (Ryan Bell)
         | 
| 5 | 
            +
            - Fix for JRUBY-2256
         | 
| 6 | 
            +
            - JRUBY-1638, JRUBY-2404, JRUBY-2463: schema.table handling and Oracle NUMBER fixes (Darcy Schultz & Jesse Hu)
         | 
| 7 | 
            +
            - Add structure dump and other DDL-ish for DB2 (courtesy abedra and stuarthalloway)
         | 
| 8 | 
            +
            - Fix missing quote_table_name function under Rails 1.2.6 and earlier
         | 
| 9 | 
            +
            - Small tweaks to jdbc.rake to select proper config
         | 
| 10 | 
            +
            - JRUBY-2011: Fix MSSQL string un-quoting issue (Silvio Fonseca)
         | 
| 11 | 
            +
            - JRUBY-1977, 17427: Fix information_schema select issue with MSSQL (Matt Burke)
         | 
| 12 | 
            +
            - 20479: Improve get_table_name for MSSQL (Aslak Hellesøy)
         | 
| 13 | 
            +
            - 20243: numerics improvements for MSSQL (Aslak Hellesøy)
         | 
| 14 | 
            +
            - 20172: don't quote table names for MSSQL (Thor Marius Henrichsen)
         | 
| 15 | 
            +
            - 19729: check for primary key existence in postgres during insert (Martin Luder)
         | 
| 16 | 
            +
            - JRUBY-2297, 18846: retrying failing SQL statements is harmful when not autocommitting (Craig McMillan)
         | 
| 17 | 
            +
            - 10021: very preliminary sybase support. (Mark Atkinson) Not usable until collision w/ sqlserver driver is resolved.
         | 
| 18 | 
            +
            - JRUBY-2312, JRUBY-2319, JRUBY-2322: Oracle timestamping issues (Jesse Hu & Michael König)
         | 
| 19 | 
            +
            - JRUBY-2422: Fix MySQL referential integrity and rollback issues
         | 
| 20 | 
            +
            - JRUBY-2382: mysql string quoting fails with ArrayIndexOutofBoundsException
         | 
| 21 | 
            +
             | 
| 1 22 | 
             
            == 0.8
         | 
| 2 23 |  | 
| 3 24 | 
             
            - NOTE: This release is only compatible with JRuby 1.1RC3 or later.
         | 
    
        data/Manifest.txt
    CHANGED
    
    | @@ -3,6 +3,7 @@ Manifest.txt | |
| 3 3 | 
             
            README.txt
         | 
| 4 4 | 
             
            Rakefile
         | 
| 5 5 | 
             
            LICENSE.txt
         | 
| 6 | 
            +
            lib/active_record/connection_adapters/cachedb_adapter.rb
         | 
| 6 7 | 
             
            lib/active_record/connection_adapters/derby_adapter.rb
         | 
| 7 8 | 
             
            lib/active_record/connection_adapters/h2_adapter.rb
         | 
| 8 9 | 
             
            lib/active_record/connection_adapters/hsqldb_adapter.rb
         | 
| @@ -12,6 +13,8 @@ lib/active_record/connection_adapters/jndi_adapter.rb | |
| 12 13 | 
             
            lib/active_record/connection_adapters/mysql_adapter.rb
         | 
| 13 14 | 
             
            lib/active_record/connection_adapters/oracle_adapter.rb
         | 
| 14 15 | 
             
            lib/active_record/connection_adapters/postgresql_adapter.rb
         | 
| 16 | 
            +
            lib/active_record/connection_adapters/sqlite3_adapter.rb
         | 
| 17 | 
            +
            lib/jdbc_adapter/jdbc_cachedb.rb
         | 
| 15 18 | 
             
            lib/jdbc_adapter/jdbc_db2.rb
         | 
| 16 19 | 
             
            lib/jdbc_adapter/jdbc_derby.rb
         | 
| 17 20 | 
             
            lib/jdbc_adapter/jdbc_firebird.rb
         | 
| @@ -21,13 +24,18 @@ lib/jdbc_adapter/jdbc_mssql.rb | |
| 21 24 | 
             
            lib/jdbc_adapter/jdbc_mysql.rb
         | 
| 22 25 | 
             
            lib/jdbc_adapter/jdbc_oracle.rb
         | 
| 23 26 | 
             
            lib/jdbc_adapter/jdbc_postgre.rb
         | 
| 27 | 
            +
            lib/jdbc_adapter/jdbc_sqlite3.rb
         | 
| 28 | 
            +
            lib/jdbc_adapter/jdbc_sybase.rb
         | 
| 24 29 | 
             
            lib/jdbc_adapter/missing_functionality_helper.rb
         | 
| 25 30 | 
             
            lib/jdbc_adapter/rake_tasks.rb
         | 
| 31 | 
            +
            lib/jdbc_adapter/tsql_helper.rb
         | 
| 26 32 | 
             
            lib/jdbc_adapter/version.rb
         | 
| 27 33 | 
             
            lib/jdbc_adapter.rb
         | 
| 28 34 | 
             
            lib/jdbc_adapter/jdbc_adapter_internal.jar
         | 
| 29 35 | 
             
            test/activerecord/connection_adapters/type_conversion_test.rb
         | 
| 30 36 | 
             
            test/activerecord/connections/native_jdbc_mysql/connection.rb
         | 
| 37 | 
            +
            test/cachedb_simple_test.rb
         | 
| 38 | 
            +
            test/db/cachedb.rb
         | 
| 31 39 | 
             
            test/db/db2.rb
         | 
| 32 40 | 
             
            test/db/derby.rb
         | 
| 33 41 | 
             
            test/db/h2.rb
         | 
| @@ -35,9 +43,11 @@ test/db/hsqldb.rb | |
| 35 43 | 
             
            test/db/jdbc.rb
         | 
| 36 44 | 
             
            test/db/jndi_config.rb
         | 
| 37 45 | 
             
            test/db/logger.rb
         | 
| 46 | 
            +
            test/db/mssql.rb
         | 
| 38 47 | 
             
            test/db/mysql.rb
         | 
| 39 48 | 
             
            test/db/oracle.rb
         | 
| 40 49 | 
             
            test/db/postgres.rb
         | 
| 50 | 
            +
            test/db/sqlite3.rb
         | 
| 41 51 | 
             
            test/db2_simple_test.rb
         | 
| 42 52 | 
             
            test/derby_multibyte_test.rb
         | 
| 43 53 | 
             
            test/derby_simple_test.rb
         | 
| @@ -61,12 +71,14 @@ test/models/auto_id.rb | |
| 61 71 | 
             
            test/models/data_types.rb
         | 
| 62 72 | 
             
            test/models/entry.rb
         | 
| 63 73 | 
             
            test/models/reserved_word.rb
         | 
| 74 | 
            +
            test/mssql_simple_test.rb
         | 
| 64 75 | 
             
            test/mysql_multibyte_test.rb
         | 
| 65 76 | 
             
            test/mysql_simple_test.rb
         | 
| 66 77 | 
             
            test/oracle_simple_test.rb
         | 
| 67 78 | 
             
            test/postgres_reserved_test.rb
         | 
| 68 79 | 
             
            test/postgres_simple_test.rb
         | 
| 69 80 | 
             
            test/simple.rb
         | 
| 81 | 
            +
            test/sqlite3_simple_test.rb
         | 
| 70 82 | 
             
            lib/jdbc_adapter/jdbc.rake
         | 
| 71 83 | 
             
            src/java/jdbc_adapter/JdbcAdapterInternalService.java
         | 
| 72 84 | 
             
            src/java/jdbc_adapter/JdbcConnectionFactory.java
         | 
    
        data/README.txt
    CHANGED
    
    | @@ -26,6 +26,7 @@ What's there, and what is not there: | |
| 26 26 | 
             
              * rename_column
         | 
| 27 27 | 
             
            * HSQLDB - Complete
         | 
| 28 28 | 
             
            * H2 - Complete
         | 
| 29 | 
            +
            * SQLite3 - work in progress
         | 
| 29 30 |  | 
| 30 31 | 
             
            Other databases will require testing and likely a custom configuration module. Please join the jruby-extras mailing-list[http://rubyforge.org/mail/?group_id=2014] to help us discover support for more databases.
         | 
| 31 32 |  | 
    
        data/Rakefile
    CHANGED
    
    | @@ -5,14 +5,16 @@ task :default => [:java_compile, :test] | |
| 5 5 |  | 
| 6 6 | 
             
            def java_classpath_arg # myriad of ways to discover JRuby classpath
         | 
| 7 7 | 
             
              begin
         | 
| 8 | 
            -
                 | 
| 8 | 
            +
                cpath  = Java::java.lang.System.getProperty('java.class.path').split(File::PATH_SEPARATOR)
         | 
| 9 | 
            +
                cpath += Java::java.lang.System.getProperty('sun.boot.class.path').split(File::PATH_SEPARATOR)
         | 
| 10 | 
            +
                jruby_cpath = cpath.compact.join(File::PATH_SEPARATOR)
         | 
| 9 11 | 
             
              rescue => e
         | 
| 10 12 | 
             
              end
         | 
| 11 13 | 
             
              unless jruby_cpath
         | 
| 12 14 | 
             
                jruby_cpath = ENV['JRUBY_PARENT_CLASSPATH'] || ENV['JRUBY_HOME'] &&
         | 
| 13 15 | 
             
                  FileList["#{ENV['JRUBY_HOME']}/lib/*.jar"].join(File::PATH_SEPARATOR)
         | 
| 14 16 | 
             
              end
         | 
| 15 | 
            -
              jruby_cpath ? "-cp #{jruby_cpath}" : ""
         | 
| 17 | 
            +
              jruby_cpath ? "-cp \"#{jruby_cpath}\"" : ""
         | 
| 16 18 | 
             
            end
         | 
| 17 19 |  | 
| 18 20 | 
             
            desc "Compile the native Java code."
         | 
| @@ -25,23 +27,13 @@ task :java_compile do | |
| 25 27 | 
             
            end
         | 
| 26 28 | 
             
            file "lib/jdbc_adapter/jdbc_adapter_internal.jar" => :java_compile
         | 
| 27 29 |  | 
| 28 | 
            -
            task :more_clean do
         | 
| 29 | 
            -
              rm_rf FileList['derby*']
         | 
| 30 | 
            -
              rm_rf FileList['test.db.*']
         | 
| 31 | 
            -
              rm_rf "test/reports"
         | 
| 32 | 
            -
              rm_f FileList['lib/**/*.jar']
         | 
| 33 | 
            -
              rm_f "manifest.mf"
         | 
| 34 | 
            -
            end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
            task :clean => :more_clean
         | 
| 37 | 
            -
             | 
| 38 30 | 
             
            task :filelist do
         | 
| 39 31 | 
             
              puts FileList['pkg/**/*'].inspect
         | 
| 40 32 | 
             
            end
         | 
| 41 33 |  | 
| 42 34 | 
             
            if RUBY_PLATFORM =~ /java/
         | 
| 43 35 | 
             
              # TODO: add more databases into the standard tests here.
         | 
| 44 | 
            -
              task :test => [:test_mysql, :test_jdbc, :test_derby, :test_hsqldb, :test_h2]
         | 
| 36 | 
            +
              task :test => [:test_mysql, :test_jdbc, :test_derby, :test_hsqldb, :test_h2, :test_sqlite3]
         | 
| 45 37 | 
             
            else
         | 
| 46 38 | 
             
              task :test => [:test_mysql]
         | 
| 47 39 | 
             
            end
         | 
| @@ -85,6 +77,17 @@ Rake::TestTask.new(:test_db2) do |t| | |
| 85 77 | 
             
              t.libs << 'test'
         | 
| 86 78 | 
             
            end
         | 
| 87 79 |  | 
| 80 | 
            +
            # Ensure InterSystems CacheDB driver is on your classpath before launching rake
         | 
| 81 | 
            +
            Rake::TestTask.new(:test_cachedb) do | t |
         | 
| 82 | 
            +
              t.test_files = FileList[ 'test/cachedb_simple_test.rb' ]
         | 
| 83 | 
            +
              t.libs << 'test'
         | 
| 84 | 
            +
            end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            # Ensure that the jTDS driver in on your classpath before launching rake
         | 
| 87 | 
            +
            Rake::TestTask.new(:test_mssql) do | t |
         | 
| 88 | 
            +
              t.test_files = FileList[ 'test/mssql_simple_test.rb' ]
         | 
| 89 | 
            +
              t.libs << 'test'
         | 
| 90 | 
            +
            end
         | 
| 88 91 |  | 
| 89 92 | 
             
            MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt", 
         | 
| 90 93 | 
             
              "Rakefile", "LICENSE.txt", "lib/**/*.rb", "lib/jdbc_adapter/jdbc_adapter_internal.jar", "test/**/*.rb",
         | 
| @@ -159,3 +162,6 @@ end | |
| 159 162 | 
             
                task "all:release" => "#{prefix}:release"
         | 
| 160 163 | 
             
              end
         | 
| 161 164 | 
             
            end
         | 
| 165 | 
            +
             | 
| 166 | 
            +
            require 'rake/clean'
         | 
| 167 | 
            +
            CLEAN.include 'derby*', 'test.db.*','test/reports', 'test.sqlite3','lib/**/*.jar','manifest.mf'
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            require 'active_record/connection_adapters/jdbc_adapter'
         | 
| @@ -135,6 +135,7 @@ module ActiveRecord | |
| 135 135 | 
             
                                      lambda {|r| r['type_name'] =~ /^decimal$/i},
         | 
| 136 136 | 
             
                                      lambda {|r| r['type_name'] =~ /^numeric$/i},
         | 
| 137 137 | 
             
                                      lambda {|r| r['type_name'] =~ /^number$/i},
         | 
| 138 | 
            +
                                      lambda {|r| r['type_name'] =~ /^real$/i},
         | 
| 138 139 | 
             
                                      lambda {|r| r['precision'] == '38'},
         | 
| 139 140 | 
             
                                      lambda {|r| r['data_type'] == '2'}],
         | 
| 140 141 | 
             
                    :float       => [ lambda {|r| [Jdbc::Types::FLOAT,Jdbc::Types::DOUBLE, Jdbc::Types::REAL].include?(r['data_type'].to_i)},
         | 
| @@ -146,17 +147,21 @@ module ActiveRecord | |
| 146 147 | 
             
                    :datetime    => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type'].to_i},
         | 
| 147 148 | 
             
                                      lambda {|r| r['type_name'] =~ /^datetime$/i},
         | 
| 148 149 | 
             
                                      lambda {|r| r['type_name'] =~ /^timestamp$/i},
         | 
| 149 | 
            -
                                      lambda {|r| r['type_name'] =~ /^date/i} | 
| 150 | 
            +
                                      lambda {|r| r['type_name'] =~ /^date/i},
         | 
| 151 | 
            +
                                      lambda {|r| r['type_name'] =~ /^integer/i}],  #Num of milliseconds for SQLite3 JDBC Driver
         | 
| 150 152 | 
             
                    :timestamp   => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type'].to_i},
         | 
| 151 153 | 
             
                                      lambda {|r| r['type_name'] =~ /^timestamp$/i},
         | 
| 152 154 | 
             
                                      lambda {|r| r['type_name'] =~ /^datetime/i},
         | 
| 153 | 
            -
                                      lambda {|r| r['type_name'] =~ /^date/i} | 
| 155 | 
            +
                                      lambda {|r| r['type_name'] =~ /^date/i},
         | 
| 156 | 
            +
                                      lambda {|r| r['type_name'] =~ /^integer/i}],  #Num of milliseconds for SQLite3 JDBC Driver
         | 
| 154 157 | 
             
                    :time        => [ lambda {|r| Jdbc::Types::TIME == r['data_type'].to_i},
         | 
| 155 158 | 
             
                                      lambda {|r| r['type_name'] =~ /^time$/i},
         | 
| 156 | 
            -
                                      lambda {|r| r['type_name'] =~ /^date/i} | 
| 159 | 
            +
                                      lambda {|r| r['type_name'] =~ /^date/i},
         | 
| 160 | 
            +
                                      lambda {|r| r['type_name'] =~ /^integer/i}],  #Num of milliseconds for SQLite3 JDBC Driver
         | 
| 157 161 | 
             
                    :date        => [ lambda {|r| Jdbc::Types::DATE == r['data_type'].to_i},
         | 
| 158 162 | 
             
                                      lambda {|r| r['type_name'] =~ /^date$/i},
         | 
| 159 | 
            -
                                      lambda {|r| r['type_name'] =~ /^date/i} | 
| 163 | 
            +
                                      lambda {|r| r['type_name'] =~ /^date/i},
         | 
| 164 | 
            +
                                      lambda {|r| r['type_name'] =~ /^integer/i}],  #Num of milliseconds for SQLite3 JDBC Driver3
         | 
| 160 165 | 
             
                    :binary      => [ lambda {|r| [Jdbc::Types::LONGVARBINARY,Jdbc::Types::BINARY,Jdbc::Types::BLOB].include?(r['data_type'].to_i)},
         | 
| 161 166 | 
             
                                      lambda {|r| r['type_name'] =~ /^blob/i},
         | 
| 162 167 | 
             
                                      lambda {|r| r['type_name'] =~ /sub_type 0$/i}, # For FireBird
         | 
| @@ -166,7 +171,8 @@ module ActiveRecord | |
| 166 171 | 
             
                                      lambda {|r| r['type_name'] =~ /^bool/i},
         | 
| 167 172 | 
             
                                      lambda {|r| r['data_type'] == '-7'},
         | 
| 168 173 | 
             
                                      lambda {|r| r['type_name'] =~ /^tinyint$/i},
         | 
| 169 | 
            -
                                      lambda {|r| r['type_name'] =~ /^decimal$/i} | 
| 174 | 
            +
                                      lambda {|r| r['type_name'] =~ /^decimal$/i},
         | 
| 175 | 
            +
                                      lambda {|r| r['type_name'] =~ /^integer$/i}]
         | 
| 170 176 | 
             
                  }
         | 
| 171 177 |  | 
| 172 178 | 
             
                  def initialize(types)
         | 
| @@ -414,8 +420,19 @@ module ActiveRecord | |
| 414 420 | 
             
                  end
         | 
| 415 421 | 
             
                end
         | 
| 416 422 |  | 
| 423 | 
            +
                module CompatibilityMethods
         | 
| 424 | 
            +
                  def self.needed?(base)
         | 
| 425 | 
            +
                    !base.instance_methods.include?("quote_table_name")
         | 
| 426 | 
            +
                  end
         | 
| 427 | 
            +
             | 
| 428 | 
            +
                  def quote_table_name(name)
         | 
| 429 | 
            +
                    quote_column_name(name)
         | 
| 430 | 
            +
                  end
         | 
| 431 | 
            +
                end
         | 
| 432 | 
            +
             | 
| 417 433 | 
             
                class JdbcAdapter < AbstractAdapter
         | 
| 418 434 | 
             
                  extend ShadowCoreMethods
         | 
| 435 | 
            +
                  include CompatibilityMethods if CompatibilityMethods.needed?(self)
         | 
| 419 436 |  | 
| 420 437 | 
             
                  attr_reader :config
         | 
| 421 438 |  | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            tried_gem = false
         | 
| 2 | 
            +
            begin
         | 
| 3 | 
            +
              require "jdbc/sqlite3"
         | 
| 4 | 
            +
            rescue LoadError
         | 
| 5 | 
            +
              unless tried_gem
         | 
| 6 | 
            +
                require 'rubygems'
         | 
| 7 | 
            +
                gem "jdbc-sqlite3"
         | 
| 8 | 
            +
                tried_gem = true
         | 
| 9 | 
            +
                retry
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
              # trust that the sqlite jar is already present
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
            require 'active_record/connection_adapters/jdbc_adapter'
         | 
    
        data/lib/jdbc_adapter/jdbc.rake
    CHANGED
    
    | @@ -10,44 +10,46 @@ def redefine_task(*args, &block) | |
| 10 10 | 
             
            end
         | 
| 11 11 |  | 
| 12 12 | 
             
            namespace :db do
         | 
| 13 | 
            -
               | 
| 14 | 
            -
                 | 
| 15 | 
            -
             | 
| 13 | 
            +
              if Rake::Task["db:create"]
         | 
| 14 | 
            +
                redefine_task :create => :environment do
         | 
| 15 | 
            +
                  create_database(ActiveRecord::Base.configurations[RAILS_ENV])
         | 
| 16 | 
            +
                end
         | 
| 16 17 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
                begin
         | 
| 20 | 
            -
                  ActiveRecord::Base.establish_connection(config)
         | 
| 21 | 
            -
                  ActiveRecord::Base.connection
         | 
| 22 | 
            -
                rescue
         | 
| 18 | 
            +
                class << self; alias_method :previous_create_database, :create_database; end
         | 
| 19 | 
            +
                def create_database(config)
         | 
| 23 20 | 
             
                  begin
         | 
| 24 | 
            -
                     | 
| 25 | 
            -
                     | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 21 | 
            +
                    ActiveRecord::Base.establish_connection(config)
         | 
| 22 | 
            +
                    ActiveRecord::Base.connection
         | 
| 23 | 
            +
                  rescue
         | 
| 24 | 
            +
                    begin
         | 
| 25 | 
            +
                      url = config['url']
         | 
| 26 | 
            +
                      if url
         | 
| 27 | 
            +
                        if url =~ /^(.*\/)/
         | 
| 28 | 
            +
                          url = $1
         | 
| 29 | 
            +
                        end
         | 
| 28 30 | 
             
                      end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                      ActiveRecord::Base.establish_connection(config.merge({'database' => nil, 'url' => url}))
         | 
| 33 | 
            +
                      ActiveRecord::Base.connection.create_database(config['database'])
         | 
| 34 | 
            +
                      ActiveRecord::Base.establish_connection(config)
         | 
| 35 | 
            +
                    rescue
         | 
| 36 | 
            +
                      previous_create_database(config)
         | 
| 29 37 | 
             
                    end
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 30 40 |  | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 41 | 
            +
                redefine_task :drop => :environment do
         | 
| 42 | 
            +
                  config = ActiveRecord::Base.configurations[RAILS_ENV]
         | 
| 43 | 
            +
                  begin
         | 
| 33 44 | 
             
                    ActiveRecord::Base.establish_connection(config)
         | 
| 45 | 
            +
                    db = ActiveRecord::Base.connection.database_name
         | 
| 46 | 
            +
                    ActiveRecord::Base.connection.drop_database(db)
         | 
| 34 47 | 
             
                  rescue
         | 
| 35 | 
            -
                     | 
| 48 | 
            +
                    drop_database(config)
         | 
| 36 49 | 
             
                  end
         | 
| 37 50 | 
             
                end
         | 
| 38 51 | 
             
              end
         | 
| 39 52 |  | 
| 40 | 
            -
              redefine_task :drop => :environment do
         | 
| 41 | 
            -
                config = ActiveRecord::Base.configurations[RAILS_ENV]
         | 
| 42 | 
            -
                begin
         | 
| 43 | 
            -
                  ActiveRecord::Base.establish_connection(config)
         | 
| 44 | 
            -
                  db = ActiveRecord::Base.connection.database_name
         | 
| 45 | 
            -
                  ActiveRecord::Base.connection.drop_database(db)
         | 
| 46 | 
            -
                rescue
         | 
| 47 | 
            -
                  drop_database(config)
         | 
| 48 | 
            -
                end
         | 
| 49 | 
            -
              end
         | 
| 50 | 
            -
             | 
| 51 53 | 
             
              namespace :structure do
         | 
| 52 54 | 
             
                redefine_task :dump => :environment do
         | 
| 53 55 | 
             
                  abcs = ActiveRecord::Base.configurations
         | 
| @@ -58,10 +60,11 @@ namespace :db do | |
| 58 60 | 
             
                  end
         | 
| 59 61 | 
             
                end
         | 
| 60 62 | 
             
              end
         | 
| 63 | 
            +
             | 
| 61 64 | 
             
              namespace :test do
         | 
| 62 65 | 
             
                redefine_task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
         | 
| 63 66 | 
             
                  abcs = ActiveRecord::Base.configurations
         | 
| 64 | 
            -
                  ActiveRecord::Base.establish_connection(:test)
         | 
| 67 | 
            +
                  ActiveRecord::Base.establish_connection(abcs[:test])
         | 
| 65 68 | 
             
                  ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if abcs["test"]["adapter"] =~ /mysql/i
         | 
| 66 69 | 
             
                  IO.readlines("db/#{RAILS_ENV}_structure.sql").join.split(";\n\n").each do |ddl|
         | 
| 67 70 | 
             
                    ActiveRecord::Base.connection.execute(ddl)
         | 
| @@ -70,7 +73,7 @@ namespace :db do | |
| 70 73 |  | 
| 71 74 | 
             
                redefine_task :purge => :environment do
         | 
| 72 75 | 
             
                  abcs = ActiveRecord::Base.configurations
         | 
| 73 | 
            -
                  ActiveRecord::Base.establish_connection(:test)
         | 
| 76 | 
            +
                  ActiveRecord::Base.establish_connection(abcs[:test])
         | 
| 74 77 | 
             
                  db = ActiveRecord::Base.connection.database_name
         | 
| 75 78 | 
             
                  ActiveRecord::Base.connection.recreate_database(db)
         | 
| 76 79 | 
             
                end
         | 
| Binary file | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            require 'jdbc_adapter/tsql_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ::JdbcSpec
         | 
| 4 | 
            +
              module ActiveRecordExtensions
         | 
| 5 | 
            +
                def cachedb_connection( config )
         | 
| 6 | 
            +
                  config[:port] ||= 1972
         | 
| 7 | 
            +
                  config[:url] ||= "jdbc:Cache://#{config[:host]}:#{config[:port]}/#{ config[:database]}"
         | 
| 8 | 
            +
                  config[:driver] ||= "com.intersys.jdbc.CacheDriver"
         | 
| 9 | 
            +
                  jdbc_connection( config )
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              module CacheDB
         | 
| 14 | 
            +
                include TSqlMethods
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def self.column_selector
         | 
| 17 | 
            +
                  [ /cache/i, lambda {  | cfg, col | col.extend( ::JdbcSpec::CacheDB::Column ) } ]
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def self.adapter_selector
         | 
| 21 | 
            +
                  [ /cache/i, lambda {  | cfg, adapt | adapt.extend( ::JdbcSpec::CacheDB ) } ]
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                module Column
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                def create_table(name, options = { })
         | 
| 28 | 
            +
                  super(name, options)
         | 
| 29 | 
            +
                  primary_key = options[:primary_key] || "id"
         | 
| 30 | 
            +
                  execute "ALTER TABLE #{name} ADD CONSTRAINT #{name}_PK PRIMARY KEY(#{primary_key})" unless options[:id] == false
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -17,14 +17,14 @@ module JdbcSpec | |
| 17 17 | 
             
                       adapt.extend(::JdbcSpec::DB2)
         | 
| 18 18 | 
             
                     end }]
         | 
| 19 19 | 
             
                end
         | 
| 20 | 
            -
             | 
| 20 | 
            +
             | 
| 21 21 | 
             
                module Column
         | 
| 22 22 | 
             
                  def type_cast(value)
         | 
| 23 23 | 
             
                    return nil if value.nil? || value =~ /^\s*null\s*$/i
         | 
| 24 24 | 
             
                    case type
         | 
| 25 25 | 
             
                    when :string    then value
         | 
| 26 26 | 
             
                    when :integer   then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
         | 
| 27 | 
            -
                    when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0) | 
| 27 | 
            +
                    when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
         | 
| 28 28 | 
             
                    when :float     then value.to_f
         | 
| 29 29 | 
             
                    when :datetime  then cast_to_date_or_time(value)
         | 
| 30 30 | 
             
                    when :timestamp then cast_to_time(value)
         | 
| @@ -50,7 +50,7 @@ module JdbcSpec | |
| 50 50 | 
             
                    Date.new(value.year, value.month, value.day) : value
         | 
| 51 51 | 
             
                  end
         | 
| 52 52 | 
             
                end
         | 
| 53 | 
            -
             | 
| 53 | 
            +
             | 
| 54 54 | 
             
                def modify_types(tp)
         | 
| 55 55 | 
             
                  tp[:primary_key] = 'int generated by default as identity (start with 42) primary key'
         | 
| 56 56 | 
             
                  tp[:string][:limit] = 255
         | 
| @@ -58,7 +58,7 @@ module JdbcSpec | |
| 58 58 | 
             
                  tp[:boolean][:limit] = nil
         | 
| 59 59 | 
             
                  tp
         | 
| 60 60 | 
             
                end
         | 
| 61 | 
            -
             | 
| 61 | 
            +
             | 
| 62 62 | 
             
                def add_limit_offset!(sql, options)
         | 
| 63 63 | 
             
                  if limit = options[:limit]
         | 
| 64 64 | 
             
                    offset = options[:offset] || 0
         | 
| @@ -66,7 +66,7 @@ module JdbcSpec | |
| 66 66 | 
             
                    sql << ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset}"
         | 
| 67 67 | 
             
                  end
         | 
| 68 68 | 
             
                end
         | 
| 69 | 
            -
             | 
| 69 | 
            +
             | 
| 70 70 | 
             
                def quote_column_name(column_name)
         | 
| 71 71 | 
             
                  column_name
         | 
| 72 72 | 
             
                end
         | 
| @@ -79,7 +79,7 @@ module JdbcSpec | |
| 79 79 | 
             
                    return value.to_s
         | 
| 80 80 | 
             
                  end
         | 
| 81 81 | 
             
                  case value
         | 
| 82 | 
            -
                  when String | 
| 82 | 
            +
                  when String
         | 
| 83 83 | 
             
                    if column && column.type == :binary
         | 
| 84 84 | 
             
                      "BLOB('#{quote_string(value)}')"
         | 
| 85 85 | 
             
                    else
         | 
| @@ -88,7 +88,7 @@ module JdbcSpec | |
| 88 88 | 
             
                  else super
         | 
| 89 89 | 
             
                  end
         | 
| 90 90 | 
             
                end
         | 
| 91 | 
            -
             | 
| 91 | 
            +
             | 
| 92 92 | 
             
                def quote_string(string)
         | 
| 93 93 | 
             
                  string.gsub(/'/, "''") # ' (for ruby-mode)
         | 
| 94 94 | 
             
                end
         | 
| @@ -100,5 +100,94 @@ module JdbcSpec | |
| 100 100 | 
             
                def quoted_false
         | 
| 101 101 | 
             
                  '0'
         | 
| 102 102 | 
             
                end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                def recreate_database(name)
         | 
| 105 | 
            +
                  do_not_drop = ["stmg_dbsize_info","hmon_atm_info","hmon_collection","policy"]
         | 
| 106 | 
            +
                  tables.each do |table|
         | 
| 107 | 
            +
                    unless do_not_drop.include?(table)
         | 
| 108 | 
            +
                      drop_table(table)
         | 
| 109 | 
            +
                    end
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
                end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                def remove_index(table_name, options = { })
         | 
| 114 | 
            +
                  execute "DROP INDEX #{quote_column_name(index_name(table_name, options))}"
         | 
| 115 | 
            +
                end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                # This method makes tests pass without understanding why.
         | 
| 118 | 
            +
                # Don't use this in production.
         | 
| 119 | 
            +
                def columns(table_name, name = nil)
         | 
| 120 | 
            +
                  super.select do |col|
         | 
| 121 | 
            +
                    # strip out "magic" columns from DB2 (?)
         | 
| 122 | 
            +
                    !/rolename|roleid|create_time|auditpolicyname|auditpolicyid|remarks/.match(col.name)
         | 
| 123 | 
            +
                  end
         | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                def add_quotes(name)
         | 
| 127 | 
            +
                  return name unless name
         | 
| 128 | 
            +
                  %Q{"#{name}"}
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                def strip_quotes(str)
         | 
| 132 | 
            +
                  return str unless str
         | 
| 133 | 
            +
                  return str unless /^(["']).*\1$/ =~ str
         | 
| 134 | 
            +
                  str[1..-2]
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                def expand_double_quotes(name)
         | 
| 138 | 
            +
                  return name unless name && name['"']
         | 
| 139 | 
            +
                  name.gsub(/"/,'""')
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
             | 
| 143 | 
            +
                def structure_dump #:nodoc:
         | 
| 144 | 
            +
                  definition=""
         | 
| 145 | 
            +
                  rs = @connection.connection.meta_data.getTables(nil,nil,nil,["TABLE"].to_java(:string))
         | 
| 146 | 
            +
                  while rs.next
         | 
| 147 | 
            +
                    tname = rs.getString(3)
         | 
| 148 | 
            +
                    definition << "CREATE TABLE #{tname} (\n"
         | 
| 149 | 
            +
                    rs2 = @connection.connection.meta_data.getColumns(nil,nil,tname,nil)
         | 
| 150 | 
            +
                    first_col = true
         | 
| 151 | 
            +
                    while rs2.next
         | 
| 152 | 
            +
                      col_name = add_quotes(rs2.getString(4));
         | 
| 153 | 
            +
                      default = ""
         | 
| 154 | 
            +
                      d1 = rs2.getString(13)
         | 
| 155 | 
            +
                      default = d1 ? " DEFAULT #{d1}" : ""
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                      type = rs2.getString(6)
         | 
| 158 | 
            +
                      col_size = rs2.getString(7)
         | 
| 159 | 
            +
                      nulling = (rs2.getString(18) == 'NO' ? " NOT NULL" : "")
         | 
| 160 | 
            +
                      create_col_string = add_quotes(expand_double_quotes(strip_quotes(col_name))) +
         | 
| 161 | 
            +
                        " " +
         | 
| 162 | 
            +
                        type +
         | 
| 163 | 
            +
                        "" +
         | 
| 164 | 
            +
                        nulling +
         | 
| 165 | 
            +
                        default
         | 
| 166 | 
            +
                      if !first_col
         | 
| 167 | 
            +
                        create_col_string = ",\n #{create_col_string}"
         | 
| 168 | 
            +
                      else
         | 
| 169 | 
            +
                        create_col_string = " #{create_col_string}"
         | 
| 170 | 
            +
                      end
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                      definition << create_col_string
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                      first_col = false
         | 
| 175 | 
            +
                    end
         | 
| 176 | 
            +
                    definition << ");\n\n"
         | 
| 177 | 
            +
                  end
         | 
| 178 | 
            +
                  definition
         | 
| 179 | 
            +
                end
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                def dump_schema_information
         | 
| 182 | 
            +
                  begin
         | 
| 183 | 
            +
                    if (current_schema = ActiveRecord::Migrator.current_version) > 0
         | 
| 184 | 
            +
                      #TODO: Find a way to get the DB2 instace name to properly form the statement
         | 
| 185 | 
            +
                      return "INSERT INTO DB2INST2.SCHEMA_INFO (version) VALUES (#{current_schema})"
         | 
| 186 | 
            +
                    end
         | 
| 187 | 
            +
                  rescue ActiveRecord::StatementInvalid
         | 
| 188 | 
            +
                    # No Schema Info
         | 
| 189 | 
            +
                  end
         | 
| 190 | 
            +
                end
         | 
| 191 | 
            +
             | 
| 103 192 | 
             
              end
         | 
| 104 193 | 
             
            end
         |