mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	manual transaction handling for jobs
This commit is contained in:
		| @@ -716,6 +716,9 @@ const noteTree = (function() { | ||||
|             titlePath = ''; | ||||
|         } | ||||
|  | ||||
|         // https://github.com/zadam/trilium/issues/46 | ||||
|         // unfortunately not easy to implement because we don't have an easy access to note's isProtected property | ||||
|  | ||||
|         const autocompleteItems = []; | ||||
|  | ||||
|         for (const childNoteId of parentToChildren[parentNoteId]) { | ||||
|   | ||||
| @@ -1,21 +1,15 @@ | ||||
| const log = require('./log'); | ||||
| const sql = require('./sql'); | ||||
| const ScriptContext = require('./script_context'); | ||||
|  | ||||
| async function executeScript(dataKey, script, params) { | ||||
|     log.info('Executing script: ' + script); | ||||
|  | ||||
|     const ctx = new ScriptContext(dataKey); | ||||
|  | ||||
|     const paramsStr = getParams(params); | ||||
|  | ||||
|     let ret; | ||||
|     return await sql.doInTransaction(async () => execute(ctx, script, paramsStr)); | ||||
| } | ||||
|  | ||||
|     await sql.doInTransaction(async () => { | ||||
|         ret = await (function() { return eval(`const api = this; (${script})(${paramsStr})`); }.call(ctx)); | ||||
|     }); | ||||
|  | ||||
|     return ret; | ||||
| async function execute(ctx, script, paramsStr) { | ||||
|     return await (function() { return eval(`const api = this; (${script})(${paramsStr})`); }.call(ctx)); | ||||
| } | ||||
|  | ||||
| const timeouts = {}; | ||||
| @@ -35,15 +29,31 @@ function clearExistingJob(name) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| async function setJob(opts) { | ||||
|     clearExistingJob(opts.name); | ||||
| async function executeJob(script, params, manualTransactionHandling) { | ||||
|     const ctx = new ScriptContext(); | ||||
|     const paramsStr = getParams(params); | ||||
|  | ||||
|     if (opts.runEveryMs && opts.runEveryMs > 0) { | ||||
|         intervals[opts.name] = setInterval(() => executeScript(null, opts.job, opts.params), opts.runEveryMs); | ||||
|     if (manualTransactionHandling) { | ||||
|         return await execute(ctx, script, paramsStr); | ||||
|     } | ||||
|     else { | ||||
|         return await sql.doInTransaction(async () => execute(ctx, script, paramsStr)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| async function setJob(opts) { | ||||
|     const { name, runEveryMs, initialRunAfterMs } = opts; | ||||
|  | ||||
|     clearExistingJob(name); | ||||
|  | ||||
|     const jobFunc = () => executeJob(opts.job, opts.params, opts.manualTransactionHandling); | ||||
|  | ||||
|     if (runEveryMs && runEveryMs > 0) { | ||||
|         intervals[name] = setInterval(jobFunc, runEveryMs); | ||||
|     } | ||||
|  | ||||
|     if (opts.initialRunAfterMs && opts.initialRunAfterMs > 0) { | ||||
|         timeouts[opts.name] = setTimeout(() => executeScript(null, opts.job, opts.params), opts.initialRunAfterMs); | ||||
|     if (initialRunAfterMs && initialRunAfterMs > 0) { | ||||
|         timeouts[name] = setTimeout(jobFunc, initialRunAfterMs); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,12 +1,13 @@ | ||||
| const log = require('./log'); | ||||
| const protected_session = require('./protected_session'); | ||||
| const notes = require('./notes'); | ||||
| const sql = require('./sql'); | ||||
| const attributes = require('./attributes'); | ||||
| const date_notes = require('./date_notes'); | ||||
| const config = require('./config'); | ||||
| const Repository = require('./repository'); | ||||
|  | ||||
| function ScriptContext(noteId, dataKey) { | ||||
| function ScriptContext(dataKey) { | ||||
|     dataKey = protected_session.getDataKey(dataKey); | ||||
|     const repository = new Repository(dataKey); | ||||
|  | ||||
| @@ -65,6 +66,8 @@ function ScriptContext(noteId, dataKey) { | ||||
|  | ||||
|     this.getRootCalendarNoteId = date_notes.getRootCalendarNoteId; | ||||
|     this.getDateNoteId = date_notes.getDateNoteId; | ||||
|  | ||||
|     this.transaction = sql.doInTransaction; | ||||
| } | ||||
|  | ||||
| module.exports = ScriptContext; | ||||
| @@ -195,6 +195,7 @@ async function doInTransaction(func) { | ||||
|         await transactionPromise; | ||||
|     } | ||||
|  | ||||
|     let ret = null; | ||||
|     const error = new Error(); // to capture correct stack trace in case of exception | ||||
|  | ||||
|     transactionActive = true; | ||||
| @@ -202,7 +203,7 @@ async function doInTransaction(func) { | ||||
|         try { | ||||
|             await beginTransaction(); | ||||
|  | ||||
|             await func(); | ||||
|             ret = await func(); | ||||
|  | ||||
|             await commit(); | ||||
|  | ||||
| @@ -223,6 +224,8 @@ async function doInTransaction(func) { | ||||
|     if (transactionActive) { | ||||
|         await transactionPromise; | ||||
|     } | ||||
|  | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| async function isDbUpToDate() { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user