summaryrefslogtreecommitdiff
path: root/libpqpp/modifycommand.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libpqpp/modifycommand.cpp')
-rw-r--r--libpqpp/modifycommand.cpp27
1 files changed, 25 insertions, 2 deletions
diff --git a/libpqpp/modifycommand.cpp b/libpqpp/modifycommand.cpp
index ae7abeb..c14ff74 100644
--- a/libpqpp/modifycommand.cpp
+++ b/libpqpp/modifycommand.cpp
@@ -6,7 +6,8 @@
PQ::ModifyCommand::ModifyCommand(const Connection * conn, const std::string & sql, unsigned int no) :
DB::Command(sql),
DB::ModifyCommand(sql),
- PQ::Command(conn, sql, no)
+ PQ::Command(conn, sql, no),
+ prepared(false)
{
}
@@ -17,7 +18,29 @@ PQ::ModifyCommand::~ModifyCommand()
unsigned int
PQ::ModifyCommand::execute(bool anc)
{
- prepare();
+ 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;
+ }
+ }
+ c->checkResultFree(PQprepare(
+ c->conn, stmntName.c_str(), psql.c_str(), values.size(), NULL), PGRES_COMMAND_OK);
+ prepared = true;
+ }
PGresult * res = PQexecPrepared(c->conn, stmntName.c_str(), values.size(), &values.front(), &lengths.front(), &formats.front(), 0);
c->checkResult(res, PGRES_COMMAND_OK);
unsigned int rows = atoi(PQcmdTuples(res));