JdbcIterableImpl.java

/*
 * SPDX-FileCopyrightText: 2025 kaumei.io
 * SPDX-License-Identifier: Apache-2.0
 */
package io.kaumei.jdbc.core.internal;

import io.kaumei.jdbc.core.JdbcIterable;
import io.kaumei.jdbc.annotation.JdbcToJava;
import io.kaumei.jdbc.core.JdbcUtils;

import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Iterator;

import static java.util.Objects.requireNonNull;

public class JdbcIterableImpl<T> implements JdbcIterable<T> {
    private final Statement stmt;
    private final ResultSet rs;
    private final Iterator<T> iterator;

    // ----- state
    private enum State {OPEN, USED, CLOSED}

    private State state = State.OPEN;

    public JdbcIterableImpl(Statement stmt, ResultSet rs, JdbcToJava.Row<T> rowGetter) {
        this.stmt = requireNonNull(stmt);
        this.rs = requireNonNull(rs);
        this.iterator = new JdbcIterator<>(rs, rowGetter);
    }

    // ------------------------------------------------------------------------

    @Override
    public void close() {
        this.state = State.CLOSED;
        JdbcUtils.close(this.stmt, this.rs);
    }

    // --------------------------------------------------------------------

    @Override
    public Iterator<T> iterator() {
        if (this.state != State.OPEN) {
            throw new IllegalStateException("Illegal state: " + state);
        }
        this.state = State.USED;
        return this.iterator;
    }

}