203 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			203 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | const SqlString = require('sqlstring'); | ||
|  | const EventEmitter = require('events').EventEmitter; | ||
|  | const parserCache = require('./lib/parsers/parser_cache.js'); | ||
|  | const PoolCluster = require('./lib/pool_cluster.js'); | ||
|  | const createConnection = require('./lib/create_connection.js'); | ||
|  | const createPool = require('./lib/create_pool.js'); | ||
|  | const createPoolCluster = require('./lib/create_pool_cluster.js'); | ||
|  | const PromiseConnection = require('./lib/promise/connection.js'); | ||
|  | const PromisePool = require('./lib/promise/pool.js'); | ||
|  | const makeDoneCb = require('./lib/promise/make_done_cb.js'); | ||
|  | const PromisePoolConnection = require('./lib/promise/pool_connection.js'); | ||
|  | const inheritEvents = require('./lib/promise/inherit_events.js'); | ||
|  | const PromisePoolNamespace = require('./lib/promise/pool_cluster'); | ||
|  | 
 | ||
|  | function createConnectionPromise(opts) { | ||
|  |   const coreConnection = createConnection(opts); | ||
|  |   const createConnectionErr = new Error(); | ||
|  |   const thePromise = opts.Promise || Promise; | ||
|  |   if (!thePromise) { | ||
|  |     throw new Error( | ||
|  |       'no Promise implementation available.' + | ||
|  |         'Use promise-enabled node version or pass userland Promise' + | ||
|  |         " implementation as parameter, for example: { Promise: require('bluebird') }" | ||
|  |     ); | ||
|  |   } | ||
|  |   return new thePromise((resolve, reject) => { | ||
|  |     coreConnection.once('connect', () => { | ||
|  |       resolve(new PromiseConnection(coreConnection, thePromise)); | ||
|  |     }); | ||
|  |     coreConnection.once('error', (err) => { | ||
|  |       createConnectionErr.message = err.message; | ||
|  |       createConnectionErr.code = err.code; | ||
|  |       createConnectionErr.errno = err.errno; | ||
|  |       createConnectionErr.sqlState = err.sqlState; | ||
|  |       reject(createConnectionErr); | ||
|  |     }); | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | // note: the callback of "changeUser" is not called on success
 | ||
|  | // hence there is no possibility to call "resolve"
 | ||
|  | 
 | ||
|  | function createPromisePool(opts) { | ||
|  |   const corePool = createPool(opts); | ||
|  |   const thePromise = opts.Promise || Promise; | ||
|  |   if (!thePromise) { | ||
|  |     throw new Error( | ||
|  |       'no Promise implementation available.' + | ||
|  |         'Use promise-enabled node version or pass userland Promise' + | ||
|  |         " implementation as parameter, for example: { Promise: require('bluebird') }" | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   return new PromisePool(corePool, thePromise); | ||
|  | } | ||
|  | 
 | ||
|  | class PromisePoolCluster extends EventEmitter { | ||
|  |   constructor(poolCluster, thePromise) { | ||
|  |     super(); | ||
|  |     this.poolCluster = poolCluster; | ||
|  |     this.Promise = thePromise || Promise; | ||
|  |     inheritEvents(poolCluster, this, ['warn', 'remove', 'online', 'offline']); | ||
|  |   } | ||
|  | 
 | ||
|  |   getConnection(pattern, selector) { | ||
|  |     const corePoolCluster = this.poolCluster; | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       corePoolCluster.getConnection( | ||
|  |         pattern, | ||
|  |         selector, | ||
|  |         (err, coreConnection) => { | ||
|  |           if (err) { | ||
|  |             reject(err); | ||
|  |           } else { | ||
|  |             resolve(new PromisePoolConnection(coreConnection, this.Promise)); | ||
|  |           } | ||
|  |         } | ||
|  |       ); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   query(sql, args) { | ||
|  |     const corePoolCluster = this.poolCluster; | ||
|  |     const localErr = new Error(); | ||
|  |     if (typeof args === 'function') { | ||
|  |       throw new Error( | ||
|  |         'Callback function is not available with promise clients.' | ||
|  |       ); | ||
|  |     } | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       const done = makeDoneCb(resolve, reject, localErr); | ||
|  |       corePoolCluster.query(sql, args, done); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   execute(sql, args) { | ||
|  |     const corePoolCluster = this.poolCluster; | ||
|  |     const localErr = new Error(); | ||
|  |     if (typeof args === 'function') { | ||
|  |       throw new Error( | ||
|  |         'Callback function is not available with promise clients.' | ||
|  |       ); | ||
|  |     } | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       const done = makeDoneCb(resolve, reject, localErr); | ||
|  |       corePoolCluster.execute(sql, args, done); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   of(pattern, selector) { | ||
|  |     return new PromisePoolNamespace( | ||
|  |       this.poolCluster.of(pattern, selector), | ||
|  |       this.Promise | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   end() { | ||
|  |     const corePoolCluster = this.poolCluster; | ||
|  |     const localErr = new Error(); | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       corePoolCluster.end((err) => { | ||
|  |         if (err) { | ||
|  |           localErr.message = err.message; | ||
|  |           localErr.code = err.code; | ||
|  |           localErr.errno = err.errno; | ||
|  |           localErr.sqlState = err.sqlState; | ||
|  |           localErr.sqlMessage = err.sqlMessage; | ||
|  |           reject(localErr); | ||
|  |         } else { | ||
|  |           resolve(); | ||
|  |         } | ||
|  |       }); | ||
|  |     }); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * proxy poolCluster synchronous functions | ||
|  |  */ | ||
|  | (function (functionsToWrap) { | ||
|  |   for (let i = 0; functionsToWrap && i < functionsToWrap.length; i++) { | ||
|  |     const func = functionsToWrap[i]; | ||
|  | 
 | ||
|  |     if ( | ||
|  |       typeof PoolCluster.prototype[func] === 'function' && | ||
|  |       PromisePoolCluster.prototype[func] === undefined | ||
|  |     ) { | ||
|  |       PromisePoolCluster.prototype[func] = (function factory(funcName) { | ||
|  |         return function () { | ||
|  |           return PoolCluster.prototype[funcName].apply( | ||
|  |             this.poolCluster, | ||
|  |             arguments | ||
|  |           ); | ||
|  |         }; | ||
|  |       })(func); | ||
|  |     } | ||
|  |   } | ||
|  | })(['add', 'remove']); | ||
|  | 
 | ||
|  | function createPromisePoolCluster(opts) { | ||
|  |   const corePoolCluster = createPoolCluster(opts); | ||
|  |   const thePromise = (opts && opts.Promise) || Promise; | ||
|  |   if (!thePromise) { | ||
|  |     throw new Error( | ||
|  |       'no Promise implementation available.' + | ||
|  |         'Use promise-enabled node version or pass userland Promise' + | ||
|  |         " implementation as parameter, for example: { Promise: require('bluebird') }" | ||
|  |     ); | ||
|  |   } | ||
|  |   return new PromisePoolCluster(corePoolCluster, thePromise); | ||
|  | } | ||
|  | 
 | ||
|  | exports.createConnection = createConnectionPromise; | ||
|  | exports.createPool = createPromisePool; | ||
|  | exports.createPoolCluster = createPromisePoolCluster; | ||
|  | exports.escape = SqlString.escape; | ||
|  | exports.escapeId = SqlString.escapeId; | ||
|  | exports.format = SqlString.format; | ||
|  | exports.raw = SqlString.raw; | ||
|  | exports.PromisePool = PromisePool; | ||
|  | exports.PromiseConnection = PromiseConnection; | ||
|  | exports.PromisePoolConnection = PromisePoolConnection; | ||
|  | 
 | ||
|  | exports.__defineGetter__('Types', () => require('./lib/constants/types.js')); | ||
|  | 
 | ||
|  | exports.__defineGetter__('Charsets', () => | ||
|  |   require('./lib/constants/charsets.js') | ||
|  | ); | ||
|  | 
 | ||
|  | exports.__defineGetter__('CharsetToEncoding', () => | ||
|  |   require('./lib/constants/charset_encodings.js') | ||
|  | ); | ||
|  | 
 | ||
|  | exports.setMaxParserCache = function (max) { | ||
|  |   parserCache.setMaxCache(max); | ||
|  | }; | ||
|  | 
 | ||
|  | exports.clearParserCache = function () { | ||
|  |   parserCache.clearCache(); | ||
|  | }; |