in baremaps-calcite/src/main/java/org/apache/baremaps/calcite/postgres/PostgresModifiableTable.java [612:680]
public boolean addAll(Collection<? extends Object[]> c) {
Objects.requireNonNull(c, "Collection cannot be null");
try (Connection connection = dataSource.getConnection()) {
// Use COPY API for better performance
PGConnection pgConnection = connection.unwrap(PGConnection.class);
String copyCommand = "COPY \"" + schema + "\".\"" + tableName + "\" (" +
dataTableSchema.columns().stream()
.map(col -> "\"" + col.name() + "\"")
.collect(java.util.stream.Collectors.joining(", "))
+
") FROM STDIN WITH (FORMAT binary)";
try (
CopyWriter writer = new CopyWriter(new PGCopyOutputStream(pgConnection, copyCommand))) {
writer.writeHeader();
for (Object[] objects : c) {
Objects.requireNonNull(objects, "Values cannot be null");
if (objects.length != dataTableSchema.columns().size()) {
throw new IllegalArgumentException(
"Expected " + dataTableSchema.columns().size() + " values, got "
+ objects.length);
}
writer.startRow(dataTableSchema.columns().size());
for (int i = 0; i < objects.length; i++) {
Object value = objects[i];
DataColumn column = dataTableSchema.columns().get(i);
if (value == null) {
writer.writeNull();
} else if (column.sqlTypeName() == SqlTypeName.GEOMETRY
&& value instanceof Geometry) {
writer.write(CopyWriter.GEOMETRY_HANDLER, (Geometry) value);
} else if (column.sqlTypeName() == SqlTypeName.BOOLEAN) {
writer.writeBoolean((Boolean) value);
} else if (column.sqlTypeName() == SqlTypeName.INTEGER) {
writer.writeInteger((Integer) value);
} else if (column.sqlTypeName() == SqlTypeName.BIGINT) {
writer.writeLong((Long) value);
} else if (column.sqlTypeName() == SqlTypeName.DOUBLE) {
writer.writeDouble((Double) value);
} else if (column.sqlTypeName() == SqlTypeName.FLOAT) {
writer.writeFloat((Float) value);
} else if (column.sqlTypeName() == SqlTypeName.SMALLINT) {
writer.writeShort((Short) value);
} else if (column.sqlTypeName() == SqlTypeName.TINYINT) {
writer.writeByte((Byte) value);
} else if (column.sqlTypeName() == SqlTypeName.DATE) {
writer.write(CopyWriter.LOCAL_DATE_HANDLER, (java.time.LocalDate) value);
} else if (column.sqlTypeName() == SqlTypeName.TIMESTAMP) {
writer.write(CopyWriter.LOCAL_DATE_TIME_HANDLER, (java.time.LocalDateTime) value);
} else if (column.sqlTypeName() == SqlTypeName.OTHER) {
writer.writeJsonb(value.toString());
} else {
// For other types, convert to string
writer.write(value.toString());
}
}
}
return true;
}
} catch (Exception e) {
throw new RuntimeException("Error adding rows using COPY API", e);
}
}