package io.vertx.sqlclient.impl;
import io.vertx.sqlclient.SqlResult;
import io.vertx.core.AsyncResult;
import io.vertx.core.Handler;
import java.util.function.Function;
public class SqlResultBuilder<T, R extends SqlResultBase<T, R>, L extends SqlResult<T>> implements QueryResultHandler<T>, Handler<AsyncResult<Boolean>> {
private final Handler<AsyncResult<L>> handler;
private final Function<T, R> factory;
private R first;
private boolean suspended;
SqlResultBuilder(Function<T, R> factory, Handler<AsyncResult<L>> handler) {
this.factory = factory;
this.handler = handler;
}
@Override
public void handleResult(int updatedCount, int size, RowDesc desc, T result) {
R r = factory.apply(result);
r.updated = updatedCount;
r.size = size;
r.columnNames = desc != null ? desc.columnNames() : null;
handleResult(r);
}
private void handleResult(R result) {
if (first == null) {
first = result;
} else {
R h = first;
while (h.next != null) {
h = h.next;
}
h.next = result;
}
}
@Override
public void handle(AsyncResult<Boolean> res) {
suspended = res.succeeded() && res.result();
handler.handle((AsyncResult<L>) res.map(first));
}
public boolean isSuspended() {
return suspended;
}
}