actual/packages/loot-core/src/server/spreadsheet/usage.js
2022-07-24 08:53:05 +01:00

90 lines
2.1 KiB
JavaScript

const sqlite = require('sqlite3');
const escodegen = require('escodegen');
const sqlgen = require('./sqlgen');
// Example usage:
const Spreadsheet = require('./spreadsheet');
const db = new sqlite.Database(__dirname + '/../../db.sqlite');
const sheet = new Spreadsheet({
plugins: {
runQuery: {
parse: ast => {
const queryAST = ast.arguments[0];
const code = 'return ' + escodegen.generate(queryAST);
// eslint-disable-next-line
const func = new Function(code);
const query = func();
const sql = sqlgen(query);
return {
data: {
type: 'query',
query: query,
sql: sql
},
ast: {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: 'runQuery'
},
arguments: [
{
type: 'Literal',
raw: sql,
value: sql
}
]
}
};
},
run: sql => {
return new Promise(resolve => {
const start = Date.now();
db.all(sql, function(err, rows) {
if (err) {
throw new Error(err);
}
resolve(rows);
});
});
}
}
}
});
db.on('preupdate', function(type, dbname, table, old, _new, oldId, newId) {
sheet.resolve().then(() => {
const start = Date.now();
sheet.startTransaction();
sheet
.getNodesOfType('query')
.filter(node => node.data.query.table === table)
.forEach(q => {
sheet.signal(q.name);
});
sheet.endTransaction();
console.log('[preupdate]', Date.now() - start);
});
});
function insertRow() {
const start = Date.now();
console.log('[insertRow] started');
db.run(
'INSERT INTO transactions (acct, category, amount, description, date)' +
' VALUES (3, 2, 944, "shirt", 1456808400000);',
function() {
console.log('[insertRow] fired', Date.now() - start);
const t = Math.random() * 100;
console.log('[insertRow] waiting', t);
setTimeout(insertRow, t);
}
);
}
insertRow();