Skip to content

Commit

Permalink
Merge pull request #209 from tommeier/mysql-superclass-bug
Browse files Browse the repository at this point in the history
Fix MySqlAdapter superclass bug via class_eval loading of superclasses
  • Loading branch information
bmabey committed May 15, 2013
2 parents 3ecd0f5 + 9bf038d commit 6a3d236
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 33 deletions.
44 changes: 13 additions & 31 deletions lib/database_cleaner/active_record/truncation.rb
Expand Up @@ -176,64 +176,46 @@ module ActiveRecord
module ConnectionAdapters
# Activerecord-jdbc-adapter defines class dependencies a bit differently - if it is present, confirm to ArJdbc hierarchy to avoid 'superclass mismatch' errors.
USE_ARJDBC_WORKAROUND = defined?(ArJdbc)
# ActiveRecord 3.1+ support
MYSQL_ABSTRACT_ADAPTER = defined?(AbstractMysqlAdapter) ? AbstractMysqlAdapter : AbstractAdapter

class AbstractAdapter
include ::DatabaseCleaner::ActiveRecord::AbstractAdapter
end

unless USE_ARJDBC_WORKAROUND
class SQLiteAdapter < AbstractAdapter
end
end
AbstractAdapter.send(:include, ::DatabaseCleaner::ActiveRecord::AbstractAdapter)

# ActiveRecord 3.1 support
if defined?(AbstractMysqlAdapter)
MYSQL_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : AbstractMysqlAdapter
MYSQL2_ADAPTER_PARENT = AbstractMysqlAdapter
if USE_ARJDBC_WORKAROUND
MYSQL_ADAPTER_PARENT = JdbcAdapter
else
MYSQL_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : AbstractAdapter
MYSQL2_ADAPTER_PARENT = AbstractAdapter
MYSQL_ADAPTER_PARENT = MYSQL_ABSTRACT_ADAPTER
class SQLiteAdapter < AbstractAdapter; end
end
MYSQL2_ADAPTER_PARENT = MYSQL_ABSTRACT_ADAPTER

if defined?(SQLite3Adapter) && SQLite3Adapter.superclass == ActiveRecord::ConnectionAdapters::AbstractAdapter
SQLITE_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : AbstractAdapter
else
SQLITE_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : SQLiteAdapter
end
POSTGRE_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : AbstractAdapter

class MysqlAdapter < MYSQL_ADAPTER_PARENT
include ::DatabaseCleaner::ActiveRecord::MysqlAdapter
end
POSTGRES_ADAPTER_PARENT = USE_ARJDBC_WORKAROUND ? JdbcAdapter : AbstractAdapter

class Mysql2Adapter < MYSQL2_ADAPTER_PARENT
include ::DatabaseCleaner::ActiveRecord::MysqlAdapter
end
MYSQL_ADAPTER_PARENT.class_eval { include ::DatabaseCleaner::ActiveRecord::MysqlAdapter }
MYSQL2_ADAPTER_PARENT.class_eval { include ::DatabaseCleaner::ActiveRecord::MysqlAdapter }
SQLITE_ADAPTER_PARENT.class_eval { include ::DatabaseCleaner::ActiveRecord::SQLiteAdapter }
POSTGRES_ADAPTER_PARENT.class_eval { include ::DatabaseCleaner::ActiveRecord::PostgreSQLAdapter }

class IBM_DBAdapter < AbstractAdapter
include ::DatabaseCleaner::ActiveRecord::IBM_DBAdapter
end

class SQLite3Adapter < SQLITE_ADAPTER_PARENT
include ::DatabaseCleaner::ActiveRecord::SQLiteAdapter
end

class JdbcAdapter < AbstractAdapter
include ::DatabaseCleaner::ActiveRecord::TruncateOrDelete
end

class PostgreSQLAdapter < POSTGRE_ADAPTER_PARENT
include ::DatabaseCleaner::ActiveRecord::PostgreSQLAdapter
end

class SQLServerAdapter < AbstractAdapter
include ::DatabaseCleaner::ActiveRecord::TruncateOrDelete
end

class OracleEnhancedAdapter < AbstractAdapter
include ::DatabaseCleaner::ActiveRecord::OracleEnhancedAdapter
end

end
end

Expand Down
8 changes: 6 additions & 2 deletions spec/database_cleaner/active_record/truncation_spec.rb
@@ -1,5 +1,9 @@
require File.dirname(__FILE__) + '/../../spec_helper'
require 'active_record'
require 'active_record/connection_adapters/mysql_adapter'
require 'active_record/connection_adapters/mysql2_adapter'
require 'active_record/connection_adapters/sqlite3_adapter'
require 'active_record/connection_adapters/postgresql_adapter'

require 'database_cleaner/active_record/truncation'

Expand Down Expand Up @@ -119,14 +123,14 @@ module ActiveRecord
subject.send(:pre_count?).should == false
end
end

describe '#reset_ids?' do
before(:each) do
connection.stub!(:disable_referential_integrity).and_yield
connection.stub!(:database_cleaner_view_cache).and_return([])
::ActiveRecord::Base.stub!(:connection).and_return(connection)
end

subject { Truncation.new }
its(:reset_ids?) { should == true }

Expand Down
2 changes: 2 additions & 0 deletions spec/support/active_record/mysql2_setup.rb
@@ -1,6 +1,7 @@
require 'support/active_record/database_setup'
require 'support/active_record/schema_setup'


module MySQL2Helper
puts "Active Record #{ActiveRecord::VERSION::STRING}, mysql2"

Expand Down Expand Up @@ -36,3 +37,4 @@ def active_record_mysql2_connection
RSpec.configure do |c|
c.include MySQL2Helper
end

0 comments on commit 6a3d236

Please sign in to comment.