settingsdb: merge blob get/set into settings.js
This commit is contained in:
@@ -141,6 +141,7 @@ const assert = require('assert'),
|
||||
_ = require('underscore');
|
||||
|
||||
const SETTINGS_FIELDS = [ 'name', 'value' ].join(',');
|
||||
const SETTINGS_BLOB_FIELDS = [ 'name', 'valueBlob' ].join(',');
|
||||
|
||||
let gDefaults = (function () {
|
||||
var result = { };
|
||||
@@ -217,6 +218,42 @@ function notifyChange(key, value) {
|
||||
cron.handleSettingsChanged(key, value);
|
||||
}
|
||||
|
||||
async function get(key) {
|
||||
assert.strictEqual(typeof key, 'string');
|
||||
|
||||
const result = await database.query(`SELECT ${SETTINGS_FIELDS} FROM settings WHERE name = ?`, [ key ]);
|
||||
if (result.length === 0) return gDefaults[key];
|
||||
|
||||
return result[0].value;
|
||||
}
|
||||
|
||||
async function set(key, value) {
|
||||
assert.strictEqual(typeof key, 'string');
|
||||
assert(value === null || typeof value === 'string');
|
||||
|
||||
await database.query('INSERT INTO settings (name, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)', [ key, value ]); // don't rely on affectedRows here since it gives 2
|
||||
}
|
||||
|
||||
async function getBlob(key) {
|
||||
assert.strictEqual(typeof key, 'string');
|
||||
|
||||
const result = await database.query(`SELECT ${SETTINGS_BLOB_FIELDS} FROM settings WHERE name = ?`, [ key ]);
|
||||
if (result.length === 0) return null;
|
||||
|
||||
return result[0].valueBlob;
|
||||
}
|
||||
|
||||
async function setBlob(key, value) {
|
||||
assert.strictEqual(typeof key, 'string');
|
||||
assert(value === null || Buffer.isBuffer(value));
|
||||
|
||||
await database.query('INSERT INTO settings (name, valueBlob) VALUES (?, ?) ON DUPLICATE KEY UPDATE valueBlob=VALUES(valueBlob)', [ key, value ]); // don't rely on affectedRows here since it gives 2
|
||||
}
|
||||
|
||||
async function clear() {
|
||||
await database.query('DELETE FROM settings');
|
||||
}
|
||||
|
||||
function setAutoupdatePattern(pattern, callback) {
|
||||
assert.strictEqual(typeof pattern, 'string');
|
||||
assert.strictEqual(typeof callback, 'function');
|
||||
@@ -302,31 +339,21 @@ function setCloudronName(name, callback) {
|
||||
});
|
||||
}
|
||||
|
||||
function getCloudronAvatar(callback) {
|
||||
assert.strictEqual(typeof callback, 'function');
|
||||
async function getCloudronAvatar() {
|
||||
let avatar = await getBlob(exports.CLOUDRON_AVATAR_KEY);
|
||||
if (avatar) return avatar;
|
||||
|
||||
settingsdb.getBlob(exports.CLOUDRON_AVATAR_KEY, function (error, avatar) {
|
||||
if (error && error.reason !== BoxError.NOT_FOUND) return callback(error);
|
||||
// try default fallback
|
||||
avatar = safe.fs.readFileSync(paths.CLOUDRON_DEFAULT_AVATAR_FILE);
|
||||
if (avatar) return avatar;
|
||||
|
||||
if (avatar) return callback(null, avatar);
|
||||
|
||||
// try default fallback
|
||||
avatar = safe.fs.readFileSync(paths.CLOUDRON_DEFAULT_AVATAR_FILE);
|
||||
if (avatar) return callback(null, avatar);
|
||||
|
||||
callback(new BoxError(BoxError.FS_ERROR, safe.error));
|
||||
});
|
||||
throw new BoxError(BoxError.FS_ERROR, `Could not read avatar: ${safe.error.message}`);
|
||||
}
|
||||
|
||||
function setCloudronAvatar(avatar, callback) {
|
||||
async function setCloudronAvatar(avatar) {
|
||||
assert(Buffer.isBuffer(avatar));
|
||||
assert.strictEqual(typeof callback, 'function');
|
||||
|
||||
settingsdb.setBlob(exports.CLOUDRON_AVATAR_KEY, avatar, function (error) {
|
||||
if (error) return callback(error);
|
||||
|
||||
return callback(null);
|
||||
});
|
||||
await setBlob(exports.CLOUDRON_AVATAR_KEY, avatar);
|
||||
}
|
||||
|
||||
function getDynamicDnsConfig(callback) {
|
||||
@@ -669,27 +696,18 @@ function setAppstoreListingConfig(listingConfig, callback) {
|
||||
});
|
||||
}
|
||||
|
||||
function getFirewallBlocklist(callback) {
|
||||
assert.strictEqual(typeof callback, 'function');
|
||||
async function getFirewallBlocklist() {
|
||||
const value = await getBlob(exports.FIREWALL_BLOCKLIST_KEY);
|
||||
if (value === null) return gDefaults[exports.FIREWALL_BLOCKLIST_KEY];
|
||||
|
||||
settingsdb.getBlob(exports.FIREWALL_BLOCKLIST_KEY, function (error, value) {
|
||||
if (error && error.reason === BoxError.NOT_FOUND) return callback(null, gDefaults[exports.FIREWALL_BLOCKLIST_KEY]);
|
||||
if (error) return callback(error);
|
||||
|
||||
callback(null, value.toString('utf8'));
|
||||
});
|
||||
return value.toString('utf8');
|
||||
}
|
||||
|
||||
function setFirewallBlocklist(blocklist, callback) {
|
||||
async function setFirewallBlocklist(blocklist) {
|
||||
assert.strictEqual(typeof blocklist, 'string');
|
||||
assert.strictEqual(typeof callback, 'function');
|
||||
|
||||
// store in blob since the value field is TEXT and has 16kb size limit
|
||||
settingsdb.setBlob(exports.FIREWALL_BLOCKLIST_KEY, Buffer.from(blocklist), function (error) {
|
||||
if (error) return callback(error);
|
||||
|
||||
callback(null);
|
||||
});
|
||||
await setBlob(exports.FIREWALL_BLOCKLIST_KEY, Buffer.from(blocklist));
|
||||
}
|
||||
|
||||
function getSupportConfig(callback) {
|
||||
|
||||
Reference in New Issue
Block a user