package org.basex.server; import java.io.IOException; import java.io.OutputStream; import org.basex.core.BaseXException; import org.basex.io.in.BufferInput; import org.basex.io.out.ArrayOutput; /** * This class defines all methods for iteratively evaluating queries with the * client/server architecture. All sent data is received by the * {@link ClientListener} and interpreted by the {@link QueryListener}. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public class ClientQuery extends Query { /** Client session. */ private final ClientSession cs; /** Query id. */ private final String id; /** * Standard constructor. * @param query query to be run * @param session client session * @param os output stream * @throws IOException I/O exception */ public ClientQuery(final String query, final ClientSession session, final OutputStream os) throws IOException { cs = session; id = exec(ServerCmd.QUERY, query, null); out = os; } @Override public String info() throws IOException { return exec(ServerCmd.INFO, id, null); } @Override public String options() throws IOException { return exec(ServerCmd.OPTIONS, id, null); } @Override public void bind(final String n, final Object v, final String t) throws IOException { exec(ServerCmd.BIND, id + '\0' + n + '\0' + v + '\0' + (t == null ? "" : t), null); } @Override public String execute() throws IOException { return exec(ServerCmd.EXEC, id, out); } @Override public void close() throws IOException { exec(ServerCmd.CLOSE, id, null); } @Override protected void cache() throws IOException { cs.sout.write(ServerCmd.ITER.code); cs.send(id); cs.sout.flush(); final BufferInput bi = new BufferInput(cs.sin); cache(bi); if(!ClientSession.ok(bi)) throw new BaseXException(bi.readString()); } /** * Executes a command and sends the result to the specified output stream. * @param cmd server command * @param arg argument * @param output target output stream * @return string * @throws IOException I/O exception */ private String exec(final ServerCmd cmd, final String arg, final OutputStream output) throws IOException { final OutputStream os = output == null ? new ArrayOutput() : output; cs.sout.write(cmd.code); cs.send(arg); cs.sout.flush(); final BufferInput bi = new BufferInput(cs.sin); ClientSession.receive(bi, os); if(!ClientSession.ok(bi)) throw new BaseXException(bi.readString()); return os.toString(); } }