From 2a3f8ddab3542bb0b7c456780eaf53f2e4dc363e Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 7 Dec 2015 14:26:09 +0000 Subject: Merge select and modify command's SQL parser --- libpqpp/command.cpp | 21 +++++++++++++++++++++ libpqpp/command.h | 1 + libpqpp/modifycommand.cpp | 17 +---------------- libpqpp/selectcommand.cpp | 17 +---------------- 4 files changed, 24 insertions(+), 32 deletions(-) diff --git a/libpqpp/command.cpp b/libpqpp/command.cpp index ba12574..94079da 100644 --- a/libpqpp/command.cpp +++ b/libpqpp/command.cpp @@ -24,6 +24,27 @@ PQ::Command::~Command() } } +void +PQ::Command::prepareSql(std::string & psql, const std::string & sql) +{ + char buf[4]; + int p = 1; + bool inquote = false; + for(std::string::const_iterator i = sql.begin(); i != sql.end(); ++i) { + if (*i == '?' && !inquote) { + snprintf(buf, 4, "$%d", p++); + psql += buf; + } + else if (*i == '\'') { + inquote = !inquote; + psql += *i; + } + else { + psql += *i; + } + } +} + void PQ::Command::paramsAtLeast(unsigned int n) { diff --git a/libpqpp/command.h b/libpqpp/command.h index e6edac2..32faaa0 100644 --- a/libpqpp/command.h +++ b/libpqpp/command.h @@ -31,6 +31,7 @@ namespace PQ { void bindNull(unsigned int); protected: + static void prepareSql(std::string & psql, const std::string & sql); const std::string stmntName; const Connection * c; diff --git a/libpqpp/modifycommand.cpp b/libpqpp/modifycommand.cpp index 3eb41ec..460ec31 100644 --- a/libpqpp/modifycommand.cpp +++ b/libpqpp/modifycommand.cpp @@ -21,22 +21,7 @@ PQ::ModifyCommand::prepare() const if (!prepared) { std::string psql; psql.reserve(sql.length() + 20); - char buf[4]; - int p = 1; - bool inquote = false; - for(std::string::const_iterator i = sql.begin(); i != sql.end(); ++i) { - if (*i == '?' && !inquote) { - snprintf(buf, 4, "$%d", p++); - psql += buf; - } - else if (*i == '\'') { - inquote = !inquote; - psql += *i; - } - else { - psql += *i; - } - } + prepareSql(psql, sql); c->checkResultFree(PQprepare( c->conn, stmntName.c_str(), psql.c_str(), values.size(), NULL), PGRES_COMMAND_OK); prepared = true; diff --git a/libpqpp/selectcommand.cpp b/libpqpp/selectcommand.cpp index 8e3ec36..2312dbb 100644 --- a/libpqpp/selectcommand.cpp +++ b/libpqpp/selectcommand.cpp @@ -37,25 +37,10 @@ PQ::SelectCommand::mkdeclare() const { std::string psql; psql.reserve(sql.length() + 40); - char buf[4]; - int p = 1; - bool inquote = false; psql += "DECLARE "; psql += stmntName; psql += " CURSOR FOR "; - for(std::string::const_iterator i = sql.begin(); i != sql.end(); ++i) { - if (*i == '?' && !inquote) { - snprintf(buf, 4, "$%d", p++); - psql += buf; - } - else if (*i == '\'') { - inquote = !inquote; - psql += *i; - } - else { - psql += *i; - } - } + prepareSql(psql, sql); return psql; } -- cgit v1.2.3