in c3r-sdk-core/src/main/java/com/amazonaws/c3r/action/RowMarshaller.java [291:329]
private void writeInputBatchToSql(final RowWriter<T> sqlRowWriter, final List<Row<T>> batchedRows) {
for (Row<T> sourceRow : batchedRows) {
final Row<T> targetRow = valueFactory.newRow();
final Nonce nonce = Nonce.nextNonce();
sourceRow.forEach((column, value) -> {
// Map source values to each target.
if (sourceMappedColumnInsights.containsKey(column)) {
for (var columnInsight : sourceMappedColumnInsights.get(column)) {
// Marshal sensitive data. Note that PadType.MAX may not be correct at this stage. It will require decrypting and
// re-encrypting when being sent to the final output. In the interim, it is based on the running max byte length,
// sampled in batches.
final Transformer transformer = transformers.get(columnInsight.getType());
final byte[] bytesToMarshall = ValueConverter.getBytesForColumn(value, columnInsight.getType(), settings);
final ClientDataType finalType = Objects.requireNonNullElse(columnInsight.getClientDataType(),
ClientDataType.STRING);
final var encryptionContext = new EncryptionContext(columnInsight, nonce, finalType);
try {
targetRow.putBytes(
columnInsight.getTargetHeader(),
transformer.marshal(bytesToMarshall, encryptionContext));
} catch (Exception e) {
throw new C3rRuntimeException("Failed while marshalling data for target column `"
+ encryptionContext.getColumnLabel() + "` on row " + inputReader.getReadRowCount() + ". Error message: "
+ e.getMessage(), e);
}
}
}
});
targetRow.putNonce(nonceHeader, nonce);
try {
sqlRowWriter.writeRow(targetRow);
} catch (Exception e) {
throw new C3rRuntimeException("Failed while marshalling data for row " + inputReader.getReadRowCount() + ". Error message: "
+ e.getMessage(), e);
}
}
}