[MarkLogic Dev General] (no subject)

Danny Sokolsky dsokolsky at marklogic.com
Mon Oct 27 10:39:18 PST 2008

Another possibility is, if this code is in the body of a main module, you can separate them into separate transactions by putting a semi-colon after the first document-insert.  This might also eliminate the need for the eval (depending on what else you are doing in the query).  For example:

xdmp:document-insert( "process-me.xml", <data>…</data>) ;

xdmp:document-insert( "cpf-init.xml", 
                <target-uri>process-me.xml</target-uri>)', $options (: setting db to content :) )


From: general-bounces at developer.marklogic.com [mailto:general-bounces at developer.marklogic.com] On Behalf Of Wayne Feick
Sent: Monday, October 27, 2008 11:01 AM
To: General Mark Logic Developer Discussion
Subject: Re: [MarkLogic Dev General] (no subject)

Have you considered inserting process-me.xml in a separate eval with an option of <isolation>different-transaction</isolation> to ensure it is available before when inserting cpf-init.xml?


On Mon, 2008-10-27 at 11:29 -0500, Strawn, Shane wrote:


I have a somewhat convoluted issue to describe so I'll try to make sense:

I have a Content Processing Framework process which watches a directory for a file to be dropped on it.  This is a different database than my main content database.

I have an xquery module which at the same time inserts a document into the content database, and the above file into the CPF database in an eval, like so:

        xdmp:document-insert( "process-me.xml", <data>…</data>) 
        xdmp:eval('xdmp:document-insert( "cpf-init.xml", 
                <target-uri>process-me.xml</target-uri>)', $options (: setting db to content :) )

Now, since these are in different dbs, it sometimes occurs where the CPF process will look for "process-me.xml" on the content db but not find it, because it is not finished document-inserting.  I thought it should complete the doc-insert before moving on to the eval in the module, but it apparently doesn't due to the separate-transaction nature of the situation?

I would like to find a way to loop or wait until my doc is fully inserted within xquery, rather than the more complex tasks of modifying the CPF pipeline or changing the interface to add another click-through after the doc is inserted, if possible.  But I'm not sure how to accomplish this or if it's realistic.

I've tried some (probably) stupid things such as:

Killing a set amount of time with a statement like 
        let $timekill := for $a in (1 to 10000000) return () 
…but this seems unreliable, and a waste of time if it doesn't need it;

Or a recursive function like 
        define function check-doc-exists($uri as xs:string) { 
        if ( fn:exists(fn:doc($uri)) ) then fn:true() else check-doc-exists($uri) } 
…but this gives me Stack Overflow within seconds, or if I put my timekiller in it, it never finds the doc even if it inserts while it is running.

Is there something I can do here to create a loop which runs until it can find the document?  Am I misunderstanding what is happening with the transaction?  Just how wrong are my above ideas?

Thanks in advance for any guidance.

Shane Strawn 
Wolters Kluwer Health

General mailing list
General at developer.marklogic.com

More information about the General mailing list