diff --git a/src/blobdb.js b/src/blobdb.js deleted file mode 100644 index fe8c3be01..000000000 --- a/src/blobdb.js +++ /dev/null @@ -1,47 +0,0 @@ -/* jslint node:true */ - -'use strict'; - -exports = module.exports = { - get, - set, - _clear: clear -}; - -const assert = require('assert'), - BoxError = require('./boxerror.js'), - database = require('./database.js'); - -const BLOBS_FIELDS = [ 'id', 'value' ].join(','); - -function get(id, callback) { - assert.strictEqual(typeof id, 'string'); - assert.strictEqual(typeof callback, 'function'); - - database.query(`SELECT ${BLOBS_FIELDS} FROM blobs WHERE id = ?`, [ id ], function (error, result) { - if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); - if (result.length === 0) return callback(new BoxError(BoxError.NOT_FOUND, 'Setting not found')); - - callback(null, result[0].value); - }); -} - -function set(id, value, callback) { - assert.strictEqual(typeof id, 'string'); - assert(value === null || Buffer.isBuffer(value)); - assert.strictEqual(typeof callback, 'function'); - - database.query('INSERT INTO blobs (id, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)', [ id, value ], function (error) { - if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); // don't rely on affectedRows here since it gives 2 - - callback(null); - }); -} - -function clear(callback) { - database.query('DELETE FROM blobs', function (error) { - if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); - - callback(error); - }); -} diff --git a/src/blobs.js b/src/blobs.js index 4ed208785..18751e0b1 100644 --- a/src/blobs.js +++ b/src/blobs.js @@ -1,32 +1,33 @@ +/* jslint node:true */ + 'use strict'; exports = module.exports = { get, set, + _clear: clear }; const assert = require('assert'), - blobsdb = require('./blobsdb.js'); + database = require('./database.js'); -function get(id, callback) { +const BLOBS_FIELDS = [ 'id', 'value' ].join(','); + +async function get(id) { assert.strictEqual(typeof id, 'string'); - assert.strictEqual(typeof callback, 'function'); - blobsdb.get(id, function (error, value) { - if (error) return callback(error); - - callback(null, value); - }); + const result = await database.query(`SELECT ${BLOBS_FIELDS} FROM blobs WHERE id = ?`, [ id ]); + if (result.length === 0) return null; + return result[0].value; } -function set(id, value, callback) { +async function set(id, value) { assert.strictEqual(typeof id, 'string'); - assert(Buffer.isBuffer(value)); - assert.strictEqual(typeof callback, 'function'); + assert(value === null || Buffer.isBuffer(value)); - blobsdb.set(id, value, function (error) { - if (error) return callback(error); - - return callback(null); - }); + await database.query('INSERT INTO blobs (id, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)', [ id, value ]); +} + +async function clear() { + await database.query('DELETE FROM blobs'); } diff --git a/src/database.js b/src/database.js index 020e5a26c..5ff2d9617 100644 --- a/src/database.js +++ b/src/database.js @@ -12,7 +12,7 @@ exports = module.exports = { _clear: clear }; -var assert = require('assert'), +const assert = require('assert'), async = require('async'), BoxError = require('./boxerror.js'), child_process = require('child_process'), @@ -86,13 +86,20 @@ function clear(callback) { } function query() { - const args = Array.prototype.slice.call(arguments); - const callback = args[args.length - 1]; - assert.strictEqual(typeof callback, 'function'); + assert.notStrictEqual(gConnectionPool, null); - if (constants.TEST && !gConnectionPool) return callback(new BoxError(BoxError.DATABASE_ERROR, 'database.js not initialized')); + return new Promise((resolve, reject) => { + let args = Array.prototype.slice.call(arguments); + const callback = typeof args[args.length - 1] === 'function' ? args.pop() : null; - gConnectionPool.query.apply(gConnectionPool, args); // this is same as getConnection/query/release + args.push(function queryCallback(error, result) { + if (error) return callback ? callback(error) : reject(new BoxError(BoxError.DATABASE_ERROR, error)); + + callback ? callback(null, result) : resolve(result); + }); + + gConnectionPool.query.apply(gConnectionPool, args); // this is same as getConnection/query/release + }); } function transaction(queries, callback) { diff --git a/src/test/database-test.js b/src/test/database-test.js index 75f9b1e1a..cd92315e5 100644 --- a/src/test/database-test.js +++ b/src/test/database-test.js @@ -10,7 +10,7 @@ var appdb = require('../appdb.js'), async = require('async'), backupdb = require('../backupdb.js'), backups = require('../backups.js'), - blobdb = require('../blobdb.js'), + blobs = require('../blobs.js'), BoxError = require('../boxerror.js'), database = require('../database'), domaindb = require('../domaindb'), @@ -1329,33 +1329,24 @@ describe('database', function () { }); describe('blobs', function () { - it('can set value', function (done) { - blobdb.set('someid', Buffer.from('somevalue'), function (error) { - expect(error).to.be(null); - done(); - }); + it('can set value', async function () { + await blobs.set('someid', Buffer.from('somevalue')); }); - it('can get the set value', function (done) { - blobdb.get('someid', function (error, value) { - expect(error).to.be(null); - expect(value).to.eql(Buffer.from('somevalue')); - done(); - }); + it('can get the set value', async function () { + const value = await blobs.get('someid'); + expect(value).to.eql(Buffer.from('somevalue')); }); - it('can update a value', function (done) { - blobdb.set('someid', Buffer.from('someothervalue'), function (error) { - expect(error).to.be(null); - done(); - }); + it('can update a value', async function () { + await blobs.set('someid', Buffer.from('someothervalue')); }); - it('can get updated value', function (done) { - blobdb.get('someid', function (error, value) { - expect(error).to.be(null); - expect(value).to.eql(Buffer.from('someothervalue')); - done(); - }); + it('can get updated value', async function () { + const value = await blobs.get('someid'); + expect(value).to.eql(Buffer.from('someothervalue')); + }); + it('cannot get randome value', async function () { + const value = await blobs.get('unknownid'); + expect(value).to.be(null); }); - }); describe('backup', function () {