diff --git a/c/driver/postgresql/copy/writer.h b/c/driver/postgresql/copy/writer.h index 32c894b5df..ad119ffe96 100644 --- a/c/driver/postgresql/copy/writer.h +++ b/c/driver/postgresql/copy/writer.h @@ -490,90 +490,99 @@ class PostgresCopyTimestampFieldWriter : public PostgresCopyFieldWriter { } }; -static inline ArrowErrorCode MakeCopyFieldWriter(struct ArrowSchema* schema, - PostgresCopyFieldWriter** out, - ArrowError* error) { +static inline ArrowErrorCode MakeCopyFieldWriter( + struct ArrowSchema* schema, std::unique_ptr* out, + ArrowError* error) { struct ArrowSchemaView schema_view; NANOARROW_RETURN_NOT_OK(ArrowSchemaViewInit(&schema_view, schema, error)); switch (schema_view.type) { case NANOARROW_TYPE_BOOL: - *out = new PostgresCopyBooleanFieldWriter(); + *out = std::make_unique(); return NANOARROW_OK; case NANOARROW_TYPE_INT8: case NANOARROW_TYPE_INT16: - *out = new PostgresCopyNetworkEndianFieldWriter(); + *out = std::make_unique>(); return NANOARROW_OK; case NANOARROW_TYPE_INT32: - *out = new PostgresCopyNetworkEndianFieldWriter(); + *out = std::make_unique>(); return NANOARROW_OK; case NANOARROW_TYPE_INT64: - *out = new PostgresCopyNetworkEndianFieldWriter(); + *out = std::make_unique>(); return NANOARROW_OK; case NANOARROW_TYPE_DATE32: { constexpr int32_t kPostgresDateEpoch = 10957; - *out = new PostgresCopyNetworkEndianFieldWriter(); + *out = std::make_unique< + PostgresCopyNetworkEndianFieldWriter>(); return NANOARROW_OK; } case NANOARROW_TYPE_FLOAT: - *out = new PostgresCopyFloatFieldWriter(); + *out = std::make_unique(); return NANOARROW_OK; case NANOARROW_TYPE_DOUBLE: - *out = new PostgresCopyDoubleFieldWriter(); + *out = std::make_unique(); return NANOARROW_OK; case NANOARROW_TYPE_DECIMAL128: { const auto precision = schema_view.decimal_precision; const auto scale = schema_view.decimal_scale; - *out = - new PostgresCopyNumericFieldWriter(precision, scale); + *out = std::make_unique>( + precision, scale); return NANOARROW_OK; } case NANOARROW_TYPE_DECIMAL256: { const auto precision = schema_view.decimal_precision; const auto scale = schema_view.decimal_scale; - *out = - new PostgresCopyNumericFieldWriter(precision, scale); + *out = std::make_unique>( + precision, scale); return NANOARROW_OK; } case NANOARROW_TYPE_BINARY: case NANOARROW_TYPE_STRING: case NANOARROW_TYPE_LARGE_STRING: - *out = new PostgresCopyBinaryFieldWriter(); + *out = std::make_unique(); return NANOARROW_OK; case NANOARROW_TYPE_TIMESTAMP: { switch (schema_view.time_unit) { case NANOARROW_TIME_UNIT_NANO: - *out = new PostgresCopyTimestampFieldWriter(); + *out = std::make_unique< + PostgresCopyTimestampFieldWriter>(); break; case NANOARROW_TIME_UNIT_MILLI: - *out = new PostgresCopyTimestampFieldWriter(); + *out = std::make_unique< + PostgresCopyTimestampFieldWriter>(); break; case NANOARROW_TIME_UNIT_MICRO: - *out = new PostgresCopyTimestampFieldWriter(); + *out = std::make_unique< + PostgresCopyTimestampFieldWriter>(); break; case NANOARROW_TIME_UNIT_SECOND: - *out = new PostgresCopyTimestampFieldWriter(); + *out = std::make_unique< + PostgresCopyTimestampFieldWriter>(); break; } return NANOARROW_OK; } case NANOARROW_TYPE_INTERVAL_MONTH_DAY_NANO: - *out = new PostgresCopyIntervalFieldWriter(); + *out = std::make_unique(); return NANOARROW_OK; case NANOARROW_TYPE_DURATION: { switch (schema_view.time_unit) { case NANOARROW_TIME_UNIT_SECOND: - *out = new PostgresCopyDurationFieldWriter(); + *out = std::make_unique< + PostgresCopyDurationFieldWriter>(); break; case NANOARROW_TIME_UNIT_MILLI: - *out = new PostgresCopyDurationFieldWriter(); + *out = std::make_unique< + PostgresCopyDurationFieldWriter>(); break; case NANOARROW_TIME_UNIT_MICRO: - *out = new PostgresCopyDurationFieldWriter(); + *out = std::make_unique< + PostgresCopyDurationFieldWriter>(); break; case NANOARROW_TIME_UNIT_NANO: - *out = new PostgresCopyDurationFieldWriter(); + *out = std::make_unique< + PostgresCopyDurationFieldWriter>(); break; } return NANOARROW_OK; @@ -587,7 +596,7 @@ static inline ArrowErrorCode MakeCopyFieldWriter(struct ArrowSchema* schema, case NANOARROW_TYPE_STRING: case NANOARROW_TYPE_LARGE_BINARY: case NANOARROW_TYPE_LARGE_STRING: - *out = new PostgresCopyBinaryDictFieldWriter(); + *out = std::make_unique(); return NANOARROW_OK; default: break; @@ -644,10 +653,10 @@ class PostgresCopyStreamWriter { } for (int64_t i = 0; i < schema_->n_children; i++) { - PostgresCopyFieldWriter* child_writer = nullptr; + std::unique_ptr child_writer; NANOARROW_RETURN_NOT_OK( MakeCopyFieldWriter(schema_->children[i], &child_writer, error)); - root_writer_.AppendChild(std::unique_ptr(child_writer)); + root_writer_.AppendChild(std::move(child_writer)); } return NANOARROW_OK;