A method for running a script on session data is needed on session-commit (possibly also discard?) in order to for example be able to post data to external databases when the data are commit to the pracro database. The post-commit-hook scripts are to be executed after the commit has been performed successfully to the database.
The mechanism should be designed so that it is also able to handle journal commits to pcpraxis (currently handled in c++ via upload server) and thereby replacing part of the functionality in the existing
<?xml version='1.0' encoding='UTF-8'?> <macro name="myname" version="1.0"> <resume> <script> return 'hello world' </script> </resume> . . .
What should be available to the scripts on run-time? All committed values from all template macros. Each macro should have the values stored separately so that overlapping names do not overshadow each others values. All generated resume texts must equally be available in order for the script to be able to commit data to the pcpraxis journal. The data can therefore be made available in a preloaded map hierarchy of macros/names/value in the following manner:
value = vars['macro1']['name']
All resume texts are stored with the
'resume' name making it possible iterate the macros and producing the complete journal text by simple concatenation.
An important feature of this list is that the native order of the macros are the same as in the template - NOT sorted alphabetically or similar!.
It is considered to read out value fields using a function instead in order to prevent setting the values:
value = getValue('macro1', 'name')
This method will also require a function to retrieve the macro list as well as field list from a specific macro since the above function also prevents macro iteration:
macrolist = getMacroList() fieldlist = getFieldList('macro1')
This solution is however fairly ugly. Setting the map from the first method to read-only (or const if you will) would much be prefered.
A single scripting section should be stored in the template file. Scripting sections should be included from each macro file in order to the macro-specific scripts where they belong (also share if the macro is used in multiple templates).
<?xml version='1.0' encoding='UTF-8'?> <template name="mytemplate" version="1.0" title="My Template" oncommit="func1()" ondiscard="func2()"> <scripts> <script> function func1() -- do something useful end function func2() -- do something useful end </script> </scripts> <macro name="macro1"/> . . .
A similar solution is to be used in the individual macros (ie. oncommit/ondiscard attributes in the macro tag). Each macros scripts are to be loaded in turn in a clean namespace containing only the values of the current macro (again to avoid naming conflicts) and executed in the same order in which they occur in the template.
The template scripts are to be executed before the macro scripts.
<?xml version='1.0' encoding='UTF-8'?> <macro name="mymacro" version="1.0" oncommit="func1()" ondiscard="func2()"> <oncommit> <script> function func1() -- do something useful end function func2() -- do something useful end </script> </oncommit> . . .
The resume scripts cannot directly be replaced by a single on-commit script since the resumes are used dynamically while the template is being edited (to show resumes in collapsed macros).