database_cleaner 1.99.0 → 2.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
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