223 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			223 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | const EventEmitter = require('events').EventEmitter; | ||
|  | const PromisePreparedStatementInfo = require('./prepared_statement_info.js'); | ||
|  | const makeDoneCb = require('./make_done_cb.js'); | ||
|  | const inheritEvents = require('./inherit_events.js'); | ||
|  | const BaseConnection = require('../base/connection.js'); | ||
|  | 
 | ||
|  | class PromiseConnection extends EventEmitter { | ||
|  |   constructor(connection, promiseImpl) { | ||
|  |     super(); | ||
|  |     this.connection = connection; | ||
|  |     this.Promise = promiseImpl || Promise; | ||
|  |     inheritEvents(connection, this, [ | ||
|  |       'error', | ||
|  |       'drain', | ||
|  |       'connect', | ||
|  |       'end', | ||
|  |       'enqueue', | ||
|  |     ]); | ||
|  |   } | ||
|  | 
 | ||
|  |   release() { | ||
|  |     this.connection.release(); | ||
|  |   } | ||
|  | 
 | ||
|  |   query(query, params) { | ||
|  |     const c = this.connection; | ||
|  |     const localErr = new Error(); | ||
|  |     if (typeof params === 'function') { | ||
|  |       throw new Error( | ||
|  |         'Callback function is not available with promise clients.' | ||
|  |       ); | ||
|  |     } | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       const done = makeDoneCb(resolve, reject, localErr); | ||
|  |       if (params !== undefined) { | ||
|  |         c.query(query, params, done); | ||
|  |       } else { | ||
|  |         c.query(query, done); | ||
|  |       } | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   execute(query, params) { | ||
|  |     const c = this.connection; | ||
|  |     const localErr = new Error(); | ||
|  |     if (typeof params === 'function') { | ||
|  |       throw new Error( | ||
|  |         'Callback function is not available with promise clients.' | ||
|  |       ); | ||
|  |     } | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       const done = makeDoneCb(resolve, reject, localErr); | ||
|  |       if (params !== undefined) { | ||
|  |         c.execute(query, params, done); | ||
|  |       } else { | ||
|  |         c.execute(query, done); | ||
|  |       } | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   end() { | ||
|  |     return new this.Promise((resolve) => { | ||
|  |       this.connection.end(resolve); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   beginTransaction() { | ||
|  |     const c = this.connection; | ||
|  |     const localErr = new Error(); | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       const done = makeDoneCb(resolve, reject, localErr); | ||
|  |       c.beginTransaction(done); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   commit() { | ||
|  |     const c = this.connection; | ||
|  |     const localErr = new Error(); | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       const done = makeDoneCb(resolve, reject, localErr); | ||
|  |       c.commit(done); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   rollback() { | ||
|  |     const c = this.connection; | ||
|  |     const localErr = new Error(); | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       const done = makeDoneCb(resolve, reject, localErr); | ||
|  |       c.rollback(done); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   ping() { | ||
|  |     const c = this.connection; | ||
|  |     const localErr = new Error(); | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       c.ping((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(true); | ||
|  |         } | ||
|  |       }); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   connect() { | ||
|  |     const c = this.connection; | ||
|  |     const localErr = new Error(); | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       c.connect((err, param) => { | ||
|  |         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(param); | ||
|  |         } | ||
|  |       }); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   prepare(options) { | ||
|  |     const c = this.connection; | ||
|  |     const promiseImpl = this.Promise; | ||
|  |     const localErr = new Error(); | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       c.prepare(options, (err, statement) => { | ||
|  |         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 { | ||
|  |           const wrappedStatement = new PromisePreparedStatementInfo( | ||
|  |             statement, | ||
|  |             promiseImpl | ||
|  |           ); | ||
|  |           resolve(wrappedStatement); | ||
|  |         } | ||
|  |       }); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   changeUser(options) { | ||
|  |     const c = this.connection; | ||
|  |     const localErr = new Error(); | ||
|  |     return new this.Promise((resolve, reject) => { | ||
|  |       c.changeUser(options, (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(); | ||
|  |         } | ||
|  |       }); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   get config() { | ||
|  |     return this.connection.config; | ||
|  |   } | ||
|  | 
 | ||
|  |   get threadId() { | ||
|  |     return this.connection.threadId; | ||
|  |   } | ||
|  | } | ||
|  | // patching PromiseConnection
 | ||
|  | // create facade functions for prototype functions on "Connection" that are not yet
 | ||
|  | // implemented with PromiseConnection
 | ||
|  | 
 | ||
|  | // proxy synchronous functions only
 | ||
|  | (function (functionsToWrap) { | ||
|  |   for (let i = 0; functionsToWrap && i < functionsToWrap.length; i++) { | ||
|  |     const func = functionsToWrap[i]; | ||
|  | 
 | ||
|  |     if ( | ||
|  |       typeof BaseConnection.prototype[func] === 'function' && | ||
|  |       PromiseConnection.prototype[func] === undefined | ||
|  |     ) { | ||
|  |       PromiseConnection.prototype[func] = (function factory(funcName) { | ||
|  |         return function () { | ||
|  |           return BaseConnection.prototype[funcName].apply( | ||
|  |             this.connection, | ||
|  |             arguments | ||
|  |           ); | ||
|  |         }; | ||
|  |       })(func); | ||
|  |     } | ||
|  |   } | ||
|  | })([ | ||
|  |   // synchronous functions
 | ||
|  |   'close', | ||
|  |   'createBinlogStream', | ||
|  |   'destroy', | ||
|  |   'escape', | ||
|  |   'escapeId', | ||
|  |   'format', | ||
|  |   'pause', | ||
|  |   'pipe', | ||
|  |   'resume', | ||
|  |   'unprepare', | ||
|  | ]); | ||
|  | 
 | ||
|  | module.exports = PromiseConnection; |