wait-for-mysql
Version:
Wait for a MySQL connection to become available
134 lines (124 loc) • 5.86 kB
JavaScript
// 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);