// Promise wrappers around sqlite3's callback API. Routes use these instead of raw callbacks. const { getDatabase } = require('./database'); function all(sql, params = []) { return new Promise((resolve, reject) => { getDatabase().all(sql, params, (err, rows) => { if (err) reject(err); else resolve(rows); }); }); } function get(sql, params = []) { return new Promise((resolve, reject) => { getDatabase().get(sql, params, (err, row) => { if (err) reject(err); else resolve(row); }); }); } function run(sql, params = []) { return new Promise((resolve, reject) => { getDatabase().run(sql, params, function (err) { if (err) reject(err); else resolve({ lastID: this.lastID, changes: this.changes }); }); }); } // Executes work() inside BEGIN/COMMIT. Rolls back if work() throws. async function transaction(work) { await run('BEGIN'); try { const result = await work(); await run('COMMIT'); return result; } catch (err) { try { await run('ROLLBACK'); } catch (_) { /* swallow */ } throw err; } } module.exports = { all, get, run, transaction };