database_cleaner 1.99.0 → 2.0.0.beta

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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/lib/database_cleaner.rb +1 -47
  3. metadata +14 -484
  4. data/CONTRIBUTE.markdown +0 -27
  5. data/Gemfile.lock +0 -324
  6. data/History.rdoc +0 -514
  7. data/LICENSE +0 -20
  8. data/README.markdown +0 -389
  9. data/Rakefile +0 -44
  10. data/TODO +0 -3
  11. data/adapters/database_cleaner-active_record/lib/database_cleaner-active_record.rb +0 -1
  12. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record.rb +0 -6
  13. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/base.rb +0 -101
  14. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/deletion.rb +0 -108
  15. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/transaction.rb +0 -59
  16. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/truncation.rb +0 -288
  17. data/adapters/database_cleaner-active_record/lib/database_cleaner/active_record/version.rb +0 -5
  18. data/adapters/database_cleaner-couch_potato/lib/database_cleaner-couch_potato.rb +0 -1
  19. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato.rb +0 -13
  20. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/base.rb +0 -7
  21. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/truncation.rb +0 -28
  22. data/adapters/database_cleaner-couch_potato/lib/database_cleaner/couch_potato/version.rb +0 -5
  23. data/adapters/database_cleaner-data_mapper/lib/database_cleaner-data_mapper.rb +0 -1
  24. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper.rb +0 -6
  25. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/base.rb +0 -25
  26. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/transaction.rb +0 -28
  27. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/truncation.rb +0 -173
  28. data/adapters/database_cleaner-data_mapper/lib/database_cleaner/data_mapper/version.rb +0 -5
  29. data/adapters/database_cleaner-mongo/lib/database_cleaner-mongo.rb +0 -1
  30. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo.rb +0 -11
  31. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/base.rb +0 -16
  32. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/deletion.rb +0 -8
  33. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/truncation.rb +0 -74
  34. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/truncation_mixin.rb +0 -26
  35. data/adapters/database_cleaner-mongo/lib/database_cleaner/mongo/version.rb +0 -5
  36. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner-mongo_mapper.rb +0 -1
  37. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper.rb +0 -5
  38. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/base.rb +0 -24
  39. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/truncation.rb +0 -35
  40. data/adapters/database_cleaner-mongo_mapper/lib/database_cleaner/mongo_mapper/version.rb +0 -5
  41. data/adapters/database_cleaner-mongoid/lib/database_cleaner-mongoid.rb +0 -1
  42. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid.rb +0 -11
  43. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/base.rb +0 -20
  44. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/deletion.rb +0 -10
  45. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongo1_truncation_mixin.rb +0 -26
  46. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongo2_truncation_mixin.rb +0 -38
  47. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/mongoid_truncation_mixin.rb +0 -65
  48. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/truncation.rb +0 -49
  49. data/adapters/database_cleaner-mongoid/lib/database_cleaner/mongoid/version.rb +0 -5
  50. data/adapters/database_cleaner-moped/lib/database_cleaner-moped.rb +0 -1
  51. data/adapters/database_cleaner-moped/lib/database_cleaner/moped.rb +0 -12
  52. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/base.rb +0 -39
  53. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/truncation.rb +0 -9
  54. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/truncation_base.rb +0 -44
  55. data/adapters/database_cleaner-moped/lib/database_cleaner/moped/version.rb +0 -5
  56. data/adapters/database_cleaner-neo4j/lib/database_cleaner-neo4j.rb +0 -1
  57. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j.rb +0 -7
  58. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/base.rb +0 -66
  59. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/deletion.rb +0 -16
  60. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/transaction.rb +0 -35
  61. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/truncation.rb +0 -9
  62. data/adapters/database_cleaner-neo4j/lib/database_cleaner/neo4j/version.rb +0 -5
  63. data/adapters/database_cleaner-ohm/lib/database_cleaner-ohm.rb +0 -1
  64. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm.rb +0 -12
  65. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm/truncation.rb +0 -24
  66. data/adapters/database_cleaner-ohm/lib/database_cleaner/ohm/version.rb +0 -5
  67. data/adapters/database_cleaner-redis/lib/database_cleaner-redis.rb +0 -1
  68. data/adapters/database_cleaner-redis/lib/database_cleaner/redis.rb +0 -5
  69. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/base.rb +0 -45
  70. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/deletion.rb +0 -9
  71. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/truncation.rb +0 -26
  72. data/adapters/database_cleaner-redis/lib/database_cleaner/redis/version.rb +0 -5
  73. data/adapters/database_cleaner-sequel/lib/database_cleaner-sequel.rb +0 -1
  74. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel.rb +0 -6
  75. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/base.rb +0 -26
  76. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/deletion.rb +0 -47
  77. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/transaction.rb +0 -40
  78. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/truncation.rb +0 -79
  79. data/adapters/database_cleaner-sequel/lib/database_cleaner/sequel/version.rb +0 -5
  80. data/cucumber.yml +0 -1
  81. data/lib/database_cleaner/base.rb +0 -169
  82. data/lib/database_cleaner/configuration.rb +0 -136
  83. data/lib/database_cleaner/cucumber.rb +0 -3
  84. data/lib/database_cleaner/deprecation.rb +0 -26
  85. data/lib/database_cleaner/generic/base.rb +0 -29
  86. data/lib/database_cleaner/generic/transaction.rb +0 -11
  87. data/lib/database_cleaner/generic/truncation.rb +0 -40
  88. data/lib/database_cleaner/null_strategy.rb +0 -20
  89. data/lib/database_cleaner/orm_autodetector.rb +0 -41
  90. data/lib/database_cleaner/safeguard.rb +0 -107
  91. data/lib/database_cleaner/spec.rb +0 -2
  92. data/lib/database_cleaner/spec/database_helper.rb +0 -82
  93. data/lib/database_cleaner/spec/shared_examples.rb +0 -15
  94. data/lib/database_cleaner/version.rb +0 -3
data/TODO DELETED
@@ -1,3 +0,0 @@
1
- Could be more Datamapper
2
- MongoMapper multiple db support
3
- CouchDB multiple db support
@@ -1 +0,0 @@
1
- require "database_cleaner/active_record"
@@ -1,6 +0,0 @@
1
- require 'database_cleaner/active_record/version'
2
- require 'database_cleaner'
3
- require 'database_cleaner/active_record/deletion'
4
- require 'database_cleaner/active_record/transaction'
5
- require 'database_cleaner/active_record/truncation'
6
-
@@ -1,101 +0,0 @@
1
- require 'active_record'
2
- require 'database_cleaner/generic/base'
3
- require 'erb'
4
- require 'yaml'
5
-
6
- module DatabaseCleaner
7
- module ActiveRecord
8
- def self.available_strategies
9
- %w[truncation transaction deletion]
10
- end
11
-
12
- def self.default_strategy
13
- :transaction
14
- end
15
-
16
- def self.config_file_location=(path)
17
- @config_file_location = path
18
- end
19
-
20
- def self.config_file_location
21
- @config_file_location ||= begin
22
- # Has DC.app_root been set? Check in this intrusive way to avoid triggering deprecation warnings if it hasn't.
23
- app_root = DatabaseCleaner.send(:configuration).instance_variable_get(:@app_root)
24
- root = app_root || Dir.pwd
25
- "#{root}/config/database.yml"
26
- end
27
- end
28
-
29
- module Base
30
- include ::DatabaseCleaner::Generic::Base
31
-
32
- attr_accessor :connection_hash
33
-
34
- def db=(desired_db)
35
- @db = desired_db
36
- load_config
37
- end
38
-
39
- def db
40
- @db ||= super
41
- end
42
-
43
- def load_config
44
- if self.db != :default && self.db.is_a?(Symbol) && File.file?(ActiveRecord.config_file_location)
45
- connection_details = YAML::load(ERB.new(IO.read(ActiveRecord.config_file_location)).result)
46
- @connection_hash = valid_config(connection_details)[self.db.to_s]
47
- end
48
- end
49
-
50
- def valid_config(connection_file)
51
- if !::ActiveRecord::Base.configurations.nil? && !::ActiveRecord::Base.configurations.empty?
52
- if connection_file != ::ActiveRecord::Base.configurations
53
- return ::ActiveRecord::Base.configurations
54
- end
55
- end
56
- connection_file
57
- end
58
-
59
- def connection_class
60
- @connection_class ||= if db && !db.is_a?(Symbol)
61
- db
62
- elsif connection_hash
63
- lookup_from_connection_pool || establish_connection
64
- else
65
- ::ActiveRecord::Base
66
- end
67
- end
68
-
69
- def self.migration_table_name
70
- if ::ActiveRecord::VERSION::MAJOR < 5
71
- ::ActiveRecord::Migrator.schema_migrations_table_name
72
- else
73
- ::ActiveRecord::SchemaMigration.table_name
74
- end
75
- end
76
-
77
- def self.exclusion_condition(column_name)
78
- result = " #{column_name} <> '#{::DatabaseCleaner::ActiveRecord::Base.migration_table_name}' "
79
- if ::ActiveRecord::VERSION::MAJOR >= 5
80
- result += " AND #{column_name} <> '#{::ActiveRecord::Base.internal_metadata_table_name}' "
81
- end
82
- result
83
- end
84
-
85
- private
86
-
87
- def lookup_from_connection_pool
88
- if ::ActiveRecord::Base.respond_to?(:descendants)
89
- database_name = connection_hash["database"] || connection_hash[:database]
90
- models = ::ActiveRecord::Base.descendants
91
- models.select(&:connection_pool).detect { |m| m.connection_pool.spec.config[:database] == database_name }
92
- end
93
- end
94
-
95
- def establish_connection
96
- ::ActiveRecord::Base.establish_connection(connection_hash)
97
- ::ActiveRecord::Base
98
- end
99
- end
100
- end
101
- end
@@ -1,108 +0,0 @@
1
- require 'active_record'
2
- require 'active_record/connection_adapters/abstract_adapter'
3
- require "database_cleaner/generic/truncation"
4
- require 'database_cleaner/active_record/truncation'
5
-
6
- module DatabaseCleaner
7
- module ConnectionAdapters
8
- module AbstractDeleteAdapter
9
- def delete_table(table_name)
10
- raise NotImplementedError
11
- end
12
- end
13
-
14
- module GenericDeleteAdapter
15
- def delete_table(table_name)
16
- execute("DELETE FROM #{quote_table_name(table_name)};")
17
- end
18
- end
19
-
20
- module OracleDeleteAdapter
21
- def delete_table(table_name)
22
- execute("DELETE FROM #{quote_table_name(table_name)}")
23
- end
24
- end
25
- end
26
- end
27
-
28
- module ActiveRecord
29
- module ConnectionAdapters
30
- AbstractAdapter.class_eval { include DatabaseCleaner::ConnectionAdapters::AbstractDeleteAdapter }
31
-
32
- JdbcAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::GenericDeleteAdapter } if defined?(JdbcAdapter)
33
- AbstractMysqlAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::GenericDeleteAdapter } if defined?(AbstractMysqlAdapter)
34
- Mysql2Adapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::GenericDeleteAdapter } if defined?(Mysql2Adapter)
35
- SQLiteAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::GenericDeleteAdapter } if defined?(SQLiteAdapter)
36
- SQLite3Adapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::GenericDeleteAdapter } if defined?(SQLite3Adapter)
37
- PostgreSQLAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::GenericDeleteAdapter } if defined?(PostgreSQLAdapter)
38
- IBM_DBAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::GenericDeleteAdapter } if defined?(IBM_DBAdapter)
39
- SQLServerAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::GenericDeleteAdapter } if defined?(SQLServerAdapter)
40
- OracleEnhancedAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::OracleDeleteAdapter } if defined?(OracleEnhancedAdapter)
41
- end
42
- end
43
-
44
- module DatabaseCleaner::ActiveRecord
45
- module SelectiveTruncation
46
- def tables_to_truncate(connection)
47
- if information_schema_exists?(connection)
48
- (@only || tables_with_new_rows(connection)) - @tables_to_exclude
49
- else
50
- super
51
- end
52
- end
53
-
54
- def tables_with_new_rows(connection)
55
- stats = table_stats_query(connection)
56
- if stats != ''
57
- connection.select_values(stats)
58
- else
59
- []
60
- end
61
- end
62
-
63
- def table_stats_query(connection)
64
- @table_stats_query ||= build_table_stats_query(connection)
65
- ensure
66
- @table_stats_query = nil unless @cache_tables
67
- end
68
-
69
- def build_table_stats_query(connection)
70
- tables = connection.select_values(<<-SQL)
71
- SELECT table_name
72
- FROM information_schema.tables
73
- WHERE table_schema = database()
74
- AND #{::DatabaseCleaner::ActiveRecord::Base.exclusion_condition('table_name')};
75
- SQL
76
- queries = tables.map do |table|
77
- "(SELECT #{connection.quote(table)} FROM #{connection.quote_table_name(table)} LIMIT 1)"
78
- end
79
- queries.join(' UNION ALL ')
80
- end
81
-
82
- def information_schema_exists? connection
83
- return false unless connection.is_a? ActiveRecord::ConnectionAdapters::Mysql2Adapter
84
- @information_schema_exists ||=
85
- begin
86
- connection.execute("SELECT 1 FROM information_schema.tables")
87
- true
88
- rescue
89
- false
90
- end
91
- end
92
- end
93
-
94
- class Deletion < Truncation
95
- if defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)
96
- include SelectiveTruncation
97
- end
98
-
99
- def clean
100
- connection = connection_class.connection
101
- connection.disable_referential_integrity do
102
- tables_to_truncate(connection).each do |table_name|
103
- connection.delete_table table_name
104
- end
105
- end
106
- end
107
- end
108
- end
@@ -1,59 +0,0 @@
1
- require 'database_cleaner/active_record/base'
2
- require 'database_cleaner/generic/transaction'
3
-
4
- module DatabaseCleaner::ActiveRecord
5
- class Transaction
6
- include ::DatabaseCleaner::ActiveRecord::Base
7
- include ::DatabaseCleaner::Generic::Transaction
8
-
9
- def start
10
- # Hack to make sure that the connection is properly setup for
11
- # the clean code.
12
- connection_class.connection.transaction{ }
13
-
14
- if connection_maintains_transaction_count?
15
- if connection_class.connection.respond_to?(:increment_open_transactions)
16
- connection_class.connection.increment_open_transactions
17
- else
18
- connection_class.__send__(:increment_open_transactions)
19
- end
20
- end
21
- if connection_class.connection.respond_to?(:begin_transaction)
22
- connection_class.connection.begin_transaction :joinable => false
23
- else
24
- connection_class.connection.begin_db_transaction
25
- end
26
- end
27
-
28
-
29
- def clean
30
- connection_class.connection_pool.connections.each do |connection|
31
- next unless connection.open_transactions > 0
32
-
33
- if connection.respond_to?(:rollback_transaction)
34
- connection.rollback_transaction
35
- else
36
- connection.rollback_db_transaction
37
- end
38
-
39
- # The below is for handling after_commit hooks.. see https://github.com/bmabey/database_cleaner/issues/99
40
- if connection.respond_to?(:rollback_transaction_records, true)
41
- connection.send(:rollback_transaction_records, true)
42
- end
43
-
44
- if connection_maintains_transaction_count?
45
- if connection.respond_to?(:decrement_open_transactions)
46
- connection.decrement_open_transactions
47
- else
48
- connection_class.__send__(:decrement_open_transactions)
49
- end
50
- end
51
- end
52
- end
53
-
54
- def connection_maintains_transaction_count?
55
- ActiveRecord::VERSION::MAJOR < 4
56
- end
57
-
58
- end
59
- end
@@ -1,288 +0,0 @@
1
- require 'active_record/base'
2
- require 'database_cleaner/active_record/base'
3
- require 'active_record/connection_adapters/abstract_adapter'
4
- require 'database_cleaner/deprecation'
5
-
6
- #Load available connection adapters
7
- %w(
8
- abstract_mysql_adapter postgresql_adapter sqlite3_adapter mysql_adapter mysql2_adapter oracle_enhanced_adapter
9
- ).each do |known_adapter|
10
- begin
11
- require "active_record/connection_adapters/#{known_adapter}"
12
- rescue LoadError
13
- end
14
- end
15
-
16
- require "database_cleaner/generic/truncation"
17
- require 'database_cleaner/active_record/base'
18
-
19
- module DatabaseCleaner
20
- module ConnectionAdapters
21
-
22
- module AbstractAdapter
23
- # used to be called views but that can clash with gems like schema_plus
24
- # this gem is not meant to be exposing such an extra interface any way
25
- def database_cleaner_view_cache
26
- @views ||= select_values("select table_name from information_schema.views where table_schema = '#{current_database}'") rescue []
27
- end
28
-
29
- def database_cleaner_table_cache
30
- # the adapters don't do caching (#130) but we make the assumption that the list stays the same in tests
31
- @database_cleaner_tables ||= database_tables
32
- end
33
-
34
- def database_tables
35
- ::ActiveRecord::VERSION::MAJOR >= 5 ? data_sources : tables
36
- end
37
-
38
- def truncate_table(table_name)
39
- raise NotImplementedError
40
- end
41
-
42
- def truncate_tables(tables)
43
- tables.each do |table_name|
44
- self.truncate_table(table_name)
45
- end
46
- end
47
- end
48
-
49
- module AbstractMysqlAdapter
50
- def truncate_table(table_name)
51
- execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
52
- end
53
-
54
- def truncate_tables(tables)
55
- tables.each { |t| truncate_table(t) }
56
- end
57
-
58
- def pre_count_truncate_tables(tables, options = {:reset_ids => true})
59
- filter = options[:reset_ids] ? method(:has_been_used?) : method(:has_rows?)
60
- truncate_tables(tables.select(&filter))
61
- end
62
-
63
- private
64
-
65
- def row_count(table)
66
- # Patch for MysqlAdapter with ActiveRecord 3.2.7 later
67
- # select_value("SELECT 1") #=> "1"
68
- select_value("SELECT EXISTS (SELECT 1 FROM #{quote_table_name(table)} LIMIT 1)").to_i
69
- end
70
-
71
- def auto_increment_value(table)
72
- select_value(<<-SQL).to_i
73
- SELECT auto_increment
74
- FROM information_schema.tables
75
- WHERE table_name = '#{table}'
76
- AND table_schema = database()
77
- SQL
78
- end
79
-
80
- # This method tells us if the given table has been inserted into since its
81
- # last truncation. Note that the table might have been populated, which
82
- # increased the auto-increment counter, but then cleaned again such that
83
- # it appears empty now.
84
- def has_been_used?(table)
85
- has_rows?(table) || auto_increment_value(table) > 1
86
- end
87
-
88
- def has_rows?(table)
89
- row_count(table) > 0
90
- end
91
- end
92
-
93
- module IBM_DBAdapter
94
- def truncate_table(table_name)
95
- execute("TRUNCATE #{quote_table_name(table_name)} IMMEDIATE")
96
- end
97
- end
98
-
99
- module SQLiteAdapter
100
- def delete_table(table_name)
101
- execute("DELETE FROM #{quote_table_name(table_name)};")
102
- if uses_sequence
103
- execute("DELETE FROM sqlite_sequence where name = '#{table_name}';")
104
- end
105
- end
106
- alias truncate_table delete_table
107
-
108
- def truncate_tables(tables)
109
- tables.each { |t| truncate_table(t) }
110
- end
111
-
112
- private
113
-
114
- # Returns a boolean indicating if the SQLite database is using the sqlite_sequence table.
115
- def uses_sequence
116
- select_value("SELECT name FROM sqlite_master WHERE type='table' AND name='sqlite_sequence';")
117
- end
118
- end
119
-
120
- module TruncateOrDelete
121
- def truncate_table(table_name)
122
- begin
123
- execute("TRUNCATE TABLE #{quote_table_name(table_name)};")
124
- rescue ::ActiveRecord::StatementInvalid
125
- execute("DELETE FROM #{quote_table_name(table_name)};")
126
- end
127
- end
128
- end
129
-
130
- module OracleAdapter
131
- def truncate_table(table_name)
132
- execute("TRUNCATE TABLE #{quote_table_name(table_name)}")
133
- end
134
- end
135
-
136
- module PostgreSQLAdapter
137
- def db_version
138
- @db_version ||= postgresql_version
139
- end
140
-
141
- def cascade
142
- @cascade ||= db_version >= 80200 ? 'CASCADE' : ''
143
- end
144
-
145
- def restart_identity
146
- @restart_identity ||= db_version >= 80400 ? 'RESTART IDENTITY' : ''
147
- end
148
-
149
- def truncate_table(table_name)
150
- truncate_tables([table_name])
151
- end
152
-
153
- def truncate_tables(table_names)
154
- return if table_names.nil? || table_names.empty?
155
- execute("TRUNCATE TABLE #{table_names.map{|name| quote_table_name(name)}.join(', ')} #{restart_identity} #{cascade};")
156
- end
157
-
158
- def pre_count_truncate_tables(tables, options = {:reset_ids => true})
159
- filter = options[:reset_ids] ? method(:has_been_used?) : method(:has_rows?)
160
- truncate_tables(tables.select(&filter))
161
- end
162
-
163
- def database_cleaner_table_cache
164
- # AR returns a list of tables without schema but then returns a
165
- # migrations table with the schema. There are other problems, too,
166
- # with using the base list. If a table exists in multiple schemas
167
- # within the search path, truncation without the schema name could
168
- # result in confusing, if not unexpected results.
169
- @database_cleaner_tables ||= tables_with_schema
170
- end
171
-
172
- private
173
-
174
- # Returns a boolean indicating if the given table has an auto-inc number higher than 0.
175
- # Note, this is different than an empty table since an table may populated, the index increased,
176
- # but then the table is cleaned. In other words, this function tells us if the given table
177
- # was ever inserted into.
178
- def has_been_used?(table)
179
- return has_rows?(table) unless has_sequence?(table)
180
-
181
- cur_val = select_value("SELECT currval('#{table}_id_seq');").to_i rescue 0
182
- cur_val > 0
183
- end
184
-
185
- def has_sequence?(table)
186
- select_value("SELECT true FROM pg_class WHERE relname = '#{table}_id_seq';")
187
- end
188
-
189
- def has_rows?(table)
190
- select_value("SELECT true FROM #{table} LIMIT 1;")
191
- end
192
-
193
- def tables_with_schema
194
- rows = select_rows <<-_SQL
195
- SELECT schemaname || '.' || tablename
196
- FROM pg_tables
197
- WHERE
198
- tablename !~ '_prt_' AND
199
- #{::DatabaseCleaner::ActiveRecord::Base.exclusion_condition('tablename')} AND
200
- schemaname = ANY (current_schemas(false))
201
- _SQL
202
- rows.collect { |result| result.first }
203
- end
204
- end
205
- end
206
- end
207
-
208
- module ActiveRecord
209
- module ConnectionAdapters
210
- #Apply adapter decoraters where applicable (adapter should be loaded)
211
- AbstractAdapter.class_eval { include DatabaseCleaner::ConnectionAdapters::AbstractAdapter }
212
-
213
- if defined?(JdbcAdapter)
214
- if defined?(OracleJdbcConnection)
215
- JdbcAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::OracleAdapter }
216
- else
217
- JdbcAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::TruncateOrDelete }
218
- end
219
- end
220
- AbstractMysqlAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::AbstractMysqlAdapter } if defined?(AbstractMysqlAdapter)
221
- Mysql2Adapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::AbstractMysqlAdapter } if defined?(Mysql2Adapter)
222
- MysqlAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::AbstractMysqlAdapter } if defined?(MysqlAdapter)
223
- SQLiteAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::SQLiteAdapter } if defined?(SQLiteAdapter)
224
- SQLite3Adapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::SQLiteAdapter } if defined?(SQLite3Adapter)
225
- PostgreSQLAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::PostgreSQLAdapter } if defined?(PostgreSQLAdapter)
226
- IBM_DBAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::IBM_DBAdapter } if defined?(IBM_DBAdapter)
227
- SQLServerAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::TruncateOrDelete } if defined?(SQLServerAdapter)
228
- OracleEnhancedAdapter.class_eval { include ::DatabaseCleaner::ConnectionAdapters::OracleAdapter } if defined?(OracleEnhancedAdapter)
229
- end
230
- end
231
-
232
- module DatabaseCleaner::ActiveRecord
233
- class Truncation
234
- include ::DatabaseCleaner::ActiveRecord::Base
235
- include ::DatabaseCleaner::Generic::Truncation
236
-
237
- def initialize(*)
238
- super
239
- if !@reset_ids.nil?
240
- DatabaseCleaner.deprecate "The `:reset_ids` option for the ActiveRecord truncation strategy has no effect, and is deprecated. It will be removed in database_cleaner 2.0 with no replacement."
241
- end
242
- end
243
-
244
- def clean
245
- connection = connection_class.connection
246
- connection.disable_referential_integrity do
247
- if pre_count? && connection.respond_to?(:pre_count_truncate_tables)
248
- connection.pre_count_truncate_tables(tables_to_truncate(connection), {:reset_ids => reset_ids?})
249
- else
250
- connection.truncate_tables(tables_to_truncate(connection))
251
- end
252
- end
253
- end
254
-
255
- private
256
-
257
- def tables_to_truncate(connection)
258
- tables_in_db = cache_tables? ? connection.database_cleaner_table_cache : connection.database_tables
259
- to_reject = (@tables_to_exclude + connection.database_cleaner_view_cache)
260
- (@only || tables_in_db).reject do |table|
261
- if ( m = table.match(/([^.]+)$/) )
262
- to_reject.include?(m[1])
263
- else
264
- false
265
- end
266
- end
267
- end
268
-
269
- # overwritten
270
- def migration_storage_names
271
- result = [::DatabaseCleaner::ActiveRecord::Base.migration_table_name]
272
- result << ::ActiveRecord::Base.internal_metadata_table_name if ::ActiveRecord::VERSION::MAJOR >= 5
273
- result
274
- end
275
-
276
- def cache_tables?
277
- !!@cache_tables
278
- end
279
-
280
- def pre_count?
281
- @pre_count == true
282
- end
283
-
284
- def reset_ids?
285
- @reset_ids != false
286
- end
287
- end
288
- end