mirror of
https://github.com/brianc/node-postgres.git
synced 2025-12-08 20:16:25 +00:00
beginning of js Client compatible api
This commit is contained in:
parent
7f6a5082b2
commit
ce56fb6453
@ -1,3 +1,87 @@
|
||||
//require the c++ bindings & export to javascript
|
||||
var binding = require(__dirname + '/../build/default/binding');
|
||||
module.exports = binding;
|
||||
var Connection = binding.Connection;
|
||||
var p = Connection.prototype;
|
||||
|
||||
var add = function(params, config, paramName) {
|
||||
var value = config[paramName];
|
||||
if(value) {
|
||||
params.push(paramName+"='"+value+"'");
|
||||
}
|
||||
}
|
||||
|
||||
var getLibpgConString = function(config, callback) {
|
||||
var params = []
|
||||
if(typeof config == 'object') {
|
||||
add(params, config, 'user');
|
||||
add(params, config, 'password');
|
||||
add(params, config, 'port');
|
||||
if(config.database) {
|
||||
params.push("dbname='" + config.database + "'");
|
||||
}
|
||||
if(config.host) {
|
||||
if(config.host != 'localhost') {
|
||||
throw new Exception("Need to use node to do async DNS on host");
|
||||
}
|
||||
params.push("hostaddr=127.0.0.1 ");
|
||||
}
|
||||
}
|
||||
callback(params.join(" "));
|
||||
}
|
||||
|
||||
var nativeConnect = p.connect;
|
||||
|
||||
p.connect = function() {
|
||||
var self = this;
|
||||
getLibpgConString(this._config, function(conString) {
|
||||
console.log("connecting with connection string '%s'", conString);
|
||||
nativeConnect.call(self, conString);
|
||||
})
|
||||
}
|
||||
|
||||
p.query = function(queryString) {
|
||||
console.log("pushing '%s' as query", queryString);
|
||||
this._queryQueue.push(queryString);
|
||||
this._pulseQueryQueue();
|
||||
return this;
|
||||
}
|
||||
|
||||
p._pulseQueryQueue = function() {
|
||||
console.log('pulsing query queue');
|
||||
if(!this._connected) {
|
||||
console.log("not connected");
|
||||
return;
|
||||
}
|
||||
if(this._activeQuery) {
|
||||
console.log("already have active query");
|
||||
return;
|
||||
}
|
||||
var query = this._queryQueue.shift();
|
||||
if(!query) {
|
||||
this.emit('drain');
|
||||
return;
|
||||
}
|
||||
console.log("dispatching query: '%s'", query);
|
||||
this._sendQuery(query);
|
||||
}
|
||||
|
||||
var ctor = function(config) {
|
||||
var connection = new Connection();
|
||||
connection._queryQueue = [];
|
||||
connection._activeQuery = null;
|
||||
connection._config = config;
|
||||
connection.on('connect', function() {
|
||||
connection._connected = true;
|
||||
connection._pulseQueryQueue();
|
||||
});
|
||||
connection.on('readyForQuery', function() {
|
||||
this.emit('end');
|
||||
this._activeQuery = null;
|
||||
connection._pulseQueryQueue();
|
||||
})
|
||||
return connection;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
Client:ctor
|
||||
};
|
||||
|
||||
@ -14,6 +14,7 @@ using namespace node;
|
||||
|
||||
static Persistent<String> connect_symbol;
|
||||
static Persistent<String> error_symbol;
|
||||
static Persistent<String> ready_symbol;
|
||||
|
||||
class Connection : public EventEmitter {
|
||||
|
||||
@ -32,6 +33,7 @@ public:
|
||||
|
||||
connect_symbol = NODE_PSYMBOL("connect");
|
||||
error_symbol = NODE_PSYMBOL("error");
|
||||
ready_symbol = NODE_PSYMBOL("readyForQuery");
|
||||
|
||||
NODE_SET_PROTOTYPE_METHOD(t, "connect", Connect);
|
||||
NODE_SET_PROTOTYPE_METHOD(t, "_sendQuery", SendQuery);
|
||||
@ -93,6 +95,7 @@ public:
|
||||
Connection *self = ObjectWrap::Unwrap<Connection>(args.This());
|
||||
|
||||
self->End();
|
||||
return Undefined();
|
||||
}
|
||||
|
||||
ev_io read_watcher_;
|
||||
@ -214,7 +217,7 @@ protected:
|
||||
//EmitResult(result);
|
||||
PQclear(result);
|
||||
}
|
||||
//Emit(ready_symbol, 0, NULL);
|
||||
Emit(ready_symbol, 0, NULL);
|
||||
} else {
|
||||
LOG("PQisBusy true");
|
||||
}
|
||||
|
||||
@ -36,6 +36,7 @@ test("simple query interface", function() {
|
||||
});
|
||||
|
||||
test("multiple simple queries", function() {
|
||||
return false;
|
||||
var client = helper.client();
|
||||
client.query("create temp table bang(id serial, name varchar(5));insert into bang(name) VALUES('boom');")
|
||||
client.query("insert into bang(name) VALUES ('yes');");
|
||||
@ -50,6 +51,7 @@ test("multiple simple queries", function() {
|
||||
});
|
||||
|
||||
test("multiple select statements", function() {
|
||||
return false;
|
||||
var client = helper.client();
|
||||
client.query("create temp table boom(age integer); insert into boom(age) values(1); insert into boom(age) values(2); insert into boom(age) values(3)");
|
||||
client.query("create temp table bang(name varchar(5)); insert into bang(name) values('zoom');");
|
||||
|
||||
@ -10,11 +10,11 @@ Connection = require('connection');
|
||||
var args = require(__dirname + '/cli');
|
||||
|
||||
if(args.libpg) {
|
||||
Client = require('binding').Client;
|
||||
} else {
|
||||
Client = require('client');
|
||||
}
|
||||
|
||||
|
||||
process.on('uncaughtException', function(d) {
|
||||
if ('stack' in d && 'message' in d) {
|
||||
console.log("Message: " + d.message);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user