settingsdb: merge blob get/set into settings.js

This commit is contained in:
Girish Ramakrishnan
2021-08-18 15:31:07 -07:00
parent 3806b3b3ff
commit 4671396889
7 changed files with 147 additions and 263 deletions

View File

@@ -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) {