69 lines
1.5 KiB
JavaScript
69 lines
1.5 KiB
JavaScript
var PoolSelector = require('./PoolSelector');
|
|
|
|
module.exports = PoolNamespace;
|
|
|
|
/**
|
|
* PoolNamespace
|
|
*/
|
|
function PoolNamespace(cluster, pattern, selector) {
|
|
this._cluster = cluster;
|
|
this._pattern = pattern;
|
|
this._selector = new PoolSelector[selector]();
|
|
}
|
|
|
|
PoolNamespace.prototype.getConnection = function(cb) {
|
|
var clusterNode = this._getClusterNode();
|
|
var cluster = this._cluster;
|
|
var namespace = this;
|
|
|
|
if (clusterNode === null) {
|
|
var err = null;
|
|
|
|
if (this._cluster._findNodeIds(this._pattern, true).length !== 0) {
|
|
err = new Error('Pool does not have online node.');
|
|
err.code = 'POOL_NONEONLINE';
|
|
} else {
|
|
err = new Error('Pool does not exist.');
|
|
err.code = 'POOL_NOEXIST';
|
|
}
|
|
|
|
return cb(err);
|
|
}
|
|
|
|
cluster._getConnection(clusterNode, function(err, connection) {
|
|
var retry = err && cluster._canRetry
|
|
&& cluster._findNodeIds(namespace._pattern).length !== 0;
|
|
|
|
if (retry) {
|
|
return namespace.getConnection(cb);
|
|
}
|
|
|
|
if (err) {
|
|
return cb(err);
|
|
}
|
|
|
|
cb(null, connection);
|
|
});
|
|
};
|
|
|
|
PoolNamespace.prototype._getClusterNode = function _getClusterNode() {
|
|
var foundNodeIds = this._cluster._findNodeIds(this._pattern);
|
|
var nodeId;
|
|
|
|
switch (foundNodeIds.length) {
|
|
case 0:
|
|
nodeId = null;
|
|
break;
|
|
case 1:
|
|
nodeId = foundNodeIds[0];
|
|
break;
|
|
default:
|
|
nodeId = this._selector(foundNodeIds);
|
|
break;
|
|
}
|
|
|
|
return nodeId !== null
|
|
? this._cluster._getNode(nodeId)
|
|
: null;
|
|
};
|