ResultSetUtils.java

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

import io.kaumei.jdbc.annotation.JdbcToJava;
import io.kaumei.jdbc.core.internal.JdbcIterableImpl;
import io.kaumei.jdbc.core.internal.JdbcIterator;
import io.kaumei.jdbc.core.internal.JdbcResultSetImpl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public final class ResultSetUtils {

    private ResultSetUtils() {
        // prevent instantiation
    }

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

    public static <T> List<T> toList(ResultSet rs, JdbcToJava.Row<T> converter) throws SQLException {
        var list = new ArrayList<T>();
        while (rs.next()) {
            list.add(converter.mapRowToJava(rs));
        }
        return Collections.unmodifiableList(list);
    }

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

    public static <T> Stream<T> toStream(PreparedStatement stmt, ResultSet rs, JdbcToJava.Row<T> converter, boolean nonNull) {
        try {
            var iterator = new JdbcIterator<>(rs, converter);
            var characteristic = Spliterator.IMMUTABLE;
            if (nonNull) {
                characteristic |= Spliterator.NONNULL;
            }
            var split = Spliterators.spliteratorUnknownSize(iterator, characteristic);
            return StreamSupport.stream(split, false).onClose(() -> JdbcUtils.close(stmt, rs));
        } catch (Exception e) {
            JdbcUtils.close(e, stmt, rs);
            throw e;
        }
    }

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

    public static <T> JdbcIterable<T> toJdbcIterable(Statement stmt, ResultSet rs, JdbcToJava.Row<T> converter) {
        return new JdbcIterableImpl<>(stmt, rs, converter);
    }

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

    public static <T> JdbcResultSet<T> toJdbcResultSet(Statement stmt, ResultSet rs, JdbcToJava.Row<T> converter) {
        return new JdbcResultSetImpl<>(stmt, rs, converter);
    }

}