Yes the code I modified is indeed [1] java/org/basex/examples/api/BaseXClient.java

The following line was needed to handle the first byte of the query result.
 if (in.read() > 0)

I do like your "client.execute("xquery db:retrieve" suggestion better as it does not require me to change the example client code.

However, what I really need is a way to do db:store and db:replace via Xquery with an InputStream (e.g. without requiring the open/close commands).


On Fri, Jan 29, 2016 at 4:50 AM, Christian Grün <christian.gruen@gmail.com> wrote:
Please be more specific: Could you give me the exact reference to the
class you have extended?

If it’s [1], the following might work:

    public void execute(final OutputStream output) throws IOException {
      out.write(4);
      send(id);
      receive(in, output);
      if(!ok()) throw new IOException(receive());
    }

Did you try to use the BaseXClient.execute method as well?

    BaseXClient client = new BaseXClient("localhost", 1984, "admin", "admin");
    try {
      ByteArrayOutputStream os = new ByteArrayOutputStream();
      client.execute("xquery db:retrieve('db', 'file.bin)", os);
      final byte[] data = os.toByteArray();
      System.out.println("Size of binary data: " + data.length);
    } finally {
      client.close();
    }


[1] https://github.com/BaseXdb/basex/blob/master/basex-examples/src/main/java/org/basex/examples/api/BaseXClient.java


On Thu, Jan 28, 2016 at 4:57 PM, E. Wray Johnson <wray.johnson@gmail.com> wrote:
> So the problem was my fault as I suspected.  And I fixed it and I am now
> getting the correct data.  I was attempting to retrieve a binary/raw
> document using a Java client without the open/close which locks a database
> by switching from using a retrieve command to db:retrieve XQuery.  I added
> the following method to the client Query object.  It works fine, but let me
> know if you see anything wrong with it.  I particular, is the if(!ok())
> needed?  I suggest this as an enhancement.  Also, is it possible to achieve,
> by enhancement, similar results using db:store in an XQuery from Java client
> and an InputStream?
>
> public void execute(final OutputStream output) throws
>            IOException {
>             out.write(4);
>             send(id);
>             if (in.read() > 0) {
>                 receive(in, output);
>             }
>             info = receive();
>             if (!ok()) {
>                 throw new IOException(info);
>             }
>         }
>
>
> On Thu, Jan 28, 2016 at 10:01 AM, Christian Grün <christian.gruen@gmail.com>
> wrote:
>>
>> > I am getting the incorrect data downloaded as Mike Engledew said he used
>> > the
>> > "raw" output method to fix.  However, "raw" is not listed as one of the
>> > valid types for this option.
>> > So how should I ensure binary files get downloaded. accurately?
>>
>> Any SSCCE?
>>
>>
>> > On Thu, Jan 28, 2016 at 3:08 AM, Christian Grün
>> > <christian.gruen@gmail.com>
>> > wrote:
>> >>
>> >> See here: http://docs.basex.org/wiki/Serialization
>> >>
>> >> Am 28.01.2016 7:13 vorm. schrieb "E. Wray Johnson"
>> >> <wray.johnson@gmail.com>:
>> >>>
>> >>> With 8.4...
>> >>>
>> >>> declare option output:method "raw";
>> >>>
>> >>> I get
>> >>>
>> >>> [SEPM0016] Value of 'method' must be one of
>> >>> (xml,xhtml,html,json,csv,text,adaptive,basex).
>> >>>
>> >>> On Sat, Jan 16, 2016 at 2:06 PM, Mike Engledew
>> >>> <mike.engledew@gmail.com>
>> >>> wrote:
>> >>>>
>> >>>> If like me your using BaseX 8.3.1 don't forget to add ...
>> >>>>
>> >>>> declare option output:method "raw";
>> >>>>
>> >>>> before the db:retrieve()  otherwise you won't get back what you put
>> >>>> in.
>> >>>> I learned this the hard way trying to extract binary files that were
>> >>>> stored in codepage IBM1047 and it took me a while to figure out why
>> >>>> they
>> >>>> came back translated;
>> >>>>
>> >>>>
>> >>>> On Fri, Jan 15, 2016 at 11:11 AM, E. Wray Johnson
>> >>>> <wray.johnson@gmail.com> wrote:
>> >>>>>
>> >>>>> When using the sample Java client to store/retrieve binary/raw files
>> >>>>> I
>> >>>>> have to execute separate open/close commands.  It is my
>> >>>>> understanding that
>> >>>>> this locks the database.  In a multi-user scenario, such locking is
>> >>>>> undesirable as binary/raw files can be quite large.  And since there
>> >>>>> is no
>> >>>>> alteration of the indexes etc during such operations, is there a
>> >>>>> better way?
>> >>>>> Also, why isn't there a corresponding retrieve method on the Java
>> >>>>> client,
>> >>>>> similar to the store method?
>> >>>>>
>> >>>>> My code to store:
>> >>>>> BaseXClient session = new BaseXClient(host, port, username,
>> >>>>> password);
>> >>>>> session.execute("open " + database);
>> >>>>> session.store(path, inputStream);
>> >>>>> session.execute("close");
>> >>>>>
>> >>>>> My code to retrieve:
>> >>>>> BaseXClient session = new BaseXClient(host, port, username,
>> >>>>> password);
>> >>>>> session.execute("open " + database);
>> >>>>> session.execute("retrieve " + path, outputStream);
>> >>>>> session.execute("close");
>> >>>>>
>> >>>>> Thanks in advance!
>> >>>>>
>> >>>>>
>> >>>>
>> >>>
>> >
>
>
>
> On Thu, Jan 28, 2016 at 3:08 AM, Christian Grün <christian.gruen@gmail.com>
> wrote:
>>
>> See here: http://docs.basex.org/wiki/Serialization
>>
>> Am 28.01.2016 7:13 vorm. schrieb "E. Wray Johnson"
>> <wray.johnson@gmail.com>:
>>>
>>> With 8.4...
>>>
>>> declare option output:method "raw";
>>>
>>> I get
>>>
>>> [SEPM0016] Value of 'method' must be one of
>>> (xml,xhtml,html,json,csv,text,adaptive,basex).
>>>
>>> On Sat, Jan 16, 2016 at 2:06 PM, Mike Engledew <mike.engledew@gmail.com>
>>> wrote:
>>>>
>>>> If like me your using BaseX 8.3.1 don't forget to add ...
>>>>
>>>> declare option output:method "raw";
>>>>
>>>> before the db:retrieve()  otherwise you won't get back what you put in.
>>>> I learned this the hard way trying to extract binary files that were
>>>> stored in codepage IBM1047 and it took me a while to figure out why they
>>>> came back translated;
>>>>
>>>>
>>>> On Fri, Jan 15, 2016 at 11:11 AM, E. Wray Johnson
>>>> <wray.johnson@gmail.com> wrote:
>>>>>
>>>>> When using the sample Java client to store/retrieve binary/raw files I
>>>>> have to execute separate open/close commands.  It is my understanding that
>>>>> this locks the database.  In a multi-user scenario, such locking is
>>>>> undesirable as binary/raw files can be quite large.  And since there is no
>>>>> alteration of the indexes etc during such operations, is there a better way?
>>>>> Also, why isn't there a corresponding retrieve method on the Java client,
>>>>> similar to the store method?
>>>>>
>>>>> My code to store:
>>>>> BaseXClient session = new BaseXClient(host, port, username, password);
>>>>> session.execute("open " + database);
>>>>> session.store(path, inputStream);
>>>>> session.execute("close");
>>>>>
>>>>> My code to retrieve:
>>>>> BaseXClient session = new BaseXClient(host, port, username, password);
>>>>> session.execute("open " + database);
>>>>> session.execute("retrieve " + path, outputStream);
>>>>> session.execute("close");
>>>>>
>>>>> Thanks in advance!
>>>>>
>>>>>
>>>>
>>>
>