added basic CLS support with re-entrant transactions

This commit is contained in:
azivner
2018-03-28 23:41:22 -04:00
parent b10b0048f3
commit 0ec909fd7a
13 changed files with 115 additions and 24 deletions

View File

@@ -6,6 +6,7 @@ const fs = require('fs');
const sqlite = require('sqlite');
const app_info = require('./app_info');
const resource_dir = require('./resource_dir');
const cls = require('./cls');
async function createConnection() {
return await sqlite.open(dataDir.DOCUMENT_PATH, {Promise});
@@ -15,7 +16,7 @@ const dbConnected = createConnection();
let dbReadyResolve = null;
const dbReady = new Promise((resolve, reject) => {
dbConnected.then(async db => {
dbConnected.then(cls.wrap(async db => {
await execute("PRAGMA foreign_keys = ON");
dbReadyResolve = () => {
@@ -65,7 +66,7 @@ const dbReady = new Promise((resolve, reject) => {
resolve(db);
}
})
}))
.catch(e => {
console.log("Error connecting to DB.", e);
process.exit(1);
@@ -191,6 +192,15 @@ let transactionActive = false;
let transactionPromise = null;
async function doInTransaction(func) {
if (cls.namespace.get('isInTransaction')) {
console.log("Transaction already active");
return await func();
}
else {
console.log("Starting new transaction");
}
while (transactionActive) {
await transactionPromise;
}
@@ -201,6 +211,8 @@ async function doInTransaction(func) {
transactionActive = true;
transactionPromise = new Promise(async (resolve, reject) => {
try {
cls.namespace.set('isInTransaction', true);
await beginTransaction();
ret = await func();
@@ -219,6 +231,9 @@ async function doInTransaction(func) {
reject(e);
}
finally {
cls.namespace.set('isInTransaction', false);
}
});
if (transactionActive) {