001package org.itsallcode.jdbc.resultset.generic;
002
003import java.sql.*;
004import java.util.ArrayList;
005import java.util.List;
006
007import org.itsallcode.jdbc.UncheckedSQLException;
008
009/**
010 * Represents the metadata of a single column.
011 * 
012 * @param columnIndex column index (1 based)
013 * @param name        column name
014 * @param label       column label
015 * @param type        SQL type
016 */
017public record ColumnMetaData(int columnIndex, String name, String label, ColumnType type) {
018
019    static List<ColumnMetaData> create(final ResultSet resultSet) {
020        try {
021            return create(resultSet.getMetaData());
022        } catch (final SQLException e) {
023            throw new UncheckedSQLException("Error extracting meta data", e);
024        }
025    }
026
027    private static List<ColumnMetaData> create(final ResultSetMetaData metaData)
028            throws SQLException {
029        final int columnCount = metaData.getColumnCount();
030        final List<ColumnMetaData> columns = new ArrayList<>(columnCount);
031        for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
032            columns.add(ColumnMetaData.create(metaData, columnIndex));
033        }
034        return columns;
035    }
036
037    private static ColumnMetaData create(final ResultSetMetaData metaData, final int columnIndex)
038            throws SQLException {
039        final String label = metaData.getColumnLabel(columnIndex);
040        final String name = metaData.getColumnName(columnIndex);
041        final ColumnType columnType = ColumnType.create(metaData, columnIndex);
042        return new ColumnMetaData(columnIndex, name, label, columnType);
043    }
044}