ConnectionPool object used internall by the patio.Database class;
function (options){ options = options || {}; if (!options.createConnection || !isFunction(options.createConnection)) { throw new Error("patio.adapters.clients.ConnectionPool : create connection CB required."); } if (!options.closeConnection || !isFunction(options.closeConnection)) { throw new Error("patio.adapters.clients.ConnectionPool : close connection CB required."); } options.minObjects = parseInt(options.minConnections || 0, 10); options.maxObjects = parseInt(options.maxConnections || 10, 10); this.__deferredQueue = new Queue(); this._options = options; this.__createConnectionCB = options.createConnection; this.__closeConnectionCB = options.closeConnection; this.__validateConnectionCB = options.validateConnection; this._super(arguments); }
Checks all deferred connection requests.
Sourcefunction (){ var fc = this.freeCount, def, defQueue = this.__deferredQueue; while (fc-- >= 0 && defQueue.count) { def = defQueue.dequeue(); var conn = this.getObject(); if (conn) { def.callback(conn); } else { throw new Error("UNEXPECTED ERROR"); } fc--; } }
Override to implement close connection functionality;
Argumentsthe connection to close;
comb.Promise
called back when the connection is closed.
function (conn){ return this.__closeConnectionCB(conn); }
Override to create connections to insert into this ConnectionPool.
Sourcefunction (){ return this.__createConnectionCB(this._options); }
Override to implement the closing of all connections.
Returnscomb.Promise
called when all connections are closed.
function (){ this.__ending = true; var conn, fQueue = this.__freeObjects, count = this.count, ps = []; while ((conn = this.__freeObjects.dequeue()) !== undefined) { ps.push(this.closeConnection(conn)); } var inUse = this.__inUseObjects; for (var i = inUse.length - 1; i >= 0; i--) { ps.push(this.closeConnection(inUse[i])); } this.__inUseObjects.length = 0; return new PromiseList(ps).promise(); }
Performs a query on one of the connection in this Pool.
Returnscomb.Promise
A promise to called back with a connection.
function (){ var ret = new Promise(), conn; if (this.count > this.__maxObjects) { this.__deferredQueue.enqueue(ret); } else { //todo override getObject to make async so creating a connetion can execute setup sql conn = this.getObject(); if (!conn) { //we need to deffer it this.__deferredQueue.enqueue(ret); } else { ret.callback(conn); } } if (this.count > this.__maxObjects && !conn) { ret.errback(new Error("Unexpected ConnectionPool error")); } return ret.promise(); }
Removes a connection from the pool.
Argumentsfunction (conn){ this.closeConnection(conn); return this.removeObject(conn); }
Return a connection to the pool.
Argumentsthe connection to return.
*
an adapter specific connection.
function (connection){ this.returnObject(connection); }
Override comb.collections.Pool to allow async validation to allow pools to do any calls to reset a connection if it needs to be done.
Arguments*
: the connection to return.
function (obj){ var self = this; this.validate(obj).chain(function (valid) { var index; if (self.count <= self.__maxObjects && valid && (index = self.__inUseObjects.indexOf(obj)) > -1) { self.__inUseObjects.splice(index, 1); self.__freeObjects.enqueue(obj); self.__checkQueries(); } else { self.removeObject(obj); } }); }
Override to provide any additional validation. By default the promise is called back with true.
Arguments*
: the conneciton to validate.
comb.Promise
called back with a valid or invalid state.
function (conn){ if (!this.__validateConnectionCB) { var ret = new Promise(); ret.callback(true); return ret; } else { return this.__validateConnectionCB(conn); } }