package play.db.helper;
import java.io.Closeable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
/**
* Iterate over a JDBC ResultSet
* @author yma
*/
public class JdbcIterator<T> implements Iterator<T>, Iterable<T>, Closeable {
public static <U> JdbcIterator<U> execute(SqlQuery query, Class<U> resultClass) {
return execute(query, JdbcResultFactories.build(resultClass));
}
public static <U> JdbcIterator<U> execute(SqlQuery query, JdbcResultFactory<U> factory) {
try {
return new JdbcIterator<U>(JdbcHelper.execute(query), factory);
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
protected final JdbcResultFactory<T> factory;
protected ResultSet result;
private T next;
public JdbcIterator(ResultSet result, JdbcResultFactory<T> factory) throws SQLException {
this.factory = factory;
this.result = result;
next = null;
if (this.result != null) this.factory.init(this.result);
}
public JdbcIterator(ResultSet result, Class<T> resultClass) throws SQLException {
this(result, JdbcResultFactories.build(resultClass));
}
public void close() {
if (result != null) {
try {
next = null;
result.close();
result = null;
} catch (SQLException ex) {
result = null;
throw new RuntimeException(ex);
}
}
}
public static void close(Iterator<?> iterator) {
if (iterator instanceof JdbcIterator<?>) ((JdbcIterator<?>)iterator).close();
}
protected void load() {
if (next == null && result != null) try {
if (result.next()) next = factory.create(result);
else close();
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
public boolean hasNext() {
load();
return next != null;
}
public T next() {
load();
T e = next;
next = null;
return e;
}
public void remove() {
throw new UnsupportedOperationException();
}
public Iterator<T> iterator() {
return this;
}
}