diff --git a/lib/database-cleaner.js b/lib/database-cleaner.js index f7fa04a..c82b70e 100644 --- a/lib/database-cleaner.js +++ b/lib/database-cleaner.js @@ -47,45 +47,54 @@ var DatabaseCleaner = module.exports = function(type, config) { }; cleaner['mysql'] = function(db, callback) { - db.query('show tables', function(err, tables) { + db.query('SET FOREIGN_KEY_CHECKS = 0', function(err) { if (err) return callback(err); - var database = db.config.connectionConfig ? - db.config.connectionConfig.database : db.config.database; + db.query('show global variables like "lower_case_table_names"', function(err, values) { - var count = 0; - var length = tables.length; - var tableName = 'Tables_in_' + database; - var skippedTables = config.mysql.skipTables; - var strategy = config.mysql.strategy || 'deletion'; - if (strategy !== 'deletion' && strategy !== 'truncation') { - return callback(new Error('Invalid deletion strategy: ' + strategy)); - } + var lowerCaseTableNames = values[0]['Value'] === 2; - if(length === 0) { - // The database is empty - return callback(); - } + db.query('show full tables where Table_Type != "VIEW"', function(err, tables) { + if (err) return callback(err); - tables.forEach(function(table) { - if (skippedTables.indexOf(table[tableName]) === -1) { - var statement = strategy === 'deletion' ? 'DELETE FROM ' : 'TRUNCATE TABLE ' - db.query(statement + table[tableName], function(err) { - if(err) { - return callback(err); - } + var database = db.config.connectionConfig ? + db.config.connectionConfig.database : db.config.database; - count++; - if (count >= length) { - callback(); + var count = 0; + var length = tables.length; + var tableName = 'Tables_in_' + (lowerCaseTableNames ? database.toLowerCase() : database); + var skippedTables = config.mysql.skipTables; + var strategy = config.mysql.strategy || 'deletion'; + if (strategy !== 'deletion' && strategy !== 'truncation') { + return callback(new Error('Invalid deletion strategy: ' + strategy)); + } + + if(length === 0) { + // The database is empty + return callback(); + } + + tables.forEach(function(table) { + if (skippedTables.indexOf(table[tableName]) === -1) { + var statement = (strategy === 'deletion') ? 'DELETE FROM ' : 'TRUNCATE TABLE '; + db.query(statement + table[tableName], function(err) { + if(err) { + return callback(err); + } + + count++; + if (count >= length) { + callback(); + } + }); + } else { + count++; + if (count >= length) { + callback(); + } } }); - } else { - count++; - if (count >= length) { - callback(); - } - } + }); }); }); }; diff --git a/test/mysql.test.js b/test/mysql.test.js index 6eb9499..db579ef 100644 --- a/test/mysql.test.js +++ b/test/mysql.test.js @@ -4,17 +4,14 @@ var should = require('should'), async = require('async'), databaseCleaner; +var config = { + host: process.env.MYSQL_HOST || 'localhost', + user: 'root', + database: 'database_cleaner' +} var mysql = require('mysql'), - client = new mysql.createConnection({ - host: process.env.MYSQL_HOST || 'localhost', - user: 'root', - database: 'database_cleaner' - }), - pool = new mysql.createPool({ - host: process.env.MYSQL_HOST || 'localhost', - user: 'root', - database: 'database_cleaner' - }); + client = new mysql.createConnection(config), + pool = new mysql.createPool(config); var queryClient = _.curry(function(query, values, next) { client.query(query, values, next); @@ -22,7 +19,7 @@ var queryClient = _.curry(function(query, values, next) { describe('mysql', function() { beforeEach(function(done) { - client.query('CREATE DATABASE database_cleaner', function(err) { + client.query('CREATE DATABASE ' + config.database, function(err) { if (err && err.number != mysql.ERROR_DB_CREATE_EXISTS) { throw err; } @@ -145,7 +142,7 @@ describe('mysql', function() { describe('mysql empty', function() { beforeEach(function(done) { - client.query('CREATE DATABASE database_cleaner', function(err) { + client.query('CREATE DATABASE ' + config.database, function(err) { if (err && err.number != mysql.ERROR_DB_CREATE_EXISTS) { throw err; }