From 4357de585d3ebc2ee5bd76d822f5ec83ddc29a1d Mon Sep 17 00:00:00 2001 From: David Li Date: Mon, 12 Feb 2024 14:10:20 -0500 Subject: [PATCH] refactor(c/driver/postgresql): update with C++17 conventions Fixes #1431. --- c/driver/postgresql/connection.cc | 32 ++++++++++++----------------- c/driver/postgresql/result_helper.h | 8 ++++---- c/driver/postgresql/statement.cc | 2 +- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/c/driver/postgresql/connection.cc b/c/driver/postgresql/connection.cc index deae3171c5..f7fc56d9a3 100644 --- a/c/driver/postgresql/connection.cc +++ b/c/driver/postgresql/connection.cc @@ -932,7 +932,7 @@ AdbcStatusCode PostgresConnectionGetStatisticsImpl(PGconn* conn, const char* db_ for (PqResultRow row : result_helper) { auto reltuples = row[5].ParseDouble(); - if (!reltuples.first) { + if (!reltuples) { SetError(error, "[libpq] Invalid double value in reltuples: '%s'", row[5].data); return ADBC_STATUS_INTERNAL; } @@ -946,8 +946,7 @@ AdbcStatusCode PostgresConnectionGetStatisticsImpl(PGconn* conn, const char* db_ CHECK_NA(INTERNAL, ArrowArrayAppendInt(statistics_key_col, ADBC_STATISTIC_ROW_COUNT_KEY), error); - CHECK_NA(INTERNAL, ArrowArrayAppendDouble(value_float64_col, reltuples.second), - error); + CHECK_NA(INTERNAL, ArrowArrayAppendDouble(value_float64_col, *reltuples), error); CHECK_NA(INTERNAL, ArrowArrayFinishUnionElement(statistics_value_col, kStatsVariantFloat64), error); @@ -957,7 +956,7 @@ AdbcStatusCode PostgresConnectionGetStatisticsImpl(PGconn* conn, const char* db_ } auto null_frac = row[2].ParseDouble(); - if (!null_frac.first) { + if (!null_frac) { SetError(error, "[libpq] Invalid double value in null_frac: '%s'", row[2].data); return ADBC_STATUS_INTERNAL; } @@ -973,10 +972,8 @@ AdbcStatusCode PostgresConnectionGetStatisticsImpl(PGconn* conn, const char* db_ CHECK_NA(INTERNAL, ArrowArrayAppendInt(statistics_key_col, ADBC_STATISTIC_NULL_COUNT_KEY), error); - CHECK_NA( - INTERNAL, - ArrowArrayAppendDouble(value_float64_col, null_frac.second * reltuples.second), - error); + CHECK_NA(INTERNAL, + ArrowArrayAppendDouble(value_float64_col, *null_frac * *reltuples), error); CHECK_NA(INTERNAL, ArrowArrayFinishUnionElement(statistics_value_col, kStatsVariantFloat64), error); @@ -984,7 +981,7 @@ AdbcStatusCode PostgresConnectionGetStatisticsImpl(PGconn* conn, const char* db_ CHECK_NA(INTERNAL, ArrowArrayFinishElement(db_schema_statistics_items), error); auto average_byte_width = row[3].ParseDouble(); - if (!average_byte_width.first) { + if (!average_byte_width) { SetError(error, "[libpq] Invalid double value in avg_width: '%s'", row[3].data); return ADBC_STATUS_INTERNAL; } @@ -1001,8 +998,7 @@ AdbcStatusCode PostgresConnectionGetStatisticsImpl(PGconn* conn, const char* db_ INTERNAL, ArrowArrayAppendInt(statistics_key_col, ADBC_STATISTIC_AVERAGE_BYTE_WIDTH_KEY), error); - CHECK_NA(INTERNAL, - ArrowArrayAppendDouble(value_float64_col, average_byte_width.second), + CHECK_NA(INTERNAL, ArrowArrayAppendDouble(value_float64_col, *average_byte_width), error); CHECK_NA(INTERNAL, ArrowArrayFinishUnionElement(statistics_value_col, kStatsVariantFloat64), @@ -1011,7 +1007,7 @@ AdbcStatusCode PostgresConnectionGetStatisticsImpl(PGconn* conn, const char* db_ CHECK_NA(INTERNAL, ArrowArrayFinishElement(db_schema_statistics_items), error); auto n_distinct = row[4].ParseDouble(); - if (!n_distinct.first) { + if (!n_distinct) { SetError(error, "[libpq] Invalid double value in avg_width: '%s'", row[4].data); return ADBC_STATUS_INTERNAL; } @@ -1031,13 +1027,11 @@ AdbcStatusCode PostgresConnectionGetStatisticsImpl(PGconn* conn, const char* db_ // > the column. If less than zero, the negative of the number of // > distinct values divided by the number of rows. // https://www.postgresql.org/docs/current/view-pg-stats.html - CHECK_NA( - INTERNAL, - ArrowArrayAppendDouble(value_float64_col, - n_distinct.second > 0 - ? n_distinct.second - : (std::fabs(n_distinct.second) * reltuples.second)), - error); + CHECK_NA(INTERNAL, + ArrowArrayAppendDouble( + value_float64_col, + *n_distinct > 0 ? *n_distinct : (std::fabs(*n_distinct) * *reltuples)), + error); CHECK_NA(INTERNAL, ArrowArrayFinishUnionElement(statistics_value_col, kStatsVariantFloat64), error); diff --git a/c/driver/postgresql/result_helper.h b/c/driver/postgresql/result_helper.h index e9307dcbe9..8eec8dc347 100644 --- a/c/driver/postgresql/result_helper.h +++ b/c/driver/postgresql/result_helper.h @@ -18,6 +18,7 @@ #pragma once #include +#include #include #include #include @@ -33,14 +34,13 @@ struct PqRecord { const int len; const bool is_null; - // XXX: can't use optional due to R - std::pair ParseDouble() const { + std::optional ParseDouble() const { char* end; double result = std::strtod(data, &end); if (errno != 0 || end == data) { - return std::make_pair(false, 0.0); + return std::nullopt; } - return std::make_pair(true, result); + return result; } }; diff --git a/c/driver/postgresql/statement.cc b/c/driver/postgresql/statement.cc index c599832904..8e5490046f 100644 --- a/c/driver/postgresql/statement.cc +++ b/c/driver/postgresql/statement.cc @@ -1547,7 +1547,7 @@ AdbcStatusCode PostgresStatement::SetupReader(struct AdbcError* error) { // Initialize the copy reader and infer the output schema (i.e., error for // unsupported types before issuing the COPY query) - reader_.copy_reader_.reset(new PostgresCopyStreamReader()); + reader_.copy_reader_ = std::make_unique(); reader_.copy_reader_->Init(root_type); struct ArrowError na_error; int na_res = reader_.copy_reader_->InferOutputSchema(&na_error);