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