ColumnMetaData.java

package org.itsallcode.jdbc.resultset.generic;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import org.itsallcode.jdbc.UncheckedSQLException;

/**
 * Represents the metadata of a single column.
 * 
 * @param columnIndex column index (1 based)
 * @param name        column name
 * @param label       column label
 * @param type        SQL type
 */
public record ColumnMetaData(int columnIndex, String name, String label, ColumnType type) {

    static List<ColumnMetaData> create(final ResultSet resultSet) {
        try {
            return create(resultSet.getMetaData());
        } catch (final SQLException e) {
            throw new UncheckedSQLException("Error extracting meta data", e);
        }
    }

    private static List<ColumnMetaData> create(final ResultSetMetaData metaData)
            throws SQLException {
        final int columnCount = metaData.getColumnCount();
        final List<ColumnMetaData> columns = new ArrayList<>(columnCount);
        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
            columns.add(ColumnMetaData.create(metaData, columnIndex));
        }
        return columns;
    }

    private static ColumnMetaData create(final ResultSetMetaData metaData, final int columnIndex)
            throws SQLException {
        final String label = metaData.getColumnLabel(columnIndex);
        final String name = metaData.getColumnName(columnIndex);
        final ColumnType columnType = ColumnType.create(metaData, columnIndex);
        return new ColumnMetaData(columnIndex, name, label, columnType);
    }
}