package ru.yandex.clickhouse.jdbcbridge.db.clickhouse; import ru.yandex.clickhouse.util.ClickHouseRowBinaryStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; /** * Created by krash on 26.09.18. */ public class ClickHouseRowSerializer { private final Collection<ClickHouseFieldSerializer> serializers = new ArrayList<>(); public void serialize(ResultSet resultSet, ClickHouseRowBinaryStream stream) throws IOException, SQLException { int i = 0; for (ClickHouseFieldSerializer serializer : serializers) { serializer.serialize(resultSet, ++i, stream); } } private void add(ClickHouseFieldSerializer fieldSerializer) { serializers.add(fieldSerializer); } public static ClickHouseRowSerializer create(ResultSetMetaData meta) throws SQLException { ClickHouseRowSerializer serializer = new ClickHouseRowSerializer(); for (int i = 1; i <= meta.getColumnCount(); i++) { int precision = meta.getPrecision(i); int scale = meta.getScale(i); ExtractorConverter<?> ser = ClickHouseConverter.getSerializerBySQLType(meta.getColumnType(i), precision, scale); boolean isNullable = meta.isNullable(i) == ResultSetMetaData.columnNullable; ClickHouseFieldSerializer<?> fieldSerializer = new ClickHouseFieldSerializer<>(isNullable, ser); serializer.add(fieldSerializer); } return serializer; } }