Module: DatabaseCleaner::ActiveRecord::SelectiveTruncation
- Included in:
- Deletion
- Defined in:
- lib/database_cleaner/active_record/deletion.rb
Instance Method Summary collapse
- #information_schema_exists?(connection) ⇒ Boolean
- #table_stats_query(connection, db_name) ⇒ Object
- #tables_to_truncate(connection) ⇒ Object
- #tables_with_new_rows(connection) ⇒ Object
Instance Method Details
#information_schema_exists?(connection) ⇒ Boolean
80 81 82 83 84 85 86 87 88 89 |
# File 'lib/database_cleaner/active_record/deletion.rb', line 80 def information_schema_exists? connection return false unless connection.is_a? ActiveRecord::ConnectionAdapters::Mysql2Adapter @information_schema_exists ||= begin connection.execute("SELECT 1 FROM information_schema.tables") true rescue false end end |
#table_stats_query(connection, db_name) ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/database_cleaner/active_record/deletion.rb', line 65 def table_stats_query(connection, db_name) if @cache_tables && !@table_stats_query.nil? return @table_stats_query else @table_stats_query = connection.select_values(<<-SQL).join(' UNION ') SELECT CONCAT('SELECT \"', table_name, '\" AS table_name, COUNT(*) AS exact_row_count FROM ', table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = '#{db_name}' AND #{::DatabaseCleaner::ActiveRecord::Base.exclusion_condition('table_name')}; SQL end end |
#tables_to_truncate(connection) ⇒ Object
47 48 49 50 51 52 53 |
# File 'lib/database_cleaner/active_record/deletion.rb', line 47 def tables_to_truncate(connection) if information_schema_exists?(connection) (@only || tables_with_new_rows(connection)) - @tables_to_exclude else super end end |
#tables_with_new_rows(connection) ⇒ Object
55 56 57 58 59 60 61 62 63 |
# File 'lib/database_cleaner/active_record/deletion.rb', line 55 def tables_with_new_rows(connection) @db_name ||= connection.instance_variable_get('@config')[:database] stats = table_stats_query(connection, @db_name) if stats != '' connection.exec_query(stats).inject([]) {|all, stat| all << stat['table_name'] if stat['exact_row_count'] > 0; all } else [] end end |