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