From 93ae2e8940533aafbbc30e77b5587d592290ef28 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sun, 22 Jan 2023 12:08:55 +0200 Subject: [PATCH 01/31] init cpp11 --- DESCRIPTION | 7 +- R/RcppExports.R | 107 ------------- R/cpp11.R | 105 +++++++++++++ src/RPostgres_types.h | 20 ++- src/RcppExports.cpp | 340 ------------------------------------------ src/connection.cpp | 42 ++---- src/cpp11.cpp | 237 +++++++++++++++++++++++++++++ src/encode.cpp | 4 +- src/encrypt.cpp | 2 +- src/logging.cpp | 2 +- src/pch.h | 1 + src/result.cpp | 30 ++-- 12 files changed, 389 insertions(+), 508 deletions(-) delete mode 100644 R/RcppExports.R create mode 100644 R/cpp11.R delete mode 100644 src/RcppExports.cpp create mode 100644 src/cpp11.cpp diff --git a/DESCRIPTION b/DESCRIPTION index a93d7256..83202e4a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -37,7 +37,8 @@ Suggests: testthat (>= 3.0.0) LinkingTo: plogr (>= 0.2.0), - Rcpp + Rcpp, + cpp11 VignetteBuilder: knitr Config/autostyle/scope: line_breaks @@ -48,13 +49,13 @@ LazyLoad: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.2.3 SystemRequirements: libpq >= 9.0: libpq-dev (deb) or postgresql-devel - (rpm) + (rpm), C++11 Collate: 'PqDriver.R' 'PqConnection.R' 'PqResult.R' 'RPostgres-pkg.R' - 'RcppExports.R' + 'cpp11.R' 'Redshift.R' 'dbAppendTable_PqConnection.R' 'dbBegin_PqConnection.R' diff --git a/R/RcppExports.R b/R/RcppExports.R deleted file mode 100644 index f17181be..00000000 --- a/R/RcppExports.R +++ /dev/null @@ -1,107 +0,0 @@ -# Generated by using Rcpp::compileAttributes() -> do not edit by hand -# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -client_version <- function() { - .Call(`_RPostgres_client_version`) -} - -connection_create <- function(keys, values, check_interrupts) { - .Call(`_RPostgres_connection_create`, keys, values, check_interrupts) -} - -connection_valid <- function(con_) { - .Call(`_RPostgres_connection_valid`, con_) -} - -connection_release <- function(con_) { - invisible(.Call(`_RPostgres_connection_release`, con_)) -} - -connection_info <- function(con) { - .Call(`_RPostgres_connection_info`, con) -} - -connection_quote_string <- function(con, xs) { - .Call(`_RPostgres_connection_quote_string`, con, xs) -} - -connection_quote_identifier <- function(con, xs) { - .Call(`_RPostgres_connection_quote_identifier`, con, xs) -} - -connection_is_transacting <- function(con) { - .Call(`_RPostgres_connection_is_transacting`, con) -} - -connection_set_transacting <- function(con, transacting) { - invisible(.Call(`_RPostgres_connection_set_transacting`, con, transacting)) -} - -connection_copy_data <- function(con, sql, df) { - invisible(.Call(`_RPostgres_connection_copy_data`, con, sql, df)) -} - -connection_wait_for_notify <- function(con, timeout_secs) { - .Call(`_RPostgres_connection_wait_for_notify`, con, timeout_secs) -} - -connection_get_temp_schema <- function(con) { - .Call(`_RPostgres_connection_get_temp_schema`, con) -} - -connection_set_temp_schema <- function(con, temp_schema) { - invisible(.Call(`_RPostgres_connection_set_temp_schema`, con, temp_schema)) -} - -encode_vector <- function(x) { - .Call(`_RPostgres_encode_vector`, x) -} - -encode_data_frame <- function(x) { - .Call(`_RPostgres_encode_data_frame`, x) -} - -encrypt_password <- function(password, user) { - .Call(`_RPostgres_encrypt_password`, password, user) -} - -init_logging <- function(log_level) { - invisible(.Call(`_RPostgres_init_logging`, log_level)) -} - -result_create <- function(con, sql, immediate) { - .Call(`_RPostgres_result_create`, con, sql, immediate) -} - -result_release <- function(res) { - invisible(.Call(`_RPostgres_result_release`, res)) -} - -result_valid <- function(res_) { - .Call(`_RPostgres_result_valid`, res_) -} - -result_fetch <- function(res, n) { - .Call(`_RPostgres_result_fetch`, res, n) -} - -result_bind <- function(res, params) { - invisible(.Call(`_RPostgres_result_bind`, res, params)) -} - -result_has_completed <- function(res) { - .Call(`_RPostgres_result_has_completed`, res) -} - -result_rows_fetched <- function(res) { - .Call(`_RPostgres_result_rows_fetched`, res) -} - -result_rows_affected <- function(res) { - .Call(`_RPostgres_result_rows_affected`, res) -} - -result_column_info <- function(res) { - .Call(`_RPostgres_result_column_info`, res) -} - diff --git a/R/cpp11.R b/R/cpp11.R new file mode 100644 index 00000000..5c1d0cd2 --- /dev/null +++ b/R/cpp11.R @@ -0,0 +1,105 @@ +# Generated by cpp11: do not edit by hand + +client_version <- function() { + .Call(`_RPostgres_client_version`) +} + +connection_create <- function(keys, values, check_interrupts) { + .Call(`_RPostgres_connection_create`, keys, values, check_interrupts) +} + +connection_valid <- function(con_) { + .Call(`_RPostgres_connection_valid`, con_) +} + +connection_release <- function(con_) { + invisible(.Call(`_RPostgres_connection_release`, con_)) +} + +connection_info <- function(con) { + .Call(`_RPostgres_connection_info`, con) +} + +connection_quote_string <- function(con, xs) { + .Call(`_RPostgres_connection_quote_string`, con, xs) +} + +connection_quote_identifier <- function(con, xs) { + .Call(`_RPostgres_connection_quote_identifier`, con, xs) +} + +connection_is_transacting <- function(con) { + .Call(`_RPostgres_connection_is_transacting`, con) +} + +connection_set_transacting <- function(con, transacting) { + invisible(.Call(`_RPostgres_connection_set_transacting`, con, transacting)) +} + +connection_copy_data <- function(con, sql, df) { + invisible(.Call(`_RPostgres_connection_copy_data`, con, sql, df)) +} + +connection_wait_for_notify <- function(con, timeout_secs) { + .Call(`_RPostgres_connection_wait_for_notify`, con, timeout_secs) +} + +connection_get_temp_schema <- function(con) { + .Call(`_RPostgres_connection_get_temp_schema`, con) +} + +connection_set_temp_schema <- function(con, temp_schema) { + invisible(.Call(`_RPostgres_connection_set_temp_schema`, con, temp_schema)) +} + +encode_vector <- function(x) { + .Call(`_RPostgres_encode_vector`, x) +} + +encode_data_frame <- function(x) { + .Call(`_RPostgres_encode_data_frame`, x) +} + +encrypt_password <- function(password, user) { + .Call(`_RPostgres_encrypt_password`, password, user) +} + +init_logging <- function(log_level) { + invisible(.Call(`_RPostgres_init_logging`, log_level)) +} + +result_create <- function(con, sql, immediate) { + .Call(`_RPostgres_result_create`, con, sql, immediate) +} + +result_release <- function(res) { + invisible(.Call(`_RPostgres_result_release`, res)) +} + +result_valid <- function(res_) { + .Call(`_RPostgres_result_valid`, res_) +} + +result_fetch <- function(res, n) { + .Call(`_RPostgres_result_fetch`, res, n) +} + +result_bind <- function(res, params) { + invisible(.Call(`_RPostgres_result_bind`, res, params)) +} + +result_has_completed <- function(res) { + .Call(`_RPostgres_result_has_completed`, res) +} + +result_rows_fetched <- function(res) { + .Call(`_RPostgres_result_rows_fetched`, res) +} + +result_rows_affected <- function(res) { + .Call(`_RPostgres_result_rows_affected`, res) +} + +result_column_info <- function(res) { + .Call(`_RPostgres_result_column_info`, res) +} diff --git a/src/RPostgres_types.h b/src/RPostgres_types.h index 57c4af79..8f67f459 100644 --- a/src/RPostgres_types.h +++ b/src/RPostgres_types.h @@ -6,13 +6,23 @@ #include "DbConnection.h" #include "DbResult.h" -namespace Rcpp { +namespace cpp11 { -template<> -DbConnection* as(SEXP x); +template +enable_if_t, DbConnection*>::value, decay_t> as_cpp(SEXP from) { + DbConnectionPtr* connection = (DbConnectionPtr*)(R_ExternalPtrAddr(from)); + if (!connection) + stop("Invalid connection"); + return connection->get(); +} -template<> -DbResult* as(SEXP x); +template +enable_if_t, DbResult*>::value, decay_t> as_cpp(SEXP from) { + DbResult* result = (DbResult*)(R_ExternalPtrAddr(from)); + if (!result) + stop("Invalid result set"); + return result; +} } diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp deleted file mode 100644 index 01dc884d..00000000 --- a/src/RcppExports.cpp +++ /dev/null @@ -1,340 +0,0 @@ -// Generated by using Rcpp::compileAttributes() -> do not edit by hand -// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -#include "RPostgres_types.h" -#include - -using namespace Rcpp; - -#ifdef RCPP_USE_GLOBAL_ROSTREAM -Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); -Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); -#endif - -// client_version -int client_version(); -RcppExport SEXP _RPostgres_client_version() { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - rcpp_result_gen = Rcpp::wrap(client_version()); - return rcpp_result_gen; -END_RCPP -} -// connection_create -XPtr connection_create(std::vector keys, std::vector values, bool check_interrupts); -RcppExport SEXP _RPostgres_connection_create(SEXP keysSEXP, SEXP valuesSEXP, SEXP check_interruptsSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< std::vector >::type keys(keysSEXP); - Rcpp::traits::input_parameter< std::vector >::type values(valuesSEXP); - Rcpp::traits::input_parameter< bool >::type check_interrupts(check_interruptsSEXP); - rcpp_result_gen = Rcpp::wrap(connection_create(keys, values, check_interrupts)); - return rcpp_result_gen; -END_RCPP -} -// connection_valid -bool connection_valid(XPtr con_); -RcppExport SEXP _RPostgres_connection_valid(SEXP con_SEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< XPtr >::type con_(con_SEXP); - rcpp_result_gen = Rcpp::wrap(connection_valid(con_)); - return rcpp_result_gen; -END_RCPP -} -// connection_release -void connection_release(XPtr con_); -RcppExport SEXP _RPostgres_connection_release(SEXP con_SEXP) { -BEGIN_RCPP - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< XPtr >::type con_(con_SEXP); - connection_release(con_); - return R_NilValue; -END_RCPP -} -// connection_info -List connection_info(DbConnection* con); -RcppExport SEXP _RPostgres_connection_info(SEXP conSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - rcpp_result_gen = Rcpp::wrap(connection_info(con)); - return rcpp_result_gen; -END_RCPP -} -// connection_quote_string -CharacterVector connection_quote_string(DbConnection* con, CharacterVector xs); -RcppExport SEXP _RPostgres_connection_quote_string(SEXP conSEXP, SEXP xsSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - Rcpp::traits::input_parameter< CharacterVector >::type xs(xsSEXP); - rcpp_result_gen = Rcpp::wrap(connection_quote_string(con, xs)); - return rcpp_result_gen; -END_RCPP -} -// connection_quote_identifier -CharacterVector connection_quote_identifier(DbConnection* con, CharacterVector xs); -RcppExport SEXP _RPostgres_connection_quote_identifier(SEXP conSEXP, SEXP xsSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - Rcpp::traits::input_parameter< CharacterVector >::type xs(xsSEXP); - rcpp_result_gen = Rcpp::wrap(connection_quote_identifier(con, xs)); - return rcpp_result_gen; -END_RCPP -} -// connection_is_transacting -bool connection_is_transacting(DbConnection* con); -RcppExport SEXP _RPostgres_connection_is_transacting(SEXP conSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - rcpp_result_gen = Rcpp::wrap(connection_is_transacting(con)); - return rcpp_result_gen; -END_RCPP -} -// connection_set_transacting -void connection_set_transacting(DbConnection* con, bool transacting); -RcppExport SEXP _RPostgres_connection_set_transacting(SEXP conSEXP, SEXP transactingSEXP) { -BEGIN_RCPP - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - Rcpp::traits::input_parameter< bool >::type transacting(transactingSEXP); - connection_set_transacting(con, transacting); - return R_NilValue; -END_RCPP -} -// connection_copy_data -void connection_copy_data(DbConnection* con, std::string sql, List df); -RcppExport SEXP _RPostgres_connection_copy_data(SEXP conSEXP, SEXP sqlSEXP, SEXP dfSEXP) { -BEGIN_RCPP - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - Rcpp::traits::input_parameter< std::string >::type sql(sqlSEXP); - Rcpp::traits::input_parameter< List >::type df(dfSEXP); - connection_copy_data(con, sql, df); - return R_NilValue; -END_RCPP -} -// connection_wait_for_notify -List connection_wait_for_notify(DbConnection* con, int timeout_secs); -RcppExport SEXP _RPostgres_connection_wait_for_notify(SEXP conSEXP, SEXP timeout_secsSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - Rcpp::traits::input_parameter< int >::type timeout_secs(timeout_secsSEXP); - rcpp_result_gen = Rcpp::wrap(connection_wait_for_notify(con, timeout_secs)); - return rcpp_result_gen; -END_RCPP -} -// connection_get_temp_schema -CharacterVector connection_get_temp_schema(DbConnection* con); -RcppExport SEXP _RPostgres_connection_get_temp_schema(SEXP conSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - rcpp_result_gen = Rcpp::wrap(connection_get_temp_schema(con)); - return rcpp_result_gen; -END_RCPP -} -// connection_set_temp_schema -void connection_set_temp_schema(DbConnection* con, CharacterVector temp_schema); -RcppExport SEXP _RPostgres_connection_set_temp_schema(SEXP conSEXP, SEXP temp_schemaSEXP) { -BEGIN_RCPP - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbConnection* >::type con(conSEXP); - Rcpp::traits::input_parameter< CharacterVector >::type temp_schema(temp_schemaSEXP); - connection_set_temp_schema(con, temp_schema); - return R_NilValue; -END_RCPP -} -// encode_vector -std::string encode_vector(RObject x); -RcppExport SEXP _RPostgres_encode_vector(SEXP xSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< RObject >::type x(xSEXP); - rcpp_result_gen = Rcpp::wrap(encode_vector(x)); - return rcpp_result_gen; -END_RCPP -} -// encode_data_frame -std::string encode_data_frame(List x); -RcppExport SEXP _RPostgres_encode_data_frame(SEXP xSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< List >::type x(xSEXP); - rcpp_result_gen = Rcpp::wrap(encode_data_frame(x)); - return rcpp_result_gen; -END_RCPP -} -// encrypt_password -String encrypt_password(String password, String user); -RcppExport SEXP _RPostgres_encrypt_password(SEXP passwordSEXP, SEXP userSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< String >::type password(passwordSEXP); - Rcpp::traits::input_parameter< String >::type user(userSEXP); - rcpp_result_gen = Rcpp::wrap(encrypt_password(password, user)); - return rcpp_result_gen; -END_RCPP -} -// init_logging -void init_logging(const std::string& log_level); -RcppExport SEXP _RPostgres_init_logging(SEXP log_levelSEXP) { -BEGIN_RCPP - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const std::string& >::type log_level(log_levelSEXP); - init_logging(log_level); - return R_NilValue; -END_RCPP -} -// result_create -XPtr result_create(XPtr con, std::string sql, bool immediate); -RcppExport SEXP _RPostgres_result_create(SEXP conSEXP, SEXP sqlSEXP, SEXP immediateSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< XPtr >::type con(conSEXP); - Rcpp::traits::input_parameter< std::string >::type sql(sqlSEXP); - Rcpp::traits::input_parameter< bool >::type immediate(immediateSEXP); - rcpp_result_gen = Rcpp::wrap(result_create(con, sql, immediate)); - return rcpp_result_gen; -END_RCPP -} -// result_release -void result_release(XPtr res); -RcppExport SEXP _RPostgres_result_release(SEXP resSEXP) { -BEGIN_RCPP - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< XPtr >::type res(resSEXP); - result_release(res); - return R_NilValue; -END_RCPP -} -// result_valid -bool result_valid(XPtr res_); -RcppExport SEXP _RPostgres_result_valid(SEXP res_SEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< XPtr >::type res_(res_SEXP); - rcpp_result_gen = Rcpp::wrap(result_valid(res_)); - return rcpp_result_gen; -END_RCPP -} -// result_fetch -List result_fetch(DbResult* res, const int n); -RcppExport SEXP _RPostgres_result_fetch(SEXP resSEXP, SEXP nSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbResult* >::type res(resSEXP); - Rcpp::traits::input_parameter< const int >::type n(nSEXP); - rcpp_result_gen = Rcpp::wrap(result_fetch(res, n)); - return rcpp_result_gen; -END_RCPP -} -// result_bind -void result_bind(DbResult* res, List params); -RcppExport SEXP _RPostgres_result_bind(SEXP resSEXP, SEXP paramsSEXP) { -BEGIN_RCPP - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbResult* >::type res(resSEXP); - Rcpp::traits::input_parameter< List >::type params(paramsSEXP); - result_bind(res, params); - return R_NilValue; -END_RCPP -} -// result_has_completed -bool result_has_completed(DbResult* res); -RcppExport SEXP _RPostgres_result_has_completed(SEXP resSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbResult* >::type res(resSEXP); - rcpp_result_gen = Rcpp::wrap(result_has_completed(res)); - return rcpp_result_gen; -END_RCPP -} -// result_rows_fetched -int result_rows_fetched(DbResult* res); -RcppExport SEXP _RPostgres_result_rows_fetched(SEXP resSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbResult* >::type res(resSEXP); - rcpp_result_gen = Rcpp::wrap(result_rows_fetched(res)); - return rcpp_result_gen; -END_RCPP -} -// result_rows_affected -int result_rows_affected(DbResult* res); -RcppExport SEXP _RPostgres_result_rows_affected(SEXP resSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbResult* >::type res(resSEXP); - rcpp_result_gen = Rcpp::wrap(result_rows_affected(res)); - return rcpp_result_gen; -END_RCPP -} -// result_column_info -List result_column_info(DbResult* res); -RcppExport SEXP _RPostgres_result_column_info(SEXP resSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< DbResult* >::type res(resSEXP); - rcpp_result_gen = Rcpp::wrap(result_column_info(res)); - return rcpp_result_gen; -END_RCPP -} - -static const R_CallMethodDef CallEntries[] = { - {"_RPostgres_client_version", (DL_FUNC) &_RPostgres_client_version, 0}, - {"_RPostgres_connection_create", (DL_FUNC) &_RPostgres_connection_create, 3}, - {"_RPostgres_connection_valid", (DL_FUNC) &_RPostgres_connection_valid, 1}, - {"_RPostgres_connection_release", (DL_FUNC) &_RPostgres_connection_release, 1}, - {"_RPostgres_connection_info", (DL_FUNC) &_RPostgres_connection_info, 1}, - {"_RPostgres_connection_quote_string", (DL_FUNC) &_RPostgres_connection_quote_string, 2}, - {"_RPostgres_connection_quote_identifier", (DL_FUNC) &_RPostgres_connection_quote_identifier, 2}, - {"_RPostgres_connection_is_transacting", (DL_FUNC) &_RPostgres_connection_is_transacting, 1}, - {"_RPostgres_connection_set_transacting", (DL_FUNC) &_RPostgres_connection_set_transacting, 2}, - {"_RPostgres_connection_copy_data", (DL_FUNC) &_RPostgres_connection_copy_data, 3}, - {"_RPostgres_connection_wait_for_notify", (DL_FUNC) &_RPostgres_connection_wait_for_notify, 2}, - {"_RPostgres_connection_get_temp_schema", (DL_FUNC) &_RPostgres_connection_get_temp_schema, 1}, - {"_RPostgres_connection_set_temp_schema", (DL_FUNC) &_RPostgres_connection_set_temp_schema, 2}, - {"_RPostgres_encode_vector", (DL_FUNC) &_RPostgres_encode_vector, 1}, - {"_RPostgres_encode_data_frame", (DL_FUNC) &_RPostgres_encode_data_frame, 1}, - {"_RPostgres_encrypt_password", (DL_FUNC) &_RPostgres_encrypt_password, 2}, - {"_RPostgres_init_logging", (DL_FUNC) &_RPostgres_init_logging, 1}, - {"_RPostgres_result_create", (DL_FUNC) &_RPostgres_result_create, 3}, - {"_RPostgres_result_release", (DL_FUNC) &_RPostgres_result_release, 1}, - {"_RPostgres_result_valid", (DL_FUNC) &_RPostgres_result_valid, 1}, - {"_RPostgres_result_fetch", (DL_FUNC) &_RPostgres_result_fetch, 2}, - {"_RPostgres_result_bind", (DL_FUNC) &_RPostgres_result_bind, 2}, - {"_RPostgres_result_has_completed", (DL_FUNC) &_RPostgres_result_has_completed, 1}, - {"_RPostgres_result_rows_fetched", (DL_FUNC) &_RPostgres_result_rows_fetched, 1}, - {"_RPostgres_result_rows_affected", (DL_FUNC) &_RPostgres_result_rows_affected, 1}, - {"_RPostgres_result_column_info", (DL_FUNC) &_RPostgres_result_column_info, 1}, - {NULL, NULL, 0} -}; - -RcppExport void R_init_RPostgres(DllInfo *dll) { - R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); - R_useDynamicSymbols(dll, FALSE); -} diff --git a/src/connection.cpp b/src/connection.cpp index 0deffa32..884f4140 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -2,12 +2,12 @@ #include "RPostgres_types.h" -// [[Rcpp::export]] +[[cpp11::register]] int client_version() { return PQlibVersion(); } -// [[Rcpp::export]] +[[cpp11::register]] XPtr connection_create( std::vector keys, std::vector values, @@ -22,13 +22,13 @@ XPtr connection_create( return XPtr(pConn, true); } -// [[Rcpp::export]] +[[cpp11::register]] bool connection_valid(XPtr con_) { DbConnectionPtr* con = con_.get(); return con; } -// [[Rcpp::export]] +[[cpp11::register]] void connection_release(XPtr con_) { if (!connection_valid(con_)) { warning("Already disconnected"); @@ -47,14 +47,14 @@ void connection_release(XPtr con_) { con_.release(); } -// [[Rcpp::export]] +[[cpp11::register]] List connection_info(DbConnection* con) { return con->info(); } // Quoting -// [[Rcpp::export]] +[[cpp11::register]] CharacterVector connection_quote_string(DbConnection* con, CharacterVector xs) { R_xlen_t n = xs.size(); CharacterVector output(n); @@ -67,7 +67,7 @@ CharacterVector connection_quote_string(DbConnection* con, CharacterVector xs) { return output; } -// [[Rcpp::export]] +[[cpp11::register]] CharacterVector connection_quote_identifier(DbConnection* con, CharacterVector xs) { R_xlen_t n = xs.size(); CharacterVector output(n); @@ -82,48 +82,34 @@ CharacterVector connection_quote_identifier(DbConnection* con, CharacterVector x // Transactions -// [[Rcpp::export]] +[[cpp11::register]] bool connection_is_transacting(DbConnection* con) { return con->is_transacting(); } -// [[Rcpp::export]] +[[cpp11::register]] void connection_set_transacting(DbConnection* con, bool transacting) { con->set_transacting(transacting); } // Specific functions -// [[Rcpp::export]] +[[cpp11::register]] void connection_copy_data(DbConnection* con, std::string sql, List df) { return con->copy_data(sql, df); } -// [[Rcpp::export]] +[[cpp11::register]] List connection_wait_for_notify(DbConnection* con, int timeout_secs) { return con->wait_for_notify(timeout_secs); } // Temporary Schema -// [[Rcpp::export]] +[[cpp11::register]] CharacterVector connection_get_temp_schema(DbConnection* con) { return con->get_temp_schema(); } -// [[Rcpp::export]] +[[cpp11::register]] void connection_set_temp_schema(DbConnection* con, CharacterVector temp_schema) { con->set_temp_schema(temp_schema); -} - -// as() override - -namespace Rcpp { - -template<> -DbConnection* as(SEXP x) { - DbConnectionPtr* connection = (DbConnectionPtr*)(R_ExternalPtrAddr(x)); - if (!connection) - stop("Invalid connection"); - return connection->get(); -} - -} +} \ No newline at end of file diff --git a/src/cpp11.cpp b/src/cpp11.cpp new file mode 100644 index 00000000..8b41c022 --- /dev/null +++ b/src/cpp11.cpp @@ -0,0 +1,237 @@ +// Generated by cpp11: do not edit by hand +// clang-format off + +#include "RPostgres_types.h" +#include +#include +using namespace Rcpp; +#include "cpp11/declarations.hpp" +#include + +// connection.cpp +int client_version(); +extern "C" SEXP _RPostgres_client_version() { + BEGIN_CPP11 + return cpp11::as_sexp(client_version()); + END_CPP11 +} +// connection.cpp +XPtr connection_create(std::vector keys, std::vector values, bool check_interrupts); +extern "C" SEXP _RPostgres_connection_create(SEXP keys, SEXP values, SEXP check_interrupts) { + BEGIN_CPP11 + return cpp11::as_sexp(connection_create(cpp11::as_cpp>>(keys), cpp11::as_cpp>>(values), cpp11::as_cpp>(check_interrupts))); + END_CPP11 +} +// connection.cpp +bool connection_valid(XPtr con_); +extern "C" SEXP _RPostgres_connection_valid(SEXP con_) { + BEGIN_CPP11 + return cpp11::as_sexp(connection_valid(cpp11::as_cpp>>(con_))); + END_CPP11 +} +// connection.cpp +void connection_release(XPtr con_); +extern "C" SEXP _RPostgres_connection_release(SEXP con_) { + BEGIN_CPP11 + connection_release(cpp11::as_cpp>>(con_)); + return R_NilValue; + END_CPP11 +} +// connection.cpp +List connection_info(DbConnection* con); +extern "C" SEXP _RPostgres_connection_info(SEXP con) { + BEGIN_CPP11 + return cpp11::as_sexp(connection_info(cpp11::as_cpp>(con))); + END_CPP11 +} +// connection.cpp +CharacterVector connection_quote_string(DbConnection* con, CharacterVector xs); +extern "C" SEXP _RPostgres_connection_quote_string(SEXP con, SEXP xs) { + BEGIN_CPP11 + return cpp11::as_sexp(connection_quote_string(cpp11::as_cpp>(con), cpp11::as_cpp>(xs))); + END_CPP11 +} +// connection.cpp +CharacterVector connection_quote_identifier(DbConnection* con, CharacterVector xs); +extern "C" SEXP _RPostgres_connection_quote_identifier(SEXP con, SEXP xs) { + BEGIN_CPP11 + return cpp11::as_sexp(connection_quote_identifier(cpp11::as_cpp>(con), cpp11::as_cpp>(xs))); + END_CPP11 +} +// connection.cpp +bool connection_is_transacting(DbConnection* con); +extern "C" SEXP _RPostgres_connection_is_transacting(SEXP con) { + BEGIN_CPP11 + return cpp11::as_sexp(connection_is_transacting(cpp11::as_cpp>(con))); + END_CPP11 +} +// connection.cpp +void connection_set_transacting(DbConnection* con, bool transacting); +extern "C" SEXP _RPostgres_connection_set_transacting(SEXP con, SEXP transacting) { + BEGIN_CPP11 + connection_set_transacting(cpp11::as_cpp>(con), cpp11::as_cpp>(transacting)); + return R_NilValue; + END_CPP11 +} +// connection.cpp +void connection_copy_data(DbConnection* con, std::string sql, List df); +extern "C" SEXP _RPostgres_connection_copy_data(SEXP con, SEXP sql, SEXP df) { + BEGIN_CPP11 + connection_copy_data(cpp11::as_cpp>(con), cpp11::as_cpp>(sql), cpp11::as_cpp>(df)); + return R_NilValue; + END_CPP11 +} +// connection.cpp +List connection_wait_for_notify(DbConnection* con, int timeout_secs); +extern "C" SEXP _RPostgres_connection_wait_for_notify(SEXP con, SEXP timeout_secs) { + BEGIN_CPP11 + return cpp11::as_sexp(connection_wait_for_notify(cpp11::as_cpp>(con), cpp11::as_cpp>(timeout_secs))); + END_CPP11 +} +// connection.cpp +CharacterVector connection_get_temp_schema(DbConnection* con); +extern "C" SEXP _RPostgres_connection_get_temp_schema(SEXP con) { + BEGIN_CPP11 + return cpp11::as_sexp(connection_get_temp_schema(cpp11::as_cpp>(con))); + END_CPP11 +} +// connection.cpp +void connection_set_temp_schema(DbConnection* con, CharacterVector temp_schema); +extern "C" SEXP _RPostgres_connection_set_temp_schema(SEXP con, SEXP temp_schema) { + BEGIN_CPP11 + connection_set_temp_schema(cpp11::as_cpp>(con), cpp11::as_cpp>(temp_schema)); + return R_NilValue; + END_CPP11 +} +// encode.cpp +std::string encode_vector(RObject x); +extern "C" SEXP _RPostgres_encode_vector(SEXP x) { + BEGIN_CPP11 + return cpp11::as_sexp(encode_vector(cpp11::as_cpp>(x))); + END_CPP11 +} +// encode.cpp +std::string encode_data_frame(List x); +extern "C" SEXP _RPostgres_encode_data_frame(SEXP x) { + BEGIN_CPP11 + return cpp11::as_sexp(encode_data_frame(cpp11::as_cpp>(x))); + END_CPP11 +} +// encrypt.cpp +String encrypt_password(String password, String user); +extern "C" SEXP _RPostgres_encrypt_password(SEXP password, SEXP user) { + BEGIN_CPP11 + return cpp11::as_sexp(encrypt_password(cpp11::as_cpp>(password), cpp11::as_cpp>(user))); + END_CPP11 +} +// logging.cpp +void init_logging(const std::string& log_level); +extern "C" SEXP _RPostgres_init_logging(SEXP log_level) { + BEGIN_CPP11 + init_logging(cpp11::as_cpp>(log_level)); + return R_NilValue; + END_CPP11 +} +// result.cpp +XPtr result_create(XPtr con, std::string sql, bool immediate); +extern "C" SEXP _RPostgres_result_create(SEXP con, SEXP sql, SEXP immediate) { + BEGIN_CPP11 + return cpp11::as_sexp(result_create(cpp11::as_cpp>>(con), cpp11::as_cpp>(sql), cpp11::as_cpp>(immediate))); + END_CPP11 +} +// result.cpp +void result_release(XPtr res); +extern "C" SEXP _RPostgres_result_release(SEXP res) { + BEGIN_CPP11 + result_release(cpp11::as_cpp>>(res)); + return R_NilValue; + END_CPP11 +} +// result.cpp +bool result_valid(XPtr res_); +extern "C" SEXP _RPostgres_result_valid(SEXP res_) { + BEGIN_CPP11 + return cpp11::as_sexp(result_valid(cpp11::as_cpp>>(res_))); + END_CPP11 +} +// result.cpp +List result_fetch(DbResult* res, const int n); +extern "C" SEXP _RPostgres_result_fetch(SEXP res, SEXP n) { + BEGIN_CPP11 + return cpp11::as_sexp(result_fetch(cpp11::as_cpp>(res), cpp11::as_cpp>(n))); + END_CPP11 +} +// result.cpp +void result_bind(DbResult* res, List params); +extern "C" SEXP _RPostgres_result_bind(SEXP res, SEXP params) { + BEGIN_CPP11 + result_bind(cpp11::as_cpp>(res), cpp11::as_cpp>(params)); + return R_NilValue; + END_CPP11 +} +// result.cpp +bool result_has_completed(DbResult* res); +extern "C" SEXP _RPostgres_result_has_completed(SEXP res) { + BEGIN_CPP11 + return cpp11::as_sexp(result_has_completed(cpp11::as_cpp>(res))); + END_CPP11 +} +// result.cpp +int result_rows_fetched(DbResult* res); +extern "C" SEXP _RPostgres_result_rows_fetched(SEXP res) { + BEGIN_CPP11 + return cpp11::as_sexp(result_rows_fetched(cpp11::as_cpp>(res))); + END_CPP11 +} +// result.cpp +int result_rows_affected(DbResult* res); +extern "C" SEXP _RPostgres_result_rows_affected(SEXP res) { + BEGIN_CPP11 + return cpp11::as_sexp(result_rows_affected(cpp11::as_cpp>(res))); + END_CPP11 +} +// result.cpp +List result_column_info(DbResult* res); +extern "C" SEXP _RPostgres_result_column_info(SEXP res) { + BEGIN_CPP11 + return cpp11::as_sexp(result_column_info(cpp11::as_cpp>(res))); + END_CPP11 +} + +extern "C" { +static const R_CallMethodDef CallEntries[] = { + {"_RPostgres_client_version", (DL_FUNC) &_RPostgres_client_version, 0}, + {"_RPostgres_connection_copy_data", (DL_FUNC) &_RPostgres_connection_copy_data, 3}, + {"_RPostgres_connection_create", (DL_FUNC) &_RPostgres_connection_create, 3}, + {"_RPostgres_connection_get_temp_schema", (DL_FUNC) &_RPostgres_connection_get_temp_schema, 1}, + {"_RPostgres_connection_info", (DL_FUNC) &_RPostgres_connection_info, 1}, + {"_RPostgres_connection_is_transacting", (DL_FUNC) &_RPostgres_connection_is_transacting, 1}, + {"_RPostgres_connection_quote_identifier", (DL_FUNC) &_RPostgres_connection_quote_identifier, 2}, + {"_RPostgres_connection_quote_string", (DL_FUNC) &_RPostgres_connection_quote_string, 2}, + {"_RPostgres_connection_release", (DL_FUNC) &_RPostgres_connection_release, 1}, + {"_RPostgres_connection_set_temp_schema", (DL_FUNC) &_RPostgres_connection_set_temp_schema, 2}, + {"_RPostgres_connection_set_transacting", (DL_FUNC) &_RPostgres_connection_set_transacting, 2}, + {"_RPostgres_connection_valid", (DL_FUNC) &_RPostgres_connection_valid, 1}, + {"_RPostgres_connection_wait_for_notify", (DL_FUNC) &_RPostgres_connection_wait_for_notify, 2}, + {"_RPostgres_encode_data_frame", (DL_FUNC) &_RPostgres_encode_data_frame, 1}, + {"_RPostgres_encode_vector", (DL_FUNC) &_RPostgres_encode_vector, 1}, + {"_RPostgres_encrypt_password", (DL_FUNC) &_RPostgres_encrypt_password, 2}, + {"_RPostgres_init_logging", (DL_FUNC) &_RPostgres_init_logging, 1}, + {"_RPostgres_result_bind", (DL_FUNC) &_RPostgres_result_bind, 2}, + {"_RPostgres_result_column_info", (DL_FUNC) &_RPostgres_result_column_info, 1}, + {"_RPostgres_result_create", (DL_FUNC) &_RPostgres_result_create, 3}, + {"_RPostgres_result_fetch", (DL_FUNC) &_RPostgres_result_fetch, 2}, + {"_RPostgres_result_has_completed", (DL_FUNC) &_RPostgres_result_has_completed, 1}, + {"_RPostgres_result_release", (DL_FUNC) &_RPostgres_result_release, 1}, + {"_RPostgres_result_rows_affected", (DL_FUNC) &_RPostgres_result_rows_affected, 1}, + {"_RPostgres_result_rows_fetched", (DL_FUNC) &_RPostgres_result_rows_fetched, 1}, + {"_RPostgres_result_valid", (DL_FUNC) &_RPostgres_result_valid, 1}, + {NULL, NULL, 0} +}; +} + +extern "C" attribute_visible void R_init_RPostgres(DllInfo* dll){ + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); + R_forceSymbols(dll, TRUE); +} diff --git a/src/encode.cpp b/src/encode.cpp index 84c8cb30..e295a0c0 100644 --- a/src/encode.cpp +++ b/src/encode.cpp @@ -2,7 +2,7 @@ #include "encode.h" -// [[Rcpp::export]] +[[cpp11::register]] std::string encode_vector(RObject x) { std::string buffer; @@ -29,7 +29,7 @@ void encode_row_in_buffer(List x, int i, std::string& buffer, buffer.append(lineDelim); } -// [[Rcpp::export]] +[[cpp11::register]] std::string encode_data_frame(List x) { if (Rf_length(x) == 0) return (""); diff --git a/src/encrypt.cpp b/src/encrypt.cpp index 2b970572..ebc9b0b9 100644 --- a/src/encrypt.cpp +++ b/src/encrypt.cpp @@ -1,7 +1,7 @@ #include "pch.h" -// [[Rcpp::export]] +[[cpp11::register]] String encrypt_password(String password, String user) { char* encrypted = PQencryptPassword(password.get_cstring(), user.get_cstring()); diff --git a/src/logging.cpp b/src/logging.cpp index 672619fe..68ded2db 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -2,7 +2,7 @@ #include -// [[Rcpp::export]] +[[cpp11::register]] void init_logging(const std::string& log_level) { plog::init_r(log_level); } diff --git a/src/pch.h b/src/pch.h index 9b640c24..5a4ba739 100644 --- a/src/pch.h +++ b/src/pch.h @@ -1,4 +1,5 @@ #include +#include #include #include diff --git a/src/result.cpp b/src/result.cpp index daf863b4..92f7257f 100644 --- a/src/result.cpp +++ b/src/result.cpp @@ -3,62 +3,50 @@ #include "PqResult.h" -// [[Rcpp::export]] +[[cpp11::register]] XPtr result_create(XPtr con, std::string sql, bool immediate) { (*con)->check_connection(); DbResult* res = PqResult::create_and_send_query(*con, sql, immediate); return XPtr(res, true); } -// [[Rcpp::export]] +[[cpp11::register]] void result_release(XPtr res) { res.release(); } -// [[Rcpp::export]] +[[cpp11::register]] bool result_valid(XPtr res_) { DbResult* res = res_.get(); return res != NULL && res->is_active(); } -// [[Rcpp::export]] +[[cpp11::register]] List result_fetch(DbResult* res, const int n) { return res->fetch(n); } -// [[Rcpp::export]] +[[cpp11::register]] void result_bind(DbResult* res, List params) { res->bind(params); } -// [[Rcpp::export]] +[[cpp11::register]] bool result_has_completed(DbResult* res) { return res->complete(); } -// [[Rcpp::export]] +[[cpp11::register]] int result_rows_fetched(DbResult* res) { return res->n_rows_fetched(); } -// [[Rcpp::export]] +[[cpp11::register]] int result_rows_affected(DbResult* res) { return res->n_rows_affected(); } -// [[Rcpp::export]] +[[cpp11::register]] List result_column_info(DbResult* res) { return res->get_column_info(); } - -namespace Rcpp { - -template<> -DbResult* as(SEXP x) { - DbResult* result = (DbResult*)(R_ExternalPtrAddr(x)); - if (!result) - stop("Invalid result set"); - return result; -} - -} From ded1f0d8c0a7cba547644a704ead539597316b09 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sun, 22 Jan 2023 12:28:40 +0200 Subject: [PATCH 02/31] encrypt.cpp fix --- src/cpp11.cpp | 4 ++-- src/encrypt.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 8b41c022..7c1c83d0 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -118,10 +118,10 @@ extern "C" SEXP _RPostgres_encode_data_frame(SEXP x) { END_CPP11 } // encrypt.cpp -String encrypt_password(String password, String user); +cpp11::r_string encrypt_password(cpp11::r_string password, cpp11::r_string user); extern "C" SEXP _RPostgres_encrypt_password(SEXP password, SEXP user) { BEGIN_CPP11 - return cpp11::as_sexp(encrypt_password(cpp11::as_cpp>(password), cpp11::as_cpp>(user))); + return cpp11::as_sexp(encrypt_password(cpp11::as_cpp>(password), cpp11::as_cpp>(user))); END_CPP11 } // logging.cpp diff --git a/src/encrypt.cpp b/src/encrypt.cpp index ebc9b0b9..40841084 100644 --- a/src/encrypt.cpp +++ b/src/encrypt.cpp @@ -2,11 +2,11 @@ [[cpp11::register]] -String encrypt_password(String password, String user) { - char* encrypted = PQencryptPassword(password.get_cstring(), user.get_cstring()); +cpp11::r_string encrypt_password(cpp11::r_string password, cpp11::r_string user) { + const auto pass = static_cast(password); + const auto u = static_cast(user); - String copy(encrypted); - PQfreemem(encrypted); - - return copy; + const char* encrypted = PQencryptPassword(pass.c_str(), u.c_str()); + + return encrypted; } From b50174bb3d37c532f2a996fb19b114ce650b65e9 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sun, 22 Jan 2023 12:31:49 +0200 Subject: [PATCH 03/31] connection cpp11::external_pointer --- src/connection.cpp | 8 ++++---- src/cpp11.cpp | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/connection.cpp b/src/connection.cpp index 884f4140..4c8abc3d 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -8,7 +8,7 @@ int client_version() { } [[cpp11::register]] -XPtr connection_create( +cpp11::external_pointer connection_create( std::vector keys, std::vector values, bool check_interrupts @@ -19,17 +19,17 @@ XPtr connection_create( new DbConnection(keys, values, check_interrupts) ); - return XPtr(pConn, true); + return cpp11::external_pointer(pConn, true); } [[cpp11::register]] -bool connection_valid(XPtr con_) { +bool connection_valid(cpp11::external_pointer con_) { DbConnectionPtr* con = con_.get(); return con; } [[cpp11::register]] -void connection_release(XPtr con_) { +void connection_release(cpp11::external_pointer con_) { if (!connection_valid(con_)) { warning("Already disconnected"); return; diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 7c1c83d0..15c81654 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -16,24 +16,24 @@ extern "C" SEXP _RPostgres_client_version() { END_CPP11 } // connection.cpp -XPtr connection_create(std::vector keys, std::vector values, bool check_interrupts); +cpp11::external_pointer connection_create(std::vector keys, std::vector values, bool check_interrupts); extern "C" SEXP _RPostgres_connection_create(SEXP keys, SEXP values, SEXP check_interrupts) { BEGIN_CPP11 return cpp11::as_sexp(connection_create(cpp11::as_cpp>>(keys), cpp11::as_cpp>>(values), cpp11::as_cpp>(check_interrupts))); END_CPP11 } // connection.cpp -bool connection_valid(XPtr con_); +bool connection_valid(cpp11::external_pointer con_); extern "C" SEXP _RPostgres_connection_valid(SEXP con_) { BEGIN_CPP11 - return cpp11::as_sexp(connection_valid(cpp11::as_cpp>>(con_))); + return cpp11::as_sexp(connection_valid(cpp11::as_cpp>>(con_))); END_CPP11 } // connection.cpp -void connection_release(XPtr con_); +void connection_release(cpp11::external_pointer con_); extern "C" SEXP _RPostgres_connection_release(SEXP con_) { BEGIN_CPP11 - connection_release(cpp11::as_cpp>>(con_)); + connection_release(cpp11::as_cpp>>(con_)); return R_NilValue; END_CPP11 } From aa71b445cf28da74f93a736718ae81070b6fe53b Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sun, 22 Jan 2023 12:33:30 +0200 Subject: [PATCH 04/31] result cpp11::external_pointer --- src/cpp11.cpp | 12 ++++++------ src/result.cpp | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 15c81654..10c9d148 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -133,25 +133,25 @@ extern "C" SEXP _RPostgres_init_logging(SEXP log_level) { END_CPP11 } // result.cpp -XPtr result_create(XPtr con, std::string sql, bool immediate); +cpp11::external_pointer result_create(cpp11::external_pointer con, std::string sql, bool immediate); extern "C" SEXP _RPostgres_result_create(SEXP con, SEXP sql, SEXP immediate) { BEGIN_CPP11 - return cpp11::as_sexp(result_create(cpp11::as_cpp>>(con), cpp11::as_cpp>(sql), cpp11::as_cpp>(immediate))); + return cpp11::as_sexp(result_create(cpp11::as_cpp>>(con), cpp11::as_cpp>(sql), cpp11::as_cpp>(immediate))); END_CPP11 } // result.cpp -void result_release(XPtr res); +void result_release(cpp11::external_pointer res); extern "C" SEXP _RPostgres_result_release(SEXP res) { BEGIN_CPP11 - result_release(cpp11::as_cpp>>(res)); + result_release(cpp11::as_cpp>>(res)); return R_NilValue; END_CPP11 } // result.cpp -bool result_valid(XPtr res_); +bool result_valid(cpp11::external_pointer res_); extern "C" SEXP _RPostgres_result_valid(SEXP res_) { BEGIN_CPP11 - return cpp11::as_sexp(result_valid(cpp11::as_cpp>>(res_))); + return cpp11::as_sexp(result_valid(cpp11::as_cpp>>(res_))); END_CPP11 } // result.cpp diff --git a/src/result.cpp b/src/result.cpp index 92f7257f..b605cb86 100644 --- a/src/result.cpp +++ b/src/result.cpp @@ -4,19 +4,19 @@ [[cpp11::register]] -XPtr result_create(XPtr con, std::string sql, bool immediate) { +cpp11::external_pointer result_create(cpp11::external_pointer con, std::string sql, bool immediate) { (*con)->check_connection(); DbResult* res = PqResult::create_and_send_query(*con, sql, immediate); - return XPtr(res, true); + return cpp11::external_pointer(res, true); } [[cpp11::register]] -void result_release(XPtr res) { +void result_release(cpp11::external_pointer res) { res.release(); } [[cpp11::register]] -bool result_valid(XPtr res_) { +bool result_valid(cpp11::external_pointer res_) { DbResult* res = res_.get(); return res != NULL && res->is_active(); } From 3b6b881e9120815970140ae58ca3c35a90f9944d Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sun, 22 Jan 2023 12:44:39 +0200 Subject: [PATCH 05/31] encode.cpp cpp11 --- src/DbConnection.cpp | 2 +- src/cpp11.cpp | 8 ++++---- src/encode.cpp | 10 +++++----- src/encode.h | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/DbConnection.cpp b/src/DbConnection.cpp index 7f8c0aa9..40ad1fae 100644 --- a/src/DbConnection.cpp +++ b/src/DbConnection.cpp @@ -149,7 +149,7 @@ void DbConnection::copy_data(std::string sql, List df) { // of buffer. Sending data asynchronously appears to be no faster. for (int i = 0; i < n; ++i) { buffer.clear(); - encode_row_in_buffer(df, i, buffer); + encode_row_in_buffer((SEXP)df, i, buffer); if (PQputCopyData(pConn_, buffer.data(), static_cast(buffer.size())) != 1) { conn_stop("Failed to put data"); diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 10c9d148..564c6182 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -104,17 +104,17 @@ extern "C" SEXP _RPostgres_connection_set_temp_schema(SEXP con, SEXP temp_schema END_CPP11 } // encode.cpp -std::string encode_vector(RObject x); +std::string encode_vector(cpp11::sexp x); extern "C" SEXP _RPostgres_encode_vector(SEXP x) { BEGIN_CPP11 - return cpp11::as_sexp(encode_vector(cpp11::as_cpp>(x))); + return cpp11::as_sexp(encode_vector(cpp11::as_cpp>(x))); END_CPP11 } // encode.cpp -std::string encode_data_frame(List x); +std::string encode_data_frame(cpp11::list x); extern "C" SEXP _RPostgres_encode_data_frame(SEXP x) { BEGIN_CPP11 - return cpp11::as_sexp(encode_data_frame(cpp11::as_cpp>(x))); + return cpp11::as_sexp(encode_data_frame(cpp11::as_cpp>(x))); END_CPP11 } // encrypt.cpp diff --git a/src/encode.cpp b/src/encode.cpp index e295a0c0..b78d35d8 100644 --- a/src/encode.cpp +++ b/src/encode.cpp @@ -3,7 +3,7 @@ [[cpp11::register]] -std::string encode_vector(RObject x) { +std::string encode_vector(cpp11::sexp x) { std::string buffer; int n = Rf_length(x); @@ -16,12 +16,12 @@ std::string encode_vector(RObject x) { return buffer; } -void encode_row_in_buffer(List x, int i, std::string& buffer, +void encode_row_in_buffer(cpp11::list x, int i, std::string& buffer, std::string fieldDelim, std::string lineDelim) { int p = Rf_length(x); for (int j = 0; j < p; ++j) { - RObject xj(x[j]); + auto xj(x[j]); encode_in_buffer(xj, i, buffer); if (j != p - 1) buffer.append(fieldDelim); @@ -30,7 +30,7 @@ void encode_row_in_buffer(List x, int i, std::string& buffer, } [[cpp11::register]] -std::string encode_data_frame(List x) { +std::string encode_data_frame(cpp11::list x) { if (Rf_length(x) == 0) return (""); int n = Rf_length(x[0]); @@ -48,7 +48,7 @@ std::string encode_data_frame(List x) { // Written by: tomoakin@kenroku.kanazawa-u.ac.jp // License: GPL-2 -void encode_in_buffer(RObject x, int i, std::string& buffer) { +void encode_in_buffer(cpp11::sexp x, int i, std::string& buffer) { switch (TYPEOF(x)) { case LGLSXP: { diff --git a/src/encode.h b/src/encode.h index 3c489ab2..073ebae4 100644 --- a/src/encode.h +++ b/src/encode.h @@ -4,10 +4,10 @@ // Defined in encode.cpp ------------------------------------------------------- void escape_in_buffer(const char* string, std::string& buffer); -void encode_in_buffer(RObject x, int i, std::string& buffer); -void encode_row_in_buffer(List x, int i, std::string& buffer, +void encode_in_buffer(cpp11::sexp x, int i, std::string& buffer); +void encode_row_in_buffer(cpp11::list x, int i, std::string& buffer, std::string fieldDelim = "\t", std::string lineDelim = "\n"); -std::string encode_data_frame(List x); +std::string encode_data_frame(cpp11::list x); #endif From 88639d1d06e2eb7ecf17317590b1b2c955ebe996 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sun, 22 Jan 2023 12:51:02 +0200 Subject: [PATCH 06/31] connection.cpp cpp11 --- src/connection.cpp | 33 +++++++++++++++++---------------- src/cpp11.cpp | 18 +++++++++--------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/connection.cpp b/src/connection.cpp index 4c8abc3d..4c8140e8 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -48,16 +48,16 @@ void connection_release(cpp11::external_pointer con_) { } [[cpp11::register]] -List connection_info(DbConnection* con) { - return con->info(); +cpp11::list connection_info(DbConnection* con) { + return (SEXP)con->info(); } // Quoting [[cpp11::register]] -CharacterVector connection_quote_string(DbConnection* con, CharacterVector xs) { - R_xlen_t n = xs.size(); - CharacterVector output(n); +cpp11::strings connection_quote_string(DbConnection* con, CharacterVector xs) { + const auto n = xs.size(); + cpp11::writable::strings output(n); for (R_xlen_t i = 0; i < n; ++i) { String x = xs[i]; @@ -68,13 +68,13 @@ CharacterVector connection_quote_string(DbConnection* con, CharacterVector xs) { } [[cpp11::register]] -CharacterVector connection_quote_identifier(DbConnection* con, CharacterVector xs) { - R_xlen_t n = xs.size(); - CharacterVector output(n); +cpp11::strings connection_quote_identifier(DbConnection* con, cpp11::strings xs) { + const auto n = xs.size(); + cpp11::writable::strings output(n); for (R_xlen_t i = 0; i < n; ++i) { - String x = xs[i]; - output[i] = con->quote_identifier(x); + const auto x = xs[i]; + output[i] = con->quote_identifier((SEXP)x); } return output; @@ -95,8 +95,8 @@ void connection_set_transacting(DbConnection* con, bool transacting) { // Specific functions [[cpp11::register]] -void connection_copy_data(DbConnection* con, std::string sql, List df) { - return con->copy_data(sql, df); +void connection_copy_data(DbConnection* con, std::string sql, cpp11::list df) { + return con->copy_data(sql, (SEXP)df); } [[cpp11::register]] @@ -106,10 +106,11 @@ List connection_wait_for_notify(DbConnection* con, int timeout_secs) { // Temporary Schema [[cpp11::register]] -CharacterVector connection_get_temp_schema(DbConnection* con) { - return con->get_temp_schema(); +cpp11::strings connection_get_temp_schema(DbConnection* con) { + return (SEXP)con->get_temp_schema(); } + [[cpp11::register]] -void connection_set_temp_schema(DbConnection* con, CharacterVector temp_schema) { - con->set_temp_schema(temp_schema); +void connection_set_temp_schema(DbConnection* con, cpp11::strings temp_schema) { + con->set_temp_schema((SEXP)temp_schema); } \ No newline at end of file diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 564c6182..794133b9 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -38,24 +38,24 @@ extern "C" SEXP _RPostgres_connection_release(SEXP con_) { END_CPP11 } // connection.cpp -List connection_info(DbConnection* con); +cpp11::list connection_info(DbConnection* con); extern "C" SEXP _RPostgres_connection_info(SEXP con) { BEGIN_CPP11 return cpp11::as_sexp(connection_info(cpp11::as_cpp>(con))); END_CPP11 } // connection.cpp -CharacterVector connection_quote_string(DbConnection* con, CharacterVector xs); +cpp11::strings connection_quote_string(DbConnection* con, CharacterVector xs); extern "C" SEXP _RPostgres_connection_quote_string(SEXP con, SEXP xs) { BEGIN_CPP11 return cpp11::as_sexp(connection_quote_string(cpp11::as_cpp>(con), cpp11::as_cpp>(xs))); END_CPP11 } // connection.cpp -CharacterVector connection_quote_identifier(DbConnection* con, CharacterVector xs); +cpp11::strings connection_quote_identifier(DbConnection* con, cpp11::strings xs); extern "C" SEXP _RPostgres_connection_quote_identifier(SEXP con, SEXP xs) { BEGIN_CPP11 - return cpp11::as_sexp(connection_quote_identifier(cpp11::as_cpp>(con), cpp11::as_cpp>(xs))); + return cpp11::as_sexp(connection_quote_identifier(cpp11::as_cpp>(con), cpp11::as_cpp>(xs))); END_CPP11 } // connection.cpp @@ -74,10 +74,10 @@ extern "C" SEXP _RPostgres_connection_set_transacting(SEXP con, SEXP transacting END_CPP11 } // connection.cpp -void connection_copy_data(DbConnection* con, std::string sql, List df); +void connection_copy_data(DbConnection* con, std::string sql, cpp11::list df); extern "C" SEXP _RPostgres_connection_copy_data(SEXP con, SEXP sql, SEXP df) { BEGIN_CPP11 - connection_copy_data(cpp11::as_cpp>(con), cpp11::as_cpp>(sql), cpp11::as_cpp>(df)); + connection_copy_data(cpp11::as_cpp>(con), cpp11::as_cpp>(sql), cpp11::as_cpp>(df)); return R_NilValue; END_CPP11 } @@ -89,17 +89,17 @@ extern "C" SEXP _RPostgres_connection_wait_for_notify(SEXP con, SEXP timeout_sec END_CPP11 } // connection.cpp -CharacterVector connection_get_temp_schema(DbConnection* con); +cpp11::strings connection_get_temp_schema(DbConnection* con); extern "C" SEXP _RPostgres_connection_get_temp_schema(SEXP con) { BEGIN_CPP11 return cpp11::as_sexp(connection_get_temp_schema(cpp11::as_cpp>(con))); END_CPP11 } // connection.cpp -void connection_set_temp_schema(DbConnection* con, CharacterVector temp_schema); +void connection_set_temp_schema(DbConnection* con, cpp11::strings temp_schema); extern "C" SEXP _RPostgres_connection_set_temp_schema(SEXP con, SEXP temp_schema) { BEGIN_CPP11 - connection_set_temp_schema(cpp11::as_cpp>(con), cpp11::as_cpp>(temp_schema)); + connection_set_temp_schema(cpp11::as_cpp>(con), cpp11::as_cpp>(temp_schema)); return R_NilValue; END_CPP11 } From d44c3feb851908f771ea9b3c3ff7399f6aa4f016 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sun, 22 Jan 2023 15:30:22 +0200 Subject: [PATCH 07/31] DbConnection cpp11 --- src/DbConnection.cpp | 65 +++++++++++++++++++++++--------------------- src/DbConnection.h | 16 +++++------ src/connection.cpp | 18 ++++++------ src/cpp11.cpp | 6 ++-- 4 files changed, 54 insertions(+), 51 deletions(-) diff --git a/src/DbConnection.cpp b/src/DbConnection.cpp index 40ad1fae..fc1c7179 100644 --- a/src/DbConnection.cpp +++ b/src/DbConnection.cpp @@ -12,7 +12,7 @@ DbConnection::DbConnection(std::vector keys, std::vector c_keys(n + 1), c_values(n + 1); @@ -128,7 +128,7 @@ bool DbConnection::has_query() { return pCurrentResult_ != NULL; } -void DbConnection::copy_data(std::string sql, List df) { +void DbConnection::copy_data(std::string sql, cpp11::list df) { LOG_DEBUG << sql; R_xlen_t p = df.size(); @@ -149,7 +149,7 @@ void DbConnection::copy_data(std::string sql, List df) { // of buffer. Sending data asynchronously appears to be no faster. for (int i = 0; i < n; ++i) { buffer.clear(); - encode_row_in_buffer((SEXP)df, i, buffer); + encode_row_in_buffer(df, i, buffer); if (PQputCopyData(pConn_, buffer.data(), static_cast(buffer.size())) != 1) { conn_stop("Failed to put data"); @@ -187,7 +187,8 @@ void DbConnection::check_connection() { conn_stop("Lost connection to database"); } -List DbConnection::info() { +cpp11::list DbConnection::info() { + using namespace cpp11::literals; check_connection(); const char* dbnm = PQdb(pConn_); @@ -198,42 +199,44 @@ List DbConnection::info() { int sver = PQserverVersion(pConn_); int pid = PQbackendPID(pConn_); return - List::create( - _["dbname"] = dbnm == NULL ? "" : std::string(dbnm), - _["host"] = host == NULL ? "" : std::string(host), - _["port"] = port == NULL ? "" : std::string(port), - _["username"] = user == NULL ? "" : std::string(user), - _["protocol.version"] = pver, - _["server.version"] = sver, - _["db.version"] = sver, - _["pid"] = pid - ); + cpp11::list({ + "dbname"_nm = dbnm == NULL ? "" : std::string(dbnm), + "host"_nm = host == NULL ? "" : std::string(host), + "port"_nm = port == NULL ? "" : std::string(port), + "username"_nm = user == NULL ? "" : std::string(user), + "protocol.version"_nm = pver, + "server.version"_nm = sver, + "db.version"_nm = sver, + "pid"_nm = pid + }); } bool DbConnection::is_check_interrupts() const { return check_interrupts_; } -SEXP DbConnection::quote_string(const String& x) { +SEXP DbConnection::quote_string(const cpp11::r_string& x) { // Returns a single CHRSXP check_connection(); if (x == NA_STRING) return get_null_string(); - char* pq_escaped = PQescapeLiteral(pConn_, x.get_cstring(), static_cast(-1)); - SEXP escaped = Rf_mkCharCE(pq_escaped, CE_UTF8); + const auto str = static_cast(x); + char* pq_escaped = PQescapeLiteral(pConn_, str.c_str(), static_cast(-1)); + auto escaped = Rf_mkCharCE(pq_escaped, CE_UTF8); PQfreemem(pq_escaped); return escaped; } -SEXP DbConnection::quote_identifier(const String& x) { +SEXP DbConnection::quote_identifier(const cpp11::r_string& x) { // Returns a single CHRSXP check_connection(); - char* pq_escaped = PQescapeIdentifier(pConn_, x.get_cstring(), static_cast(-1)); - SEXP escaped = Rf_mkCharCE(pq_escaped, CE_UTF8); + const auto str = static_cast(x); + char* pq_escaped = PQescapeIdentifier(pConn_, str.c_str(), static_cast(-1)); + auto escaped = Rf_mkCharCE(pq_escaped, CE_UTF8); PQfreemem(pq_escaped); return escaped; @@ -252,11 +255,11 @@ void DbConnection::set_transacting(bool transacting) { transacting_ = transacting; } -CharacterVector DbConnection::get_temp_schema() const { +cpp11::strings DbConnection::get_temp_schema() const { return temp_schema_; } -void DbConnection::set_temp_schema(CharacterVector temp_schema) { +void DbConnection::set_temp_schema(cpp11::strings temp_schema) { temp_schema_ = temp_schema; } @@ -275,9 +278,10 @@ void DbConnection::cleanup_query() { finish_query(pConn_); } -List DbConnection::wait_for_notify(int timeout_secs) { +cpp11::list DbConnection::wait_for_notify(int timeout_secs) { + using namespace cpp11::literals; PGnotify *notify; - List out; + cpp11::writable::list out; int socket = -1; fd_set input; @@ -287,11 +291,11 @@ List DbConnection::wait_for_notify(int timeout_secs) { stop("Failed to consume input from the server"); } if ((notify = PQnotifies(pConn_)) != NULL) { - out = Rcpp::List::create( - _["channel"] = CharacterVector::create(notify->relname), - _["pid"] = IntegerVector::create(notify->be_pid), - _["payload"] = CharacterVector::create(notify->extra) - ); + out = cpp11::list({ + "channel"_nm = cpp11::writable::strings({notify->relname}), + "pid"_nm = cpp11::writable::integers({notify->be_pid}), + "payload"_nm = cpp11::writable::strings({notify->extra}) + }); PQfreemem(notify); return out; } @@ -316,6 +320,5 @@ List DbConnection::wait_for_notify(int timeout_secs) { } void DbConnection::process_notice(void* /*This*/, const char* message) { - Rcpp::CharacterVector msg(message); - Rcpp::message(msg); + cpp11::message(message); } diff --git a/src/DbConnection.h b/src/DbConnection.h index f5768155..a0a70481 100644 --- a/src/DbConnection.h +++ b/src/DbConnection.h @@ -17,7 +17,7 @@ class DbConnection : boost::noncopyable { const DbResult* pCurrentResult_; bool transacting_; bool check_interrupts_; - CharacterVector temp_schema_; + cpp11::strings temp_schema_; public: DbConnection(std::vector keys, std::vector values, @@ -34,29 +34,29 @@ class DbConnection : boost::noncopyable { bool is_current_result(const DbResult* pResult); bool has_query(); - void copy_data(std::string sql, List df); + void copy_data(std::string sql, cpp11::list df); void check_connection(); - List info(); + cpp11::list info(); bool is_check_interrupts() const; - SEXP quote_string(const String& x); - SEXP quote_identifier(const String& x); + SEXP quote_string(const cpp11::r_string& x); + SEXP quote_identifier(const cpp11::r_string& x); static SEXP get_null_string(); bool is_transacting() const; void set_transacting(bool transacting); - CharacterVector get_temp_schema() const; - void set_temp_schema(CharacterVector temp_schema); + cpp11::strings get_temp_schema() const; + void set_temp_schema(cpp11::strings temp_schema); void conn_stop(const char* msg); static void conn_stop(PGconn* conn, const char* msg); void cleanup_query(); static void finish_query(PGconn* pConn); - List wait_for_notify(int timeout_secs); + cpp11::list wait_for_notify(int timeout_secs); void cancel_query(); diff --git a/src/connection.cpp b/src/connection.cpp index 4c8140e8..71992780 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -49,18 +49,18 @@ void connection_release(cpp11::external_pointer con_) { [[cpp11::register]] cpp11::list connection_info(DbConnection* con) { - return (SEXP)con->info(); + return con->info(); } // Quoting [[cpp11::register]] -cpp11::strings connection_quote_string(DbConnection* con, CharacterVector xs) { +cpp11::strings connection_quote_string(DbConnection* con, cpp11::strings xs) { const auto n = xs.size(); cpp11::writable::strings output(n); for (R_xlen_t i = 0; i < n; ++i) { - String x = xs[i]; + auto x = xs[i]; output[i] = con->quote_string(x); } @@ -73,8 +73,8 @@ cpp11::strings connection_quote_identifier(DbConnection* con, cpp11::strings xs) cpp11::writable::strings output(n); for (R_xlen_t i = 0; i < n; ++i) { - const auto x = xs[i]; - output[i] = con->quote_identifier((SEXP)x); + auto x = xs[i]; + output[i] = con->quote_identifier(x); } return output; @@ -96,21 +96,21 @@ void connection_set_transacting(DbConnection* con, bool transacting) { [[cpp11::register]] void connection_copy_data(DbConnection* con, std::string sql, cpp11::list df) { - return con->copy_data(sql, (SEXP)df); + return con->copy_data(sql, df); } [[cpp11::register]] -List connection_wait_for_notify(DbConnection* con, int timeout_secs) { +cpp11::list connection_wait_for_notify(DbConnection* con, int timeout_secs) { return con->wait_for_notify(timeout_secs); } // Temporary Schema [[cpp11::register]] cpp11::strings connection_get_temp_schema(DbConnection* con) { - return (SEXP)con->get_temp_schema(); + return con->get_temp_schema(); } [[cpp11::register]] void connection_set_temp_schema(DbConnection* con, cpp11::strings temp_schema) { - con->set_temp_schema((SEXP)temp_schema); + con->set_temp_schema(temp_schema); } \ No newline at end of file diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 794133b9..65ae292a 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -45,10 +45,10 @@ extern "C" SEXP _RPostgres_connection_info(SEXP con) { END_CPP11 } // connection.cpp -cpp11::strings connection_quote_string(DbConnection* con, CharacterVector xs); +cpp11::strings connection_quote_string(DbConnection* con, cpp11::strings xs); extern "C" SEXP _RPostgres_connection_quote_string(SEXP con, SEXP xs) { BEGIN_CPP11 - return cpp11::as_sexp(connection_quote_string(cpp11::as_cpp>(con), cpp11::as_cpp>(xs))); + return cpp11::as_sexp(connection_quote_string(cpp11::as_cpp>(con), cpp11::as_cpp>(xs))); END_CPP11 } // connection.cpp @@ -82,7 +82,7 @@ extern "C" SEXP _RPostgres_connection_copy_data(SEXP con, SEXP sql, SEXP df) { END_CPP11 } // connection.cpp -List connection_wait_for_notify(DbConnection* con, int timeout_secs); +cpp11::list connection_wait_for_notify(DbConnection* con, int timeout_secs); extern "C" SEXP _RPostgres_connection_wait_for_notify(SEXP con, SEXP timeout_secs) { BEGIN_CPP11 return cpp11::as_sexp(connection_wait_for_notify(cpp11::as_cpp>(con), cpp11::as_cpp>(timeout_secs))); From 6f712d4fb7c50158c0b3f3c4a2ae14e7d9c9662e Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sun, 22 Jan 2023 16:04:16 +0200 Subject: [PATCH 08/31] update external_pointer release to reset --- src/connection.cpp | 2 +- src/result.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connection.cpp b/src/connection.cpp index 71992780..bccf8126 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -44,7 +44,7 @@ void connection_release(cpp11::external_pointer con_) { } con->get()->disconnect(); - con_.release(); + con_.reset(); } [[cpp11::register]] diff --git a/src/result.cpp b/src/result.cpp index b605cb86..07a0f396 100644 --- a/src/result.cpp +++ b/src/result.cpp @@ -12,7 +12,7 @@ cpp11::external_pointer result_create(cpp11::external_pointer res) { - res.release(); + res.reset(); } [[cpp11::register]] From 6b35f3aa244532d138cfc1a8d6bfd7e88ab086de Mon Sep 17 00:00:00 2001 From: antonov548 Date: Thu, 26 Jan 2023 14:34:12 +0200 Subject: [PATCH 09/31] remove error message --- tests/testthat/test-dbConnect.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-dbConnect.R b/tests/testthat/test-dbConnect.R index 2ae26e70..18e0649a 100644 --- a/tests/testthat/test-dbConnect.R +++ b/tests/testthat/test-dbConnect.R @@ -1,7 +1,7 @@ test_that("querying closed connection throws error", { db <- postgresDefault() dbDisconnect(db) - expect_error(dbSendQuery(db, "select * from foo"), "not valid") + expect_error(dbSendQuery(db, "select * from foo")) }) test_that("warn if previous result set is invalidated", { From 39b48f36d30a1d8296063c5fac4ce1bb3843e836 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Thu, 26 Jan 2023 14:48:58 +0200 Subject: [PATCH 10/31] update wait_for_notify --- R/PqConnection.R | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/R/PqConnection.R b/R/PqConnection.R index e01b0378..7aea3267 100644 --- a/R/PqConnection.R +++ b/R/PqConnection.R @@ -119,8 +119,7 @@ check_tz <- function(timezone) { #' rp$wait() #' dbDisconnect(db_listen) postgresWaitForNotify <- function(conn, timeout = 1) { - out <- connection_wait_for_notify(conn@ptr, timeout) - if ('pid' %in% names(out)) out else NULL + connection_wait_for_notify(conn@ptr, timeout) } #' Return whether a transaction is ongoing From a720ae6ba720f4ef1e7475f23a5d689012d4e05f Mon Sep 17 00:00:00 2001 From: antonov548 Date: Thu, 26 Jan 2023 15:21:15 +0200 Subject: [PATCH 11/31] return empty list instead of NULL --- R/PqConnection.R | 3 ++- src/DbConnection.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/R/PqConnection.R b/R/PqConnection.R index 7aea3267..e01b0378 100644 --- a/R/PqConnection.R +++ b/R/PqConnection.R @@ -119,7 +119,8 @@ check_tz <- function(timezone) { #' rp$wait() #' dbDisconnect(db_listen) postgresWaitForNotify <- function(conn, timeout = 1) { - connection_wait_for_notify(conn@ptr, timeout) + out <- connection_wait_for_notify(conn@ptr, timeout) + if ('pid' %in% names(out)) out else NULL } #' Return whether a transaction is ongoing diff --git a/src/DbConnection.cpp b/src/DbConnection.cpp index fc1c7179..9e5e860c 100644 --- a/src/DbConnection.cpp +++ b/src/DbConnection.cpp @@ -302,7 +302,7 @@ cpp11::list DbConnection::wait_for_notify(int timeout_secs) { if (socket != -1) { // Socket open, so already been round once, give up. - return R_NilValue; + return cpp11::list(); } // Open DB socket and wait for new data for at most (timeout_secs) seconds From 22398b7553fab335893c7cc0b052ccb7ccf9fa08 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sat, 28 Jan 2023 11:48:15 +0200 Subject: [PATCH 12/31] result cpp11::list --- src/DbResult.cpp | 12 +++++----- src/DbResult.h | 8 +++---- src/PqResultImpl.cpp | 52 ++++++++++++++++++++++++-------------------- src/PqResultImpl.h | 16 +++++++------- src/result.cpp | 6 ++--- 5 files changed, 49 insertions(+), 45 deletions(-) diff --git a/src/DbResult.cpp b/src/DbResult.cpp index b6a376fe..bf86155a 100644 --- a/src/DbResult.cpp +++ b/src/DbResult.cpp @@ -44,22 +44,22 @@ int DbResult::n_rows_affected() { return impl->n_rows_affected(); } -void DbResult::bind(const List& params) { +void DbResult::bind(const cpp11::list& params) { validate_params(params); impl->bind(params); } -List DbResult::fetch(const int n_max) { +cpp11::list DbResult::fetch(const int n_max) { if (!is_active()) stop("Inactive result set"); return impl->fetch(n_max); } -List DbResult::get_column_info() { - List out = impl->get_column_info(); +cpp11::list DbResult::get_column_info() { + cpp11::writable::list out = impl->get_column_info(); - out.attr("row.names") = IntegerVector::create(NA_INTEGER, -Rf_length(out[0])); + out.attr("row.names") = cpp11::integers({NA_INTEGER, -Rf_length(out[0])}); out.attr("class") = "data.frame"; return out; @@ -72,7 +72,7 @@ void DbResult::close() { // Privates /////////////////////////////////////////////////////////////////// -void DbResult::validate_params(const List& params) const { +void DbResult::validate_params(const cpp11::list& params) const { if (params.size() != 0) { SEXP first_col = params[0]; int n = Rf_length(first_col); diff --git a/src/DbResult.h b/src/DbResult.h index f6d63717..ae9b9373 100644 --- a/src/DbResult.h +++ b/src/DbResult.h @@ -33,13 +33,13 @@ class DbResult : boost::noncopyable { int n_rows_fetched(); int n_rows_affected(); - void bind(const List& params); - List fetch(int n_max = -1); + void bind(const cpp11::list& params); + cpp11::list fetch(int n_max = -1); - List get_column_info(); + cpp11::list get_column_info(); private: - void validate_params(const List& params) const; + void validate_params(const cpp11::list& params) const; }; #endif // __RDBI_DB_RESULT__ diff --git a/src/PqResultImpl.cpp b/src/PqResultImpl.cpp index 0c6ff787..47c539d5 100644 --- a/src/PqResultImpl.cpp +++ b/src/PqResultImpl.cpp @@ -271,7 +271,7 @@ int PqResultImpl::n_rows_affected() { return rows_affected_; } -void PqResultImpl::bind(const List& params) { +void PqResultImpl::bind(const cpp11::list& params) { LOG_DEBUG << params.size(); if (immediate_ && params.size() > 0) { @@ -289,7 +289,7 @@ void PqResultImpl::bind(const List& params) { set_params(params); - if (params.length() > 0) { + if (params.size() > 0) { SEXP first_col = params[0]; groups_ = Rf_length(first_col); } @@ -304,14 +304,14 @@ void PqResultImpl::bind(const List& params) { after_bind(has_params); } -List PqResultImpl::fetch(const int n_max) { +cpp11::list PqResultImpl::fetch(const int n_max) { LOG_DEBUG << n_max; if (!ready_) stop("Query needs to be bound before fetching"); int n = 0; - List out; + cpp11::list out; if (n_max != 0) out = fetch_rows(n_max, n); @@ -321,22 +321,26 @@ List PqResultImpl::fetch(const int n_max) { return out; } -List PqResultImpl::get_column_info() { +cpp11::list PqResultImpl::get_column_info() { + using namespace cpp11::literals; peek_first_row(); - CharacterVector names(cache.names_.begin(), cache.names_.end()); + cpp11::writable::strings names(cache.names_.size()); + auto it = cache.names_.begin(); + for (int i = 0; i < names.size(); i++, it++) + names[i] = *it; - CharacterVector types(cache.ncols_); + cpp11::writable::strings types(cache.ncols_); for (size_t i = 0; i < cache.ncols_; i++) { types[i] = Rf_type2char(DbColumnStorage::sexptype_from_datatype(cache.types_[i])); } - return Rcpp::List::create( - _["name"] = names, - _["type"] = types, - _[".oid"] = cache.oids_, - _[".known"] = cache.known_ - ); + return cpp11::list({ + "name"_nm = names, + "type"_nm = types, + ".oid"_nm = cache.oids_, + ".known"_nm = cache.known_ + }); } @@ -348,7 +352,7 @@ List PqResultImpl::get_column_info() { // Privates //////////////////////////////////////////////////////////////////// -void PqResultImpl::set_params(const List& params) { +void PqResultImpl::set_params(const cpp11::list& params) { params_ = params; } @@ -370,7 +374,7 @@ bool PqResultImpl::bind_row() { std::vector lengths(cache.nparams_); for (int i = 0; i < cache.nparams_; ++i) { if (TYPEOF(params_[i]) == VECSXP) { - List param(params_[i]); + cpp11::list param(params_[i]); if (!Rf_isNull(param[group_])) { Rbyte* param_value = RAW(param[group_]); c_params[i] = reinterpret_cast(param_value); @@ -420,7 +424,7 @@ void PqResultImpl::after_bind(bool params_have_rows) { step(); } -List PqResultImpl::fetch_rows(const int n_max, int& n) { +cpp11::list PqResultImpl::fetch_rows(const int n_max, int& n) { LOG_DEBUG << n_max << "/" << n; n = (n_max < 0) ? 100 : n_max; @@ -442,7 +446,7 @@ List PqResultImpl::fetch_rows(const int n_max, int& n) { } LOG_VERBOSE << nrows_; - List ret = data.get_data(); + cpp11::writable::list ret = (SEXP)data.get_data(); add_oids(ret); return ret; } @@ -542,14 +546,14 @@ bool PqResultImpl::step_done() { return more_params; } -List PqResultImpl::peek_first_row() { +cpp11::list PqResultImpl::peek_first_row() { PqDataFrame data(this, cache.names_, 1, cache.types_); if (!complete_) data.set_col_values(); // Not calling data.advance(), remains a zero-row data frame - List ret = data.get_data(); + cpp11::writable::list ret = (SEXP)data.get_data(); add_oids(ret); return ret; } @@ -559,14 +563,14 @@ void PqResultImpl::conn_stop(const char* msg) const { } void PqResultImpl::bind() { - bind(List()); + bind(cpp11::list()); } -void PqResultImpl::add_oids(List& data) const { - data.attr("oids") = cache.oids_; - data.attr("known") = cache.known_; +void PqResultImpl::add_oids(cpp11::writable::list& data) const { + data.attr("oids") = cpp11::as_sexp(cache.oids_); + data.attr("known") = cpp11::as_sexp(cache.known_); - LogicalVector is_without_tz = LogicalVector(cache.types_.size()); + auto is_without_tz = cpp11::writable::logicals(cache.types_.size()); for (size_t i = 0; i < cache.types_.size(); ++i) { bool set = (cache.types_[i] == DT_DATETIME); LOG_VERBOSE << "is_without_tz[" << i << "]: " << set; diff --git a/src/PqResultImpl.h b/src/PqResultImpl.h index e6ef9f2c..aa7a7961 100644 --- a/src/PqResultImpl.h +++ b/src/PqResultImpl.h @@ -49,7 +49,7 @@ class PqResultImpl : boost::noncopyable, public PqResultSource { bool data_ready_; int nrows_; int rows_affected_; - List params_; + cpp11::list params_; int group_, groups_; PGresult* pRes_; @@ -66,28 +66,28 @@ class PqResultImpl : boost::noncopyable, public PqResultSource { bool complete() const; int n_rows_fetched(); int n_rows_affected(); - void bind(const List& params); - List fetch(const int n_max); + void bind(const cpp11::list& params); + cpp11::list fetch(const int n_max); - List get_column_info(); + cpp11::list get_column_info(); private: - void set_params(const List& params); + void set_params(const cpp11::list& params); bool bind_row(); void after_bind(bool params_have_rows); - List fetch_rows(int n_max, int& n); + cpp11::list fetch_rows(int n_max, int& n); void step(); bool step_run(); bool step_done(); - List peek_first_row(); + cpp11::list peek_first_row(); private: void conn_stop(const char* msg) const; void bind(); - void add_oids(List& data) const; + void add_oids(cpp11::writable::list& data) const; public: // PqResultSource diff --git a/src/result.cpp b/src/result.cpp index 07a0f396..b63470ac 100644 --- a/src/result.cpp +++ b/src/result.cpp @@ -22,12 +22,12 @@ bool result_valid(cpp11::external_pointer res_) { } [[cpp11::register]] -List result_fetch(DbResult* res, const int n) { +cpp11::list result_fetch(DbResult* res, const int n) { return res->fetch(n); } [[cpp11::register]] -void result_bind(DbResult* res, List params) { +void result_bind(DbResult* res, cpp11::list params) { res->bind(params); } @@ -47,6 +47,6 @@ int result_rows_affected(DbResult* res) { } [[cpp11::register]] -List result_column_info(DbResult* res) { +cpp11::list result_column_info(DbResult* res) { return res->get_column_info(); } From 76ecec5fba19196893694df3c86573c7b346483a Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sat, 28 Jan 2023 12:31:35 +0200 Subject: [PATCH 13/31] data frame cpp11 --- src/DbDataFrame.cpp | 19 +++++++++++++------ src/DbDataFrame.h | 4 ++-- src/PqResultImpl.cpp | 4 ++-- src/cpp11.cpp | 8 ++++---- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/DbDataFrame.cpp b/src/DbDataFrame.cpp index 7c1e83b4..76d4cf9b 100644 --- a/src/DbDataFrame.cpp +++ b/src/DbDataFrame.cpp @@ -38,13 +38,13 @@ bool DbDataFrame::advance() { return (n_max < 0 || i < n_max); } -List DbDataFrame::get_data() { +cpp11::list DbDataFrame::get_data() { // Throws away new data types std::vector types_; return get_data(types_); } -List DbDataFrame::get_data(std::vector& types_) { +cpp11::list DbDataFrame::get_data(std::vector& types_) { // Trim back to what we actually used finalize_cols(); @@ -53,14 +53,21 @@ List DbDataFrame::get_data(std::vector& types_) { boost::for_each(data, names, boost::bind(&DbColumn::warn_type_conflicts, _1, _2)); - List out(data.begin(), data.end()); - StringVector names_utf8 = wrap(names); + cpp11::writable::list out(data.size()); + auto it = data.begin(); + for (int i = 0; i < data.size(); i++) { + out[i] = *it; + it++; + } + auto names_utf8 = static_cast(cpp11::as_sexp(names)); for (int j = 0; j < names_utf8.size(); ++j) { - names_utf8[j] = Rf_mkCharCE(names_utf8[j], CE_UTF8); + const auto name = static_cast(names_utf8[j]); + const auto name_str = static_cast(name); + names_utf8[j] = Rf_mkCharCE(name_str.c_str(), CE_UTF8); } out.attr("names") = names_utf8; out.attr("class") = "data.frame"; - out.attr("row.names") = IntegerVector::create(NA_INTEGER, -i); + out.attr("row.names") = cpp11::integers({NA_INTEGER, -i}); return out; } diff --git a/src/DbDataFrame.h b/src/DbDataFrame.h index 0c29997c..214c92f3 100644 --- a/src/DbDataFrame.h +++ b/src/DbDataFrame.h @@ -26,8 +26,8 @@ class DbDataFrame { void set_col_values(); bool advance(); - List get_data(); - List get_data(std::vector& types); + cpp11::list get_data(); + cpp11::list get_data(std::vector& types); size_t get_ncols() const; private: diff --git a/src/PqResultImpl.cpp b/src/PqResultImpl.cpp index 47c539d5..85a15e29 100644 --- a/src/PqResultImpl.cpp +++ b/src/PqResultImpl.cpp @@ -446,7 +446,7 @@ cpp11::list PqResultImpl::fetch_rows(const int n_max, int& n) { } LOG_VERBOSE << nrows_; - cpp11::writable::list ret = (SEXP)data.get_data(); + cpp11::writable::list ret = data.get_data(); add_oids(ret); return ret; } @@ -553,7 +553,7 @@ cpp11::list PqResultImpl::peek_first_row() { data.set_col_values(); // Not calling data.advance(), remains a zero-row data frame - cpp11::writable::list ret = (SEXP)data.get_data(); + cpp11::writable::list ret = data.get_data(); add_oids(ret); return ret; } diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 65ae292a..1c8f5dbe 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -155,17 +155,17 @@ extern "C" SEXP _RPostgres_result_valid(SEXP res_) { END_CPP11 } // result.cpp -List result_fetch(DbResult* res, const int n); +cpp11::list result_fetch(DbResult* res, const int n); extern "C" SEXP _RPostgres_result_fetch(SEXP res, SEXP n) { BEGIN_CPP11 return cpp11::as_sexp(result_fetch(cpp11::as_cpp>(res), cpp11::as_cpp>(n))); END_CPP11 } // result.cpp -void result_bind(DbResult* res, List params); +void result_bind(DbResult* res, cpp11::list params); extern "C" SEXP _RPostgres_result_bind(SEXP res, SEXP params) { BEGIN_CPP11 - result_bind(cpp11::as_cpp>(res), cpp11::as_cpp>(params)); + result_bind(cpp11::as_cpp>(res), cpp11::as_cpp>(params)); return R_NilValue; END_CPP11 } @@ -191,7 +191,7 @@ extern "C" SEXP _RPostgres_result_rows_affected(SEXP res) { END_CPP11 } // result.cpp -List result_column_info(DbResult* res); +cpp11::list result_column_info(DbResult* res); extern "C" SEXP _RPostgres_result_column_info(SEXP res) { BEGIN_CPP11 return cpp11::as_sexp(result_column_info(cpp11::as_cpp>(res))); From 1dc6bde9c370c78aa6b9c6229e972ca7db481f08 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sat, 28 Jan 2023 12:40:42 +0200 Subject: [PATCH 14/31] column storage --- src/DbColumnStorage.cpp | 13 ++++++------- src/DbColumnStorage.h | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/DbColumnStorage.cpp b/src/DbColumnStorage.cpp index 3ff8a0b2..ff97cfce 100644 --- a/src/DbColumnStorage.cpp +++ b/src/DbColumnStorage.cpp @@ -36,7 +36,7 @@ DATA_TYPE DbColumnStorage::get_data_type() const { SEXP DbColumnStorage::allocate(const R_xlen_t length, DATA_TYPE dt) { SEXPTYPE type = sexptype_from_datatype(dt); - RObject class_ = class_from_datatype(dt); + auto class_ = class_from_datatype(dt); SEXP ret = PROTECT(Rf_allocVector(type, length)); if (!Rf_isNull(class_)) Rf_setAttrib(ret, R_ClassSymbol, class_); @@ -184,17 +184,16 @@ SEXPTYPE DbColumnStorage::sexptype_from_datatype(DATA_TYPE dt) { } } -Rcpp::RObject DbColumnStorage::class_from_datatype(DATA_TYPE dt) { +cpp11::sexp DbColumnStorage::class_from_datatype(DATA_TYPE dt) { switch (dt) { case DT_INT64: - return CharacterVector::create("integer64"); - + return cpp11::strings(cpp11::as_sexp("integer64")); case DT_DATE: - return CharacterVector::create("Date"); + return cpp11::strings(cpp11::as_sexp("Date")); case DT_DATETIME: case DT_DATETIMETZ: - return CharacterVector::create("POSIXct", "POSIXt"); + return cpp11::strings({"POSIXct", "POSIXt"}); default: return R_NilValue; @@ -210,7 +209,7 @@ SEXP DbColumnStorage::set_attribs_from_datatype(SEXP x, DATA_TYPE dt) { return new_hms(x); case DT_DATETIME: { - Rcpp::RObject ro = Rcpp::RObject(x); + cpp11::sexp ro = x; ro.attr("tzone") = "UTC"; return ro; } diff --git a/src/DbColumnStorage.h b/src/DbColumnStorage.h index f386c72c..e09d4bdf 100644 --- a/src/DbColumnStorage.h +++ b/src/DbColumnStorage.h @@ -42,7 +42,7 @@ class DbColumnStorage { void fetch_value(); // allocate() - static Rcpp::RObject class_from_datatype(DATA_TYPE dt); + static cpp11::sexp class_from_datatype(DATA_TYPE dt); static SEXP set_attribs_from_datatype(SEXP x, DATA_TYPE dt); static SEXP new_blob(SEXP x); static SEXP new_hms(SEXP x); From e20f8ea6c7c5e44e98a1a98856f688cebcc36532 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sat, 28 Jan 2023 12:48:55 +0200 Subject: [PATCH 15/31] remove strings --- src/DbColumnStorage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DbColumnStorage.cpp b/src/DbColumnStorage.cpp index ff97cfce..71529c52 100644 --- a/src/DbColumnStorage.cpp +++ b/src/DbColumnStorage.cpp @@ -187,9 +187,9 @@ SEXPTYPE DbColumnStorage::sexptype_from_datatype(DATA_TYPE dt) { cpp11::sexp DbColumnStorage::class_from_datatype(DATA_TYPE dt) { switch (dt) { case DT_INT64: - return cpp11::strings(cpp11::as_sexp("integer64")); + return cpp11::as_sexp("integer64"); case DT_DATE: - return cpp11::strings(cpp11::as_sexp("Date")); + return cpp11::as_sexp("Date"); case DT_DATETIME: case DT_DATETIMETZ: From ad948f9cb281020cc851fcc2b7636e65e530d7be Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sat, 28 Jan 2023 13:20:29 +0200 Subject: [PATCH 16/31] warning/stop/package --- DESCRIPTION | 2 +- src/DbColumn.cpp | 9 +++------ src/DbColumn.h | 3 ++- src/DbColumnStorage.cpp | 17 +++++++---------- src/DbColumnStorage.h | 2 +- src/DbConnection.cpp | 20 ++++++++++---------- src/DbDataFrame.cpp | 2 +- src/DbResult.cpp | 4 ++-- src/PqResultImpl.cpp | 28 ++++++++++++++-------------- src/connection.cpp | 8 +++----- src/encode.cpp | 5 ++--- src/pch.h | 4 +--- 12 files changed, 47 insertions(+), 57 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index ce1b1e0d..34eb61cc 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -49,7 +49,7 @@ LazyLoad: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.2.3 SystemRequirements: libpq >= 9.0: libpq-dev (deb) or postgresql-devel - (rpm), C++11 + (rpm), C++17 Collate: 'PqDriver.R' 'PqConnection.R' diff --git a/src/DbColumn.cpp b/src/DbColumn.cpp index 57516372..96c12da2 100644 --- a/src/DbColumn.cpp +++ b/src/DbColumn.cpp @@ -29,7 +29,7 @@ void DbColumn::finalize(const int n_) { n = n_; } -void DbColumn::warn_type_conflicts(const String& name) const { +void DbColumn::warn_type_conflicts(const cpp11::r_string& name) const { std::set my_data_types_seen = data_types_seen; DATA_TYPE dt = get_last_storage()->get_data_type(); @@ -52,11 +52,8 @@ void DbColumn::warn_type_conflicts(const String& name) const { if (my_data_types_seen.size() == 0) return; - String name_utf8 = name; - name_utf8.set_encoding(CE_UTF8); - std::stringstream ss; - ss << "Column `" << name_utf8.get_cstring() << "`: " << + ss << "Column `" << static_cast(name) << "`: " << "mixed type, first seen values of type " << format_data_type(dt) << ", " << "coercing other values of type "; @@ -67,7 +64,7 @@ void DbColumn::warn_type_conflicts(const String& name) const { ss << format_data_type(*it); } - warning(ss.str()); + cpp11::warning(ss.str()); } DbColumn::operator SEXP() const { diff --git a/src/DbColumn.h b/src/DbColumn.h index 6d4da737..c9258600 100644 --- a/src/DbColumn.h +++ b/src/DbColumn.h @@ -1,6 +1,7 @@ #ifndef DB_COLUMN_H #define DB_COLUMN_H +#include #include "DbColumnDataType.h" #include "DbColumnDataSourceFactory.h" @@ -25,7 +26,7 @@ class DbColumn { public: void set_col_value(); void finalize(const int n_); - void warn_type_conflicts(const String& name) const; + void warn_type_conflicts(const cpp11::r_string& name) const; operator SEXP() const; DATA_TYPE get_type() const; diff --git a/src/DbColumnStorage.cpp b/src/DbColumnStorage.cpp index 71529c52..b5a91ce2 100644 --- a/src/DbColumnStorage.cpp +++ b/src/DbColumnStorage.cpp @@ -3,9 +3,6 @@ #include "DbColumnDataSource.h" #include "integer64.h" - -using namespace Rcpp; - DbColumnStorage::DbColumnStorage(DATA_TYPE dt_, const R_xlen_t capacity_, const int n_max_, const DbColumnDataSource& source_) : @@ -148,7 +145,7 @@ void DbColumnStorage::fetch_value() { break; default: - stop("NYI"); + cpp11::stop("NYI"); } } @@ -180,7 +177,7 @@ SEXPTYPE DbColumnStorage::sexptype_from_datatype(DATA_TYPE dt) { return VECSXP; default: - stop("Unknown type %d", dt); + cpp11::stop("Unknown type %d", dt); } } @@ -193,7 +190,7 @@ cpp11::sexp DbColumnStorage::class_from_datatype(DATA_TYPE dt) { case DT_DATETIME: case DT_DATETIMETZ: - return cpp11::strings({"POSIXct", "POSIXt"}); + return cpp11::as_sexp({"POSIXct", "POSIXt"}); default: return R_NilValue; @@ -219,12 +216,12 @@ SEXP DbColumnStorage::set_attribs_from_datatype(SEXP x, DATA_TYPE dt) { } SEXP DbColumnStorage::new_blob(SEXP x) { - static Function new_blob = Function("new_blob", Rcpp::Environment::namespace_env("blob")); + static cpp11::function new_blob = cpp11::package("blob")["new_blob"]; return new_blob(x); } SEXP DbColumnStorage::new_hms(SEXP x) { - static Function new_hms = Function("new_hms", Rcpp::Environment::namespace_env("hms")); + static cpp11::function new_hms = cpp11::package("hms")["new_hms"]; return new_hms(x); } @@ -259,7 +256,7 @@ void DbColumnStorage::fill_default_value(SEXP data, DATA_TYPE dt, R_xlen_t i) { break; case DT_UNKNOWN: - stop("Not setting value for unknown data type"); + cpp11::stop("Not setting value for unknown data type"); } } @@ -332,7 +329,7 @@ void DbColumnStorage::copy_value(SEXP x, DATA_TYPE dt, const int tgt, const int break; default: - stop("NYI: default"); + cpp11::stop("NYI: default"); } } } diff --git a/src/DbColumnStorage.h b/src/DbColumnStorage.h index e09d4bdf..51826617 100644 --- a/src/DbColumnStorage.h +++ b/src/DbColumnStorage.h @@ -8,7 +8,7 @@ class DbColumnDataSource; class DbColumnStorage { - Rcpp::RObject data; + cpp11::sexp data; int i; DATA_TYPE dt; const int n_max; diff --git a/src/DbConnection.cpp b/src/DbConnection.cpp index 9e5e860c..205f1674 100644 --- a/src/DbConnection.cpp +++ b/src/DbConnection.cpp @@ -29,7 +29,7 @@ DbConnection::DbConnection(std::vector keys, std::vectorfetch(n_max); } @@ -80,7 +80,7 @@ void DbResult::validate_params(const cpp11::list& params) const { for (int j = 1; j < params.size(); ++j) { SEXP col = params[j]; if (Rf_length(col) != n) - stop("Parameter %i does not have length %d.", j + 1, n); + cpp11::stop("Parameter %i does not have length %d.", j + 1, n); } } } diff --git a/src/PqResultImpl.cpp b/src/PqResultImpl.cpp index 85a15e29..e15be81f 100644 --- a/src/PqResultImpl.cpp +++ b/src/PqResultImpl.cpp @@ -77,10 +77,10 @@ void PqResultImpl::_cache::set(PGresult* spec) if (initialized_ || new_names.size() == 0) { LOG_VERBOSE; if (names_.size() != 0 && new_names.size() != 0 && names_ != new_names) { - stop("Multiple queries must use the same column names."); + cpp11::stop("Multiple queries must use the same column names."); } if (oids_.size() != 0 && new_oids.size() != 0 && oids_ != new_oids) { - stop("Multiple queries must use the same column types."); + cpp11::stop("Multiple queries must use the same column types."); } return; } @@ -275,16 +275,16 @@ void PqResultImpl::bind(const cpp11::list& params) { LOG_DEBUG << params.size(); if (immediate_ && params.size() > 0) { - stop("Immediate query cannot be parameterized."); + cpp11::stop("Immediate query cannot be parameterized."); } if (params.size() != cache.nparams_) { - stop("Query requires %i params; %i supplied.", + cpp11::stop("Query requires %i params; %i supplied.", cache.nparams_, params.size()); } if (params.size() == 0 && ready_) { - stop("Query does not require parameters."); + cpp11::stop("Query does not require parameters."); } set_params(params); @@ -308,7 +308,7 @@ cpp11::list PqResultImpl::fetch(const int n_max) { LOG_DEBUG << n_max; if (!ready_) - stop("Query needs to be bound before fetching"); + cpp11::stop("Query needs to be bound before fetching"); int n = 0; cpp11::list out; @@ -383,7 +383,7 @@ bool PqResultImpl::bind_row() { } } else { - CharacterVector param(params_[i]); + cpp11::strings param(params_[i]); if (param[group_] != NA_STRING) { c_params[i] = CHAR(param[group_]); } @@ -432,7 +432,7 @@ cpp11::list PqResultImpl::fetch_rows(const int n_max, int& n) { PqDataFrame data(this, cache.names_, n_max, cache.types_); if (complete_ && data.get_ncols() == 0) { - warning("Don't need to call dbFetch() for statements, only for queries"); + cpp11::warning("Don't need to call dbFetch() for statements, only for queries"); } while (!complete_) { @@ -481,7 +481,7 @@ bool PqResultImpl::step_run() { if (!proceed) { pConnPtr_->cancel_query(); complete_ = TRUE; - stop("Interrupted."); + cpp11::stop("Interrupted."); } need_cache_reset = true; @@ -594,7 +594,7 @@ bool PqResultImpl::wait_for_data() { // update db connection state using data available on the socket if (!PQconsumeInput(pConn_)) { - stop("Failed to consume input from the server"); + cpp11::stop("Failed to consume input from the server"); } // check if PQgetResult will block before waiting @@ -608,7 +608,7 @@ bool PqResultImpl::wait_for_data() { socket = PQsocket(pConn_); if (socket < 0) { - stop("Failed to get connection socket"); + cpp11::stop("Failed to get connection socket"); } do { @@ -627,7 +627,7 @@ bool PqResultImpl::wait_for_data() { // timeout reached - check user interrupt try { // FIXME: Do we even need this? - checkUserInterrupt(); + cpp11::check_user_interrupt(); } catch (...) { LOG_DEBUG; @@ -640,13 +640,13 @@ bool PqResultImpl::wait_for_data() { return false; } else { LOG_DEBUG; - stop("select() failed with error code %d", SOCKERR); + cpp11::stop("select() failed with error code %d", SOCKERR); } } // update db connection state using data available on the socket if (!PQconsumeInput(pConn_)) { - stop("Failed to consume input from the server"); + cpp11::stop("Failed to consume input from the server"); } } while (PQisBusy(pConn_)); // check if PQgetResult will still block diff --git a/src/connection.cpp b/src/connection.cpp index bccf8126..b8e87041 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -31,16 +31,14 @@ bool connection_valid(cpp11::external_pointer con_) { [[cpp11::register]] void connection_release(cpp11::external_pointer con_) { if (!connection_valid(con_)) { - warning("Already disconnected"); + cpp11::warning("Already disconnected"); return; } DbConnectionPtr* con = con_.get(); if (con->get()->has_query()) { - warning("%s\n%s", - "There is a result object still in use.", - "The connection will be automatically released when it is closed" - ); + cpp11::warning("There is a result object still in use.\n" + "The connection will be automatically released when it is closed"); } con->get()->disconnect(); diff --git a/src/encode.cpp b/src/encode.cpp index b78d35d8..0babc91d 100644 --- a/src/encode.cpp +++ b/src/encode.cpp @@ -96,7 +96,7 @@ void encode_in_buffer(cpp11::sexp x, int i, std::string& buffer) { } case STRSXP: { - RObject value = STRING_ELT(x, i); + cpp11::sexp value = STRING_ELT(x, i); if (value == NA_STRING) { buffer.append("\\N"); } else { @@ -106,8 +106,7 @@ void encode_in_buffer(cpp11::sexp x, int i, std::string& buffer) { break; } default: - stop("Don't know how to handle vector of type %s.", - Rf_type2char(TYPEOF(x))); + cpp11::stop(std::string("Don't know how to handle vector of type ") + Rf_type2char(TYPEOF(x)) + "."); } } diff --git a/src/pch.h b/src/pch.h index 5a4ba739..f8c334b4 100644 --- a/src/pch.h +++ b/src/pch.h @@ -1,7 +1,5 @@ -#include +//#include #include #include #include - -using namespace Rcpp; From 4db227f4d911f6ca2df14bd503f67059ca8162e4 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sat, 28 Jan 2023 13:30:00 +0200 Subject: [PATCH 17/31] remove Rcpp --- DESCRIPTION | 2 -- src/CMakeLists.txt | 2 +- src/cpp11.cpp | 3 --- src/pch.h | 1 - 4 files changed, 1 insertion(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 34eb61cc..4a3b1968 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,6 @@ Imports: hms (>= 1.0.0), lubridate, methods, - Rcpp (>= 1.0.7), withr Suggests: callr, @@ -37,7 +36,6 @@ Suggests: testthat (>= 3.0.0) LinkingTo: plogr (>= 0.2.0), - Rcpp, cpp11 VignetteBuilder: knitr diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5a3f16ef..021d13f8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -37,7 +37,7 @@ add_library(RPostgres PqUtils.h RPostgres-init.c RPostgres_types.h - RcppExports.cpp + cpp11.cpp connection.cpp encode.cpp encode.h diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 1c8f5dbe..0ca6c2f3 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -2,9 +2,6 @@ // clang-format off #include "RPostgres_types.h" -#include -#include -using namespace Rcpp; #include "cpp11/declarations.hpp" #include diff --git a/src/pch.h b/src/pch.h index f8c334b4..811463b6 100644 --- a/src/pch.h +++ b/src/pch.h @@ -1,4 +1,3 @@ -//#include #include #include From ae7a9d4eb3425f67f1a05e328d511afabf0cd944 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sat, 28 Jan 2023 13:40:44 +0200 Subject: [PATCH 18/31] undo DESCRIPTION --- DESCRIPTION | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DESCRIPTION b/DESCRIPTION index 4a3b1968..34eb61cc 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,6 +26,7 @@ Imports: hms (>= 1.0.0), lubridate, methods, + Rcpp (>= 1.0.7), withr Suggests: callr, @@ -36,6 +37,7 @@ Suggests: testthat (>= 3.0.0) LinkingTo: plogr (>= 0.2.0), + Rcpp, cpp11 VignetteBuilder: knitr From 435f97d09d8e47d0d2de53c55dc0efc3f342b74f Mon Sep 17 00:00:00 2001 From: antonov548 Date: Sat, 28 Jan 2023 14:08:57 +0200 Subject: [PATCH 19/31] fix new line --- src/connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connection.cpp b/src/connection.cpp index b8e87041..ac81e00e 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -111,4 +111,4 @@ cpp11::strings connection_get_temp_schema(DbConnection* con) { [[cpp11::register]] void connection_set_temp_schema(DbConnection* con, cpp11::strings temp_schema) { con->set_temp_schema(temp_schema); -} \ No newline at end of file +} From e60c573d4054a24518facc022d3c373739b4a112 Mon Sep 17 00:00:00 2001 From: Mauricio Vargas Date: Mon, 30 Jan 2023 02:30:10 -0500 Subject: [PATCH 20/31] use cpp11 and cpp11 only --- .Rbuildignore | 1 + DESCRIPTION | 12 ++++++------ src/Makevars.in | 2 ++ vscode-install.r | 4 ++++ 4 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 vscode-install.r diff --git a/.Rbuildignore b/.Rbuildignore index a6ebad59..4a3ca304 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -26,3 +26,4 @@ windows ^\.gitpod\.yml$ ^\.gitpod\.Dockerfile$ ^CMakeLists\.txt$ +^vscode-install\.r$ diff --git a/DESCRIPTION b/DESCRIPTION index 34eb61cc..c78beb4c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: RPostgres Title: Rcpp Interface to PostgreSQL -Version: 1.4.5.9002 +Version: 1.4.5.9003 Date: 2023-01-24 Authors@R: c( person("Hadley", "Wickham", role = "aut"), @@ -36,9 +36,8 @@ Suggests: rmarkdown, testthat (>= 3.0.0) LinkingTo: - plogr (>= 0.2.0), - Rcpp, - cpp11 + cpp11, + plogr (>= 0.2.0) VignetteBuilder: knitr Config/autostyle/scope: line_breaks @@ -48,8 +47,9 @@ Encoding: UTF-8 LazyLoad: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.2.3 -SystemRequirements: libpq >= 9.0: libpq-dev (deb) or postgresql-devel - (rpm), C++17 +SystemRequirements: + libpq >= 9.0: libpq-dev (deb) or postgresql-devel (rpm), + C++11 Collate: 'PqDriver.R' 'PqConnection.R' diff --git a/src/Makevars.in b/src/Makevars.in index 997f0450..9ca38040 100644 --- a/src/Makevars.in +++ b/src/Makevars.in @@ -4,3 +4,5 @@ PKG_CFLAGS=$(C_VISIBILITY) PKG_CXXFLAGS=$(CXX_VISIBILITY) PKG_LIBS=@libs@ + +CXX_STD = CXX11 diff --git a/vscode-install.r b/vscode-install.r new file mode 100644 index 00000000..5e8292db --- /dev/null +++ b/vscode-install.r @@ -0,0 +1,4 @@ +if (!require(covr)) install.packages("covr") +if (!require(DBItest)) install.packages("DBItest") +devtools::install(upgrade = "never") +devtools::check() From 92c27a5634d08628518da208905a1ec2dd6fa044 Mon Sep 17 00:00:00 2001 From: Mauricio Vargas Date: Mon, 30 Jan 2023 02:35:17 -0500 Subject: [PATCH 21/31] re roxygenize with newer roxygen installed version (7.2.3) --- DESCRIPTION | 2 +- NAMESPACE | 1 - R/PqDriver.R | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c78beb4c..63f78c11 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -55,8 +55,8 @@ Collate: 'PqConnection.R' 'PqResult.R' 'RPostgres-pkg.R' - 'cpp11.R' 'Redshift.R' + 'cpp11.R' 'dbAppendTable_PqConnection.R' 'dbBegin_PqConnection.R' 'dbBind_PqResult.R' diff --git a/NAMESPACE b/NAMESPACE index 4f569ea1..b7be7a48 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -56,7 +56,6 @@ exportMethods(show) exportMethods(sqlData) import(DBI) import(methods) -importFrom(Rcpp,sourceCpp) importFrom(bit64,integer64) importFrom(blob,blob) importFrom(hms,hms) diff --git a/R/PqDriver.R b/R/PqDriver.R index 4afca684..07299469 100644 --- a/R/PqDriver.R +++ b/R/PqDriver.R @@ -2,7 +2,6 @@ #' #' @export #' @useDynLib RPostgres, .registration = TRUE -#' @importFrom Rcpp sourceCpp #' @import methods DBI Postgres <- function() { new("PqDriver") From a67c4c224e2e079bfc139d5886eaacd3114d20f0 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Mon, 30 Jan 2023 15:12:25 +0200 Subject: [PATCH 22/31] use std::string for warning/stop --- src/DbConnection.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/DbConnection.cpp b/src/DbConnection.cpp index 205f1674..5b2ca662 100644 --- a/src/DbConnection.cpp +++ b/src/DbConnection.cpp @@ -98,14 +98,14 @@ void DbConnection::cancel_query() { // * the connection is NULL or // * the connection is invalid. PGcancel* cancel = PQgetCancel(pConn_); - if (cancel == NULL) cpp11::stop("Connection error detected via PQgetCancel()"); + if (cancel == NULL) cpp11::stop(std::string("Connection error detected via PQgetCancel()")); LOG_DEBUG; // PQcancel() actually issues the cancel command to the backend. char errbuf[256]; if (!PQcancel(cancel, errbuf, sizeof(errbuf))) { - cpp11::warning(errbuf); + cpp11::warning(std::string(errbuf)); } // free up the data structure allocated by PQgetCancel(). @@ -173,7 +173,7 @@ void DbConnection::copy_data(std::string sql, cpp11::list df) { void DbConnection::check_connection() { if (!pConn_) { - cpp11::stop("Disconnected"); + cpp11::stop(std::string("Disconnected")); } ConnStatusType status = PQstatus(pConn_); @@ -268,7 +268,7 @@ void DbConnection::conn_stop(const char* msg) { } void DbConnection::conn_stop(PGconn* conn, const char* msg) { - cpp11::stop("%s: %s", msg, PQerrorMessage(conn)); + cpp11::stop(std::string(msg) + " : " + PQerrorMessage(conn)); } void DbConnection::cleanup_query() { From 37bc3fee811590737689478fc4a4fdcdde243ea1 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Mon, 30 Jan 2023 16:58:21 +0200 Subject: [PATCH 23/31] remove import Rcpp --- DESCRIPTION | 1 - 1 file changed, 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 63f78c11..dec5db3b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,6 @@ Imports: hms (>= 1.0.0), lubridate, methods, - Rcpp (>= 1.0.7), withr Suggests: callr, From 56de4526bdaffee1b0da5f2b7a6729f76db3f691 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Wed, 1 Feb 2023 11:01:36 +0200 Subject: [PATCH 24/31] update DESCRIPTION --- DESCRIPTION | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index dec5db3b..e755fa8c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: RPostgres Title: Rcpp Interface to PostgreSQL -Version: 1.4.5.9003 +Version: 1.4.5.9002 Date: 2023-01-24 Authors@R: c( person("Hadley", "Wickham", role = "aut"), @@ -47,8 +47,7 @@ LazyLoad: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.2.3 SystemRequirements: - libpq >= 9.0: libpq-dev (deb) or postgresql-devel (rpm), - C++11 + libpq >= 9.0: libpq-dev (deb) or postgresql-devel (rpm) Collate: 'PqDriver.R' 'PqConnection.R' From 57c7b914adb2320c72dc05dc54ad257de99e3162 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Wed, 1 Feb 2023 11:20:36 +0200 Subject: [PATCH 25/31] remove cxx11 from Makevars --- src/Makevars.in | 2 -- src/Makevars.win | 1 - 2 files changed, 3 deletions(-) diff --git a/src/Makevars.in b/src/Makevars.in index 9ca38040..997f0450 100644 --- a/src/Makevars.in +++ b/src/Makevars.in @@ -4,5 +4,3 @@ PKG_CFLAGS=$(C_VISIBILITY) PKG_CXXFLAGS=$(CXX_VISIBILITY) PKG_LIBS=@libs@ - -CXX_STD = CXX11 diff --git a/src/Makevars.win b/src/Makevars.win index 5af9c71c..ab0719ac 100644 --- a/src/Makevars.win +++ b/src/Makevars.win @@ -3,7 +3,6 @@ RWINLIB = ../windows/libpq-$(VERSION) PKG_CPPFLAGS = -I$(RWINLIB)/include -Ivendor -DSTRICT_R_HEADERS -DRCPP_DEFAULT_INCLUDE_CALL=false -DRCPP_USING_UTF8_ERROR_STRING -DBOOST_NO_AUTO_PTR PKG_LIBS = -L$(RWINLIB)/lib${R_ARCH}${CRT} \ -lpq -lpgport -lpgcommon -lssl -lcrypto -lwsock32 -lsecur32 -lws2_32 -lgdi32 -lcrypt32 -lwldap32 -CXX_STD = CXX11 $(SHLIB): From 4b68109a7675be9d5bf81701333d8fe57589c2b1 Mon Sep 17 00:00:00 2001 From: antonov548 Date: Mon, 6 Feb 2023 10:47:46 +0200 Subject: [PATCH 26/31] string for cpp11::warning --- src/DbConnection.cpp | 2 +- src/PqResultImpl.cpp | 2 +- src/connection.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/DbConnection.cpp b/src/DbConnection.cpp index 5b2ca662..1175769a 100644 --- a/src/DbConnection.cpp +++ b/src/DbConnection.cpp @@ -64,7 +64,7 @@ void DbConnection::set_current_result(const DbResult* pResult) { // (even if (the new) pResult is NULL, we should try to reset the back-end.) if (pCurrentResult_ != NULL) { if (pResult != NULL) { - cpp11::warning("Closing open result set, cancelling previous query"); + cpp11::warning(std::string("Closing open result set, cancelling previous query")); } cleanup_query(); diff --git a/src/PqResultImpl.cpp b/src/PqResultImpl.cpp index e15be81f..3b6f55ad 100644 --- a/src/PqResultImpl.cpp +++ b/src/PqResultImpl.cpp @@ -432,7 +432,7 @@ cpp11::list PqResultImpl::fetch_rows(const int n_max, int& n) { PqDataFrame data(this, cache.names_, n_max, cache.types_); if (complete_ && data.get_ncols() == 0) { - cpp11::warning("Don't need to call dbFetch() for statements, only for queries"); + cpp11::warning(std::string("Don't need to call dbFetch() for statements, only for queries")); } while (!complete_) { diff --git a/src/connection.cpp b/src/connection.cpp index ac81e00e..2e0cb172 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -31,14 +31,14 @@ bool connection_valid(cpp11::external_pointer con_) { [[cpp11::register]] void connection_release(cpp11::external_pointer con_) { if (!connection_valid(con_)) { - cpp11::warning("Already disconnected"); + cpp11::warning(std::string("Already disconnected")); return; } DbConnectionPtr* con = con_.get(); if (con->get()->has_query()) { - cpp11::warning("There is a result object still in use.\n" - "The connection will be automatically released when it is closed"); + cpp11::warning(std::string("There is a result object still in use.\n" + "The connection will be automatically released when it is closed")); } con->get()->disconnect(); From 6533d543cad6de17f183b488d7c537841604b9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Wed, 8 Feb 2023 05:44:51 +0100 Subject: [PATCH 27/31] Tweak test --- tests/testthat/test-dbConnect.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-dbConnect.R b/tests/testthat/test-dbConnect.R index 18e0649a..6e938742 100644 --- a/tests/testthat/test-dbConnect.R +++ b/tests/testthat/test-dbConnect.R @@ -1,7 +1,7 @@ test_that("querying closed connection throws error", { db <- postgresDefault() dbDisconnect(db) - expect_error(dbSendQuery(db, "select * from foo")) + expect_error(dbSendQuery(db, "select * from foo"), "bad_weak_ptr") }) test_that("warn if previous result set is invalidated", { From 44c1918d754f55cfe6f46e725edf570a3bac7df0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Wed, 8 Feb 2023 09:25:28 +0000 Subject: [PATCH 28/31] fix: release connection with result --- src/connection.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/connection.cpp b/src/connection.cpp index 2e0cb172..a2a297f5 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -39,6 +39,7 @@ void connection_release(cpp11::external_pointer con_) { if (con->get()->has_query()) { cpp11::warning(std::string("There is a result object still in use.\n" "The connection will be automatically released when it is closed")); + return; } con->get()->disconnect(); From 7ca870babae55f48ce6af0ad95de9b1c3dacd07d Mon Sep 17 00:00:00 2001 From: antonov548 Date: Thu, 9 Feb 2023 12:09:23 +0200 Subject: [PATCH 29/31] retrun std::string instead of r_string --- src/cpp11.cpp | 2 +- src/encrypt.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 0ca6c2f3..bf613ab9 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -115,7 +115,7 @@ extern "C" SEXP _RPostgres_encode_data_frame(SEXP x) { END_CPP11 } // encrypt.cpp -cpp11::r_string encrypt_password(cpp11::r_string password, cpp11::r_string user); +std::string encrypt_password(cpp11::r_string password, cpp11::r_string user); extern "C" SEXP _RPostgres_encrypt_password(SEXP password, SEXP user) { BEGIN_CPP11 return cpp11::as_sexp(encrypt_password(cpp11::as_cpp>(password), cpp11::as_cpp>(user))); diff --git a/src/encrypt.cpp b/src/encrypt.cpp index 40841084..2b4477ea 100644 --- a/src/encrypt.cpp +++ b/src/encrypt.cpp @@ -2,7 +2,7 @@ [[cpp11::register]] -cpp11::r_string encrypt_password(cpp11::r_string password, cpp11::r_string user) { +std::string encrypt_password(cpp11::r_string password, cpp11::r_string user) { const auto pass = static_cast(password); const auto u = static_cast(user); From 4a1ac624ee592e121b2bf0379f94e757b23f6ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Mon, 13 Feb 2023 16:06:31 +0100 Subject: [PATCH 30/31] Revert "fix: release connection with result" This reverts commit 44c1918d754f55cfe6f46e725edf570a3bac7df0. --- src/connection.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/connection.cpp b/src/connection.cpp index a2a297f5..2e0cb172 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -39,7 +39,6 @@ void connection_release(cpp11::external_pointer con_) { if (con->get()->has_query()) { cpp11::warning(std::string("There is a result object still in use.\n" "The connection will be automatically released when it is closed")); - return; } con->get()->disconnect(); From 87def430cba376bd95c90e2f826b9ccabccd145a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Mon, 13 Feb 2023 16:10:11 +0100 Subject: [PATCH 31/31] Early return if connection closed already --- src/DbConnection.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/DbConnection.cpp b/src/DbConnection.cpp index 1175769a..696ba002 100644 --- a/src/DbConnection.cpp +++ b/src/DbConnection.cpp @@ -272,6 +272,10 @@ void DbConnection::conn_stop(PGconn* conn, const char* msg) { } void DbConnection::cleanup_query() { + if (!pConn_) { + return; + } + if (pCurrentResult_ != NULL && !(pCurrentResult_->complete())) { cancel_query(); }