diff --git a/src/database.js b/src/database.js index d552b667a..5e41dede6 100644 --- a/src/database.js +++ b/src/database.js @@ -102,31 +102,36 @@ function query() { }); } -function transaction(queries, callback) { +function transaction(queries) { assert(Array.isArray(queries)); - assert.strictEqual(typeof callback, 'function'); - callback = once(callback); + const args = Array.prototype.slice.call(arguments); + const callback = typeof args[args.length - 1] === 'function' ? once(args.pop()) : null; - gConnectionPool.getConnection(function (error, connection) { - if (error) return callback(error); + return new Promise((resolve, reject) => { + gConnectionPool.getConnection(function (error, connection) { + if (error) return callback ? callback(error) : reject(new BoxError(BoxError.DATABASE_ERROR, error, { code: error.code, sqlMessage: error.sqlMessage })); - const releaseConnection = (error) => { connection.release(); callback(error); }; + const releaseConnection = (error) => { + connection.release(); + callback ? callback(error) : reject(new BoxError(BoxError.DATABASE_ERROR, error, { code: error.code, sqlMessage: error.sqlMessage })); + }; - connection.beginTransaction(function (error) { - if (error) return releaseConnection(error); + connection.beginTransaction(function (error) { + if (error) return releaseConnection(error); - async.mapSeries(queries, function iterator(query, done) { - connection.query(query.query, query.args, done); - }, function seriesDone(error, results) { - if (error) return connection.rollback(() => releaseConnection(error)); - - connection.commit(function (error) { + async.mapSeries(queries, function iterator(query, done) { + connection.query(query.query, query.args, done); + }, function seriesDone(error, results) { if (error) return connection.rollback(() => releaseConnection(error)); - connection.release(); + connection.commit(function (error) { + if (error) return connection.rollback(() => releaseConnection(error)); - callback(null, results); + connection.release(); + + callback ? callback(null, results) : resolve(results); + }); }); }); });