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