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; | ||
|  | }; |