noradle
Version:
A NodeJS and Oracle DB integration, NodeJS act as http gateway for plsql server pages
96 lines (80 loc) • 2.42 kB
JavaScript
var spawn = require('child_process').spawn;
try {
var setting = require(process.argv[2]);
} catch (e) {
// console.error(e);
console.log('usage: node SPLancher.js path_to_the_setting_file');
console.log('setting file content like:');
console.log(" module.exports = { 'user/pass@connid' : { 'server_config_t.cfg_id' : number_of_servers } };");
process.exit(1);
}
var oper = process.argv[3] || 'start';
function startServer(connStr, cfg, slot){
var sqlplus = spawn('sqlplus', [connStr])
, sql = "exec gateway.listen('" + cfg + "'," + slot + ")"
, lastData
;
sqlplus.stdin.write('SET SERVEROUTPUT ON\n');
sqlplus.stdin.write("alter session set NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';\n");
sqlplus.stdin.write(sql + '\n');
sqlplus.stdin.write('exit\n');
console.log(sql);
sqlplus.stdout.on('data', function(data){
var text = data.toString();
if (text.match(/^Noradle Server Status:\w+/)) {
lastData = text.split('.')[0].split(':')[1];
}
});
sqlplus.stderr.on('data', function(data){
// console.error('ps stderr: ' + data.toString());
});
sqlplus.on('error', function(e){
console.error(connstr, cfg, slot, e);
});
sqlplus.on('close', function(code){
console.log('last data', lastData);
if (lastData === 'restart') {
console.log('server quit and restarting.', connStr, cfg, slot);
startServer(connStr, cfg, slot);
}
if (code !== 0) {
console.log('ps process exited with code ' + code);
}
});
}
function stopServer(connStr, cfg){
var sqlplus = spawn('sqlplus', [connStr])
, sql = "exec kill('" + cfg + "')"
, lastData
;
sqlplus.stdin.write(sql + '\nexit\n');
console.log(sql);
sqlplus.stdout.on('data', function(data){
;
});
sqlplus.stderr.on('data', function(data){
;
});
sqlplus.on('close', function(code){
if (code !== 0) {
console.log('ps process exited with code ' + code);
}
});
}
if (oper === 'start') {
for (connStr in setting) {
var cfgs = setting[connStr];
for (var cfg in cfgs) {
for (var i = 1; i <= cfgs[cfg]; i++) {
startServer(connStr, cfg, i);
}
}
}
} else {
for (connStr in setting) {
var cfgs = setting[connStr];
for (var cfg in cfgs) {
stopServer(connStr, cfg);
}
}
}