Hi, I am having issues with updating functions in BaseX 7.5 (official release).
When I update a document, its content is updated with the content of another document.
I even perform the db:optimized in a separate function after a forward to ensure that the db:replace is in fact completed before indexes are optimized.
* *
To replicate: you'll need a db named 'en-us' with the 3 following documents (file names don't matter):
<menu id="devicehelp"/> <menu id="smbonly"/> <menu id="ptt-help"/>
Then use these functions:
* *
*declare* %rest:path("/admin/refresh-menu-headings") %rest:GET %rest:query-param("menu-id", "{$menu-id}", "devicehelp") *updating* *function* *admin:refresh-menu-headings*(*$menu-id* *as ** xs:string*){
(:Get the content:) *let* *$raw-menu* := *app:open-db*('en-us')/*menu*[*@id* = *$menu-id* ]
(:Get the file location:) *let* *$menu-uri* := *substring-after*(*$raw-menu*/*base-uri*(), 'en-us/')
(:Copy the content:) *let* *$menu* := *$raw-menu*
* (:Output the content in a file to ensure you have the right one:)*
* **let* *$debug* := *file:write*('debug-ouch.xml', *document*{*$menu* })
(:Output the file uri to ensure you have the right one:)
*let* *$debug-uri* := *file:write*('debug-uri.xml', *$menu-uri*)
(:Replace the content of the file with the same content that was outputted in debug-ouch:) *return *(*db:replace*('en-us', *$menu-uri*, *$menu*), *db:output*(restxq:forward /restxq/admin/success/heading-refresh</restxq:forward>))
};
*declare* %rest:path('/admin/success/heading-refresh') *updating* *function* *admin:success-heading-refresh*(){ *let **$result* := <html *xmlns*=*"http://www.w3.org/1999/xhtml%22*%3E <head><title>Add headings to menu topicrefs </title></head> <body> <h2>Add headings to menu topicrefs</h2> <ul> <li *style*=*"color:green"*>Menus were updated successfully.</li> </ul> </body> </html> *return *(*db:optimize*('en-us'), *db:output*(*$result*))
RESULT: The result after optimize if your query for a list of the /menu/data(@id) should be devicehelp, smbonly, ptt-help, but it's ptt-help, smbonly, ptt-help.
debug-ouch.xml shows the correct content (content of menu devicehelp), debug-uri shows the right file path (path of menu ptt-help), yet the content of menu with @id devicehelp gets replaced by the content of menu with @id=ptt-help after db:replace.
Note: If I use db:optimize('en-us', true()), I get 'unexpected error: 0'