24 Aug
2012
24 Aug
'12
10:17 a.m.
Hi Charles,
Confirmed: with 1.2.1 I now get a nice:
javax.xml.xquery.XQException:
BXDB0007 - Database 'factbook' is opened by another process.
Thanks for the quick fix! I now see what the fast car on http://xqj.net/ stands
for ;-)
Arjan.
On Thu, Aug 23, 2012 at 6:02 PM, Charles Foster <charles@cfoster.net> wrote:
> Hi Arjan,
>
> Usually, the BaseX server sends exceptions after executing an XQuery
> in a specific text format, which includes debug information like line
> numbers and so on which the BaseX XQJ client uses to subsequently
> throw an XQQueryException.
>
> In this particular instance, the BaseX server does not send the
> exception in this expected format and the BaseX XQJ driver simply
> ignores the exception, which isn't good at all.
>
> That should no longer happen as of BaseX XQJ 1.2.1.
>
> Please check out:
>
> http://xqj.net/basex/basex-xqj-1.2.1.zip
>
> I have also updated the Maven repository.
>
> Let me know how you get on.
>
> Kind Regards,
>
> Charles
>
>
>
> On 23 August 2012 10:29, Arjan van Bentem
> <arjan.vanbentem@bidnetwork.org> wrote:
> > 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
> >> >>
> >> >
> >
> >
>