From 6b8f85d1280f17454e9c59bf7a9873b65a46f08c Mon Sep 17 00:00:00 2001 From: Eric Hutchins Date: Tue, 28 Feb 2017 13:16:24 -0500 Subject: [PATCH 1/2] Make mysql work for databases that are not all lowercase --- lib/database-cleaner.js | 63 ++++++++++++++++++++++------------------- test/mysql.test.js | 21 ++++++-------- 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/lib/database-cleaner.js b/lib/database-cleaner.js index f7fa04a..6d8c33b 100644 --- a/lib/database-cleaner.js +++ b/lib/database-cleaner.js @@ -47,45 +47,50 @@ var DatabaseCleaner = module.exports = function(type, config) { }; cleaner['mysql'] = function(db, callback) { - db.query('show tables', function(err, tables) { - if (err) return callback(err); + db.query('show global variables like "lower_case_table_names"', function(err, values) { - var database = db.config.connectionConfig ? - db.config.connectionConfig.database : db.config.database; + var lowerCaseTableNames = values[0]['Value'] === 2; - 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)); - } + db.query('show tables', function(err, tables) { + if (err) return callback(err); - if(length === 0) { - // The database is empty - return callback(); - } + var database = db.config.connectionConfig ? + db.config.connectionConfig.database : db.config.database; - 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 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; } From d68d41f94d2082258c61c744743ef11b9012b5ff Mon Sep 17 00:00:00 2001 From: Eric Hutchins Date: Wed, 1 Mar 2017 12:16:31 -0500 Subject: [PATCH 2/2] Don't try to truncate views in MySQL --- lib/database-cleaner.js | 66 ++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/lib/database-cleaner.js b/lib/database-cleaner.js index 6d8c33b..c82b70e 100644 --- a/lib/database-cleaner.js +++ b/lib/database-cleaner.js @@ -47,49 +47,53 @@ var DatabaseCleaner = module.exports = function(type, config) { }; cleaner['mysql'] = function(db, callback) { - db.query('show global variables like "lower_case_table_names"', function(err, values) { + db.query('SET FOREIGN_KEY_CHECKS = 0', function(err) { + if (err) return callback(err); - var lowerCaseTableNames = values[0]['Value'] === 2; + db.query('show global variables like "lower_case_table_names"', function(err, values) { - db.query('show tables', function(err, tables) { - if (err) return callback(err); + var lowerCaseTableNames = values[0]['Value'] === 2; - var database = db.config.connectionConfig ? - db.config.connectionConfig.database : db.config.database; + db.query('show full tables where Table_Type != "VIEW"', function(err, tables) { + if (err) return callback(err); - 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)); - } + var database = db.config.connectionConfig ? + db.config.connectionConfig.database : db.config.database; - if(length === 0) { - // The database is empty - return 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)); + } - 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); - } + 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(); } - } + }); }); }); });