/* jslint node:true */ 'use strict'; exports = module.exports = { get, getAll, set, getBlob, setBlob, _clear: clear }; const assert = require('assert'), BoxError = require('./boxerror.js'), database = require('./database.js'); const SETTINGS_FIELDS = [ 'name', 'value' ].join(','); const SETTINGS_BLOB_FIELDS = [ 'name', 'valueBlob' ].join(','); function get(key, callback) { assert.strictEqual(typeof key, 'string'); assert.strictEqual(typeof callback, 'function'); database.query(`SELECT ${SETTINGS_FIELDS} FROM settings WHERE name = ?`, [ key ], 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); }); } // won't get the blobs function getAll(callback) { database.query(`SELECT ${SETTINGS_FIELDS} FROM settings WHERE value IS NOT NULL ORDER BY name`, function (error, results) { if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); callback(null, results); }); } function set(key, value, callback) { assert.strictEqual(typeof key, 'string'); assert(value === null || typeof value === 'string'); assert.strictEqual(typeof callback, 'function'); database.query('INSERT INTO settings (name, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)', [ key, 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 getBlob(key, callback) { assert.strictEqual(typeof key, 'string'); assert.strictEqual(typeof callback, 'function'); database.query(`SELECT ${SETTINGS_BLOB_FIELDS} FROM settings WHERE name = ?`, [ key ], 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].valueBlob); }); } function setBlob(key, value, callback) { assert.strictEqual(typeof key, 'string'); assert(value === null || Buffer.isBuffer(value)); assert.strictEqual(typeof callback, 'function'); database.query('INSERT INTO settings (name, valueBlob) VALUES (?, ?) ON DUPLICATE KEY UPDATE valueBlob=VALUES(valueBlob)', [ key, 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 settings', function (error) { if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); callback(error); }); }