Hi all,

> Does the BaseX GUI open a Database via embedded mode, locking the
> Database it in the process?

It surely locks it, but I don't know how. 

Note that I know I should not use the GUI to open the same database when the database server is running too, but I don't know if it's the only error that is not propagated? (I do get other errors, such as "XQJFOS021 - FORWARD_ONLY_SEQUENCE: Cursor is not positioned on an XQItem" in my Java code. Good. Also, if I try a non-existing database, I get "[FODC0002]: Resource "[...]/basex/bin/xxxx-factbook" not found." in my Java code. Good too.)

I know of two ways to mess up: the GUI, and the standalone command line utility. It took me some time to realize that "bin/basex" is not some TCP/IP client that connects to a running database server (as started with "bin/basexserver"), but rather opens the database files itself. The GUI does the same. So, I know I should use "bin/basexclient" instead, to connect to the server, to ensure the server can still correctly handle requests from my Java code.

In the unit test I attached earlier, I described some steps I forgot in the message itself:

When the database is somehow in use, the Java code fails
silently. Like:

- Start the server, using:
 $ basexserver -S
 Server was started.

- Import Factbook, using:
 $ basex
 BaseX 7.3 [Standalone]
 Try help to get more information.
 
 > create db factbook ../mondial-3.0.xml
 Database 'factbook' created in 592.53 ms.
 
 > show databases
 1 opened database(s):
 - factbook (1x)

- Leave the standalone tool open, hence make the database
  unavailable for updates by the server.

- Run this very unit test; though the log in data/.logs does show
  the BXDB0007 error, the Java code just silently ignores that.

(As an aside: in the GUI, menu Database, Server Administration warns: "Warning: The client/server architecture and the GUI are not synchronized. The same database should not be opened from clients and the GUI.")

Regards,
Arjan.


On Thu, Aug 23, 2012 at 10:30 AM, Charles Foster <charles@cfoster.net> wrote:
Does the BaseX GUI open a Database via embedded mode, locking the
Database it in the process?

Please could you give me a couple more steps to go on Arjan? If there
is a problem with the XQJ Driver I would like to fix it.

Regards,

Charles

On 23 August 2012 03:53, Christian Grün <christian.gruen@gmail.com> wrote:
> Hi Arjan,
>
> thanks for your report. I managed to reproduce the issue. I assume
> that this behavior is due to XQJ, which is why I’m forwarding your
> mail to Charles.
>
> Hope this helps,
> Christian
>
> @Charles: if you have more questions, or if you believe that the bug
> is on our side.. Your feedback is welcome!
> ___________________________
>
> On Wed, Aug 22, 2012 at 5:44 PM, Arjan van Bentem
> <arjan.vanbentem@bidnetwork.org> wrote:
>> Hi all,
>>
>> Maybe this is related to http://xqj.net/basex/ instead of BaseX itself, but
>> as I don't know allow me to ask here first.
>>
>> Whenever I have somehow locked a BaseX database, like by using the
>> standalone command line utility or the GUI, then I get something like the
>> following in the BaseX log files:
>>
>> QUERY(1) for $c in collection('factbook')//country[name='Albania']return(
>> replace value of node $c/@population with xs:integer($c/@population + 1)) OK
>> 39.92 ms
>> QUERY(1)  OK 0.62 ms
>> FULL(1) Error: [BXDB0007] Database 'factbook' is opened by another process.
>> CLOSE(1) OK 39.68 ms
>>
>> Good.
>>
>> However, I don't see that error in my Java code. The Java code just
>> continues like all was fine.
>>
>> Can I somehow make the Java code fail when this happens?
>>
>> See example below, and the same thing in the attachment.
>>
>> Thanks,
>> Arjan.
>>
>>
>>
>> private static final String DRIVER = "net.xqj.basex.BaseXXQDataSource";
>>
>> private static final String SELECT =
>> "xs:long(collection('factbook')//country[name='Albania']/@population[1]/data(.))";
>>
>> private static final String UPDATE = "for $c in
>> collection('factbook')//country[name='Albania']"
>> + "return("
>> + "  replace value of node $c/@population with xs:integer($c/@population +
>> 1)"
>> + ")";
>>
>> @Test
>> public void testUpdate() {
>> try {
>>
>> XQDataSource xqd = (XQDataSource) Class.forName(DRIVER)
>> .newInstance();
>> XQConnection xqc = xqd.getConnection("admin", "admin");
>> XQExpression xqe = xqc.createExpression();
>>
>> XQSequence xqs = xqe.executeQuery(SELECT);
>> xqs.next();
>> long before = xqs.getLong();
>> System.out.println("Initial value: " + before);
>>
>> System.out.println("Updating...");
>> xqs = xqe.executeQuery(UPDATE);
>>
>> xqs = xqe.executeQuery(SELECT);
>> xqs.next();
>> long after = xqs.getLong();
>> System.out.println("Resulting value: " + after);
>>
>> xqc.close();
>>
>> Assert.assertEquals("Update should have succeeded or failed",
>> before + 1, after);
>>
>> } catch (Exception e) {
>> e.printStackTrace();
>> }
>>
>> }
>>
>>
>> _______________________________________________
>> BaseX-Talk mailing list
>> BaseX-Talk@mailman.uni-konstanz.de
>> https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk
>>
>