sqlite-proxy
Version:
Proxy for sqlite3
125 lines (106 loc) • 2.86 kB
JavaScript
var net = require('net');
function splitMergedJSON(data) {
return data.split('}{').map(function (item,index,arr) {
return (index ? '{' : '') + item + (index==arr.length-1 ? '' : '}');
});
}
module.exports.Server = function(path,cb) {
var sqlite3= require('sqlite3');
var db = new sqlite3.Database(path);
var net = require('net');
var randport = require('randport');
randport(function(error,port) {
if(error && cb) {
return cb(error);
}
net.createServer(function(socket) {
socket.on('data',function(data) {
splitMergedJSON(data.toString()).forEach(function(data) {
data = JSON.parse(data.toString());
var args=data.msg;
function sendback (error) {
if(error) {
console.log(error);
}
var sending = JSON.stringify(
{mark:data.mark,
context:{lastID:this.lastID},
msg:arguments});
console.log('sending:',sending);
socket.write(sending);
}
args.push(sendback);
console.log('action:',data.action);
sqlite3.Database.prototype[data.action].apply(db,args);
});
});
}).listen(port);
if(cb) {
cb(null,port);
}
else {
console.log(port);
}
});
};
var cbs = {};
function Client(port) {
this.socket = net.connect({port:port});
this.socket.on('data',function(data) {
var data=data.toString();
console.log('json:',data);
splitMergedJSON(data).forEach(function(data) {
data=JSON.parse(data);
var args=require('lodash').valuesIn(data.msg);
console.log('cb mark:',data.mark,args);
cbs[data.mark].apply(data.context,args);
process.nextTick(function () {
//delete cbs[data.mark];
});
});
});
}
var querycount=0;
Client.prototype.run = function () {
if(arguments < 3) {
throw 'Insufficent arguments';
}
var args=Array.prototype.slice.call(arguments);
var action = args.shift();
var cb=args.pop();
var id = ++querycount;
cbs[id] = cb;
this.socket.write(JSON.stringify({mark:id,action:action,msg:args}));
};
Client.prototype.query = function () {
if(arguments.length < 2) {
throw 'Insufficent arguments';
}
var args = Array.prototype.slice.call(arguments);
var cb = args.pop();
var id = ++querycount;
cbs[id]=cb;
this.socket.write(JSON.stringify({mark:id,action:'all',msg:args}));
};
module.exports.Client = Client;
module.exports.launchProxy = function(path,cb) {
console.log('hi');
var client;
var n=require('child_process').spawn('node',['-e','require("sqlite-proxy").Server("'+path+'")']);
n.stdout.on('data',function(data) {
console.log('sql-server:',data.toString());
if(!client) {
var port=parseInt(data.toString().split('\n')[0]);
if(port) {
client=new Client(port);
cb(null,client);
}
}
});
n.stderr.on('data',function(data) {
console.log('sql-server-error:',data.toString());
});
process.on('exit',function () {
n.kill();
});
};