package org.basex.server; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.basex.io.in.DecodingInput; import org.basex.util.Token; import org.basex.util.list.ByteList; import org.basex.util.list.TokenList; /** * <p>This class defines methods for executing queries. * It is implemented by {@link ClientQuery}.</p> * <p>Results are either returned as string or serialized to the output * stream that has been specified via the constructor or via * {@link Session#setOutputStream(OutputStream)}.</p> * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public abstract class Query { /** Client output stream. */ OutputStream out; /** Cached results. */ protected TokenList cache; /** Cache pointer. */ protected int pos; /** * Binds a value to an external variable. * @param n name of variable * @param v value to be bound * @throws IOException I/O exception */ public final void bind(final String n, final Object v) throws IOException { bind(n, v, ""); } /** * Binds a value with an optional type to an external variable. * @param n name of variable * @param v value to be bound * @param t data type * @throws IOException I/O exception */ public abstract void bind(final String n, final Object v, final String t) throws IOException; /** * Returns {@code true} if more items are available. * @return result of check * @throws IOException I/O exception */ public boolean more() throws IOException { if(cache == null) cache(); return pos < cache.size(); } /** * Caches the query result. * @throws IOException I/O exception */ protected abstract void cache() throws IOException; /** * Returns the next item of the query. * @return item string or {@code null}. * @throws IOException I/O exception */ public final String next() throws IOException { if(!more()) return null; final byte[] item = cache.get(pos); cache.set(pos++, null); if(out == null) return Token.string(item); out.write(item); return null; } /** * Caches the incoming input. * @param is input stream * @throws IOException I/O exception */ protected void cache(final InputStream is) throws IOException { cache = new TokenList(); final ByteList bl = new ByteList(); while(is.read() > 0) { final DecodingInput di = new DecodingInput(is); for(int b; (b = di.read()) != -1;) bl.add(b); cache.add(bl.toArray()); bl.reset(); } } /** * Returns the complete result of the query. * @return item string or {@code null}. * @throws IOException I/O exception */ public abstract String execute() throws IOException; /** * Returns the serialization options. * @return serialization options. * @throws IOException I/O exception */ public abstract String options() throws IOException; /** * Returns query info. * @return query info * @throws IOException I/O exception */ public abstract String info() throws IOException; /** * Closes the query. * @throws IOException I/O exception */ public abstract void close() throws IOException; }