in baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresDataSchema.java [83:126]
public void add(DataTable table) {
try (var connection = dataSource.getConnection()) {
var rowType = adaptDataType(table.rowType());
// Drop the table if it exists
var dropQuery = dropTable(rowType.name());
logger.debug(dropQuery);
try (var dropStatement = connection.prepareStatement(dropQuery)) {
dropStatement.execute();
}
// Create the table
var createQuery = createTable(rowType);
logger.debug(createQuery);
try (var createStatement = connection.prepareStatement(createQuery)) {
createStatement.execute();
}
// Copy the data
var pgConnection = connection.unwrap(PGConnection.class);
var copyQuery = copy(rowType);
logger.debug(copyQuery);
try (var writer = new CopyWriter(new PGCopyOutputStream(pgConnection, copyQuery))) {
writer.writeHeader();
var columns = getColumns(rowType);
var handlers = getHandlers(rowType);
for (DataRow row : table) {
writer.startRow(columns.size());
for (int i = 0; i < columns.size(); i++) {
var column = columns.get(i);
var handler = handlers.get(i);
var value = row.get(column.name());
if (value == null) {
writer.writeNull();
} else {
writer.write(handler, value);
}
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}