UNPKG

wait-for-mysql

Version:
134 lines (124 loc) 5.86 kB
// Generated by CoffeeScript 1.9.3 (function() { var Q, durations, mysql, program, runScript, waitForMysql; Q = require('q'); mysql = require('mysql'); program = require('commander'); durations = require('durations'); waitForMysql = function(config) { var attempts, connectTimeout, connectWatch, deferred, pool, quiet, testConnection, totalTimeout, watch; deferred = Q.defer(); connectTimeout = config.connectTimeout; totalTimeout = config.totalTimeout; quiet = config.quiet; watch = durations.stopwatch().start(); connectWatch = durations.stopwatch(); attempts = 0; pool = mysql.createPool(config); testConnection = function() { attempts += 1; connectWatch.reset().start(); return pool.getConnection(function(error, client) { var connectDelay, queryString, totalRemaining; if (error != null) { if (!quiet) { console.log("[" + error + "] Attempt " + attempts + " timed out. Time elapsed: " + watch); } if (watch.duration().millis() > totalTimeout) { connectWatch.stop(); if (!quiet) { console.log("Could not connect to MySQL."); } pool.end(function(error) { if (!quiet) { return console.log("Error shutting down the MySQL connection pool."); } }); return deferred.resolve(1); } else { totalRemaining = Math.min(connectTimeout, Math.max(0, totalTimeout - watch.duration().millis())); connectDelay = Math.min(totalRemaining, Math.max(0, connectTimeout - connectWatch.duration().millis())); return setTimeout(testConnection, connectDelay); } } else { connectWatch.stop(); if (config.query != null) { queryString = config.query; console.log("Connected. Running test query: '" + queryString + "'"); return client.query(queryString, function(error, rows) { console.log("Query done."); client.release(); if (error) { if (!quiet) { console.log("[" + error + "] Attempt " + attempts + " query failure. Time elapsed: " + watch); } if (watch.duration().millis() > totalTimeout) { if (!quiet) { console.log("MySQL test query failed."); } return deferred.resolve(1); } else { totalRemaining = Math.min(connectTimeout, Math.max(0, totalTimeout - watch.duration().millis())); connectDelay = Math.min(totalRemaining, Math.max(0, connectTimeout - connectWatch.duration().millis())); return setTimeout(testConnection, connectDelay); } } else { watch.stop(); console.log("Query succeeded. " + attempts + " attempts over " + watch); pool.end(function(error) { if (!quiet) { return console.log("Error shutting down the MySQL connection pool."); } }); return deferred.resolve(0); } }); } else { watch.stop(); console.log("Connected. " + attempts + " attempts over " + watch); client.release(); pool.end(function(error) { if (!quiet) { return console.log("Error shutting down the MySQL connection pool."); } }); return deferred.resolve(0); } } }); }; testConnection(); return deferred.promise; }; runScript = function() { var config, ref, ref1, ref10, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9; program.option('-D, --database <db_name>', 'MySQL database (default is mysql)').option('-h, --host <hostname>', 'MySQL host (default is localhost)').option('-i, --insecure-auth', 'Use insecure auth method (default is secure method)').option('-p, --port <port>', 'MySQL port (default is 3306)', parseInt).option('-P, --password <password>', 'MySQL user password (default is empty)').option('-q, --quiet', 'Silence non-error output (default is false)').option('-Q, --query <query_string>', 'Custom query to confirm database state').option('-t, --connect-timeout <milliseconds>', 'Individual connection attempt timeout (default is 250)', parseInt).option('-T, --total-timeout <milliseconds>', 'Total timeout across all connect attempts (dfault is 15000)', parseInt).option('-u, --username <username>', 'Posgres user name (default is mysql)').parse(process.argv); config = { host: (ref = program.host) != null ? ref : 'localhost', port: (ref1 = program.port) != null ? ref1 : 3306, user: (ref2 = program.username) != null ? ref2 : 'mysql', password: (ref3 = program.password) != null ? ref3 : '', database: (ref4 = program.database) != null ? ref4 : 'mysql', totalTimeout: (ref5 = program.totalTimeout) != null ? ref5 : 15000, query: (ref6 = program.query) != null ? ref6 : null, quiet: (ref7 = program.quiet) != null ? ref7 : false, insecureAuth: (ref8 = program.insecureAuth) != null ? ref8 : false, acquireTimeout: (ref9 = program.connectTimeout) != null ? ref9 : 250, connectTimeout: (ref10 = program.connectTimeout) != null ? ref10 : 250, connectionLimit: 1, queueLimit: 1, waitForConnections: false }; return waitForMysql(config).then(function(code) { return process.exit(code); }); }; module.exports = { await: waitForMysql, run: runScript }; if (require.main === module) { console.log("Running the script..."); runScript(); } }).call(this);