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);