package io.vertx.sqlclient.impl;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.sqlclient.Cursor;
import io.vertx.sqlclient.RowSet;
import io.vertx.sqlclient.Tuple;
import java.util.UUID;
public class CursorImpl implements Cursor {
private final PreparedQueryImpl ps;
private final Tuple params;
private String id;
private boolean closed;
private SqlResultBuilder<RowSet, RowSetImpl, RowSet> result;
CursorImpl(PreparedQueryImpl ps, Tuple params) {
this.ps = ps;
this.params = params;
}
@Override
public synchronized boolean hasMore() {
if (result == null) {
throw new IllegalStateException("No current cursor read");
}
return result.isSuspended();
}
@Override
public synchronized void read(int count, Handler<AsyncResult<RowSet>> handler) {
if (id == null) {
id = UUID.randomUUID().toString();
result = new SqlResultBuilder<>(RowSetImpl.FACTORY, handler);
ps.execute(params, count, id, false, false, RowSetImpl.COLLECTOR, result, result);
} else if (result.isSuspended()) {
result = new SqlResultBuilder<>(RowSetImpl.FACTORY, handler);
ps.execute(params, count, id, true, false, RowSetImpl.COLLECTOR, result, result);
} else {
throw new IllegalStateException();
}
}
@Override
public synchronized void close(Handler<AsyncResult<Void>> completionHandler) {
if (!closed) {
closed = true;
if (id == null) {
completionHandler.handle(Future.succeededFuture());
} else {
String id = this.id;
this.id = null;
result = null;
ps.closeCursor(id, completionHandler);
}
}
}
}