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