summaryrefslogtreecommitdiff
path: root/libpqpp
diff options
context:
space:
mode:
authorDan Goodliffe <daniel.goodliffe@pressassociation.com>2017-01-04 17:54:29 +0000
committerDan Goodliffe <daniel.goodliffe@pressassociation.com>2017-01-04 17:54:29 +0000
commitd6e8b1c5a787641dc63fc50c9b35cc7427a33b65 (patch)
tree55e450e83034a97d685a93779c939573f1c2b41c /libpqpp
parentUse bulk select not cursor select for getId, far fewer operations (diff)
downloadlibdbpp-postgresql-d6e8b1c5a787641dc63fc50c9b35cc7427a33b65.tar.bz2
libdbpp-postgresql-d6e8b1c5a787641dc63fc50c9b35cc7427a33b65.tar.xz
libdbpp-postgresql-d6e8b1c5a787641dc63fc50c9b35cc7427a33b65.zip
Add PQ specific command options to control page size and the use of bulk -v- cursor selects
Diffstat (limited to 'libpqpp')
-rw-r--r--libpqpp/pq-command.cpp9
-rw-r--r--libpqpp/pq-command.h12
-rw-r--r--libpqpp/pq-connection.cpp6
-rw-r--r--libpqpp/pq-cursorselectcommand.cpp4
-rw-r--r--libpqpp/pq-cursorselectcommand.h2
-rw-r--r--libpqpp/unittests/testpq.cpp7
6 files changed, 32 insertions, 8 deletions
diff --git a/libpqpp/pq-command.cpp b/libpqpp/pq-command.cpp
index af203cc..a6259df 100644
--- a/libpqpp/pq-command.cpp
+++ b/libpqpp/pq-command.cpp
@@ -25,6 +25,15 @@ PQ::Command::~Command()
}
}
+PQ::CommandOptions::CommandOptions(std::size_t hash,
+ unsigned int ft,
+ bool uc) :
+ DB::CommandOptions(hash),
+ fetchTuples(ft),
+ useCursor(uc)
+{
+}
+
AdHocFormatter(PQCommandParamName, "$%?");
void
PQ::Command::prepareSql(std::stringstream & psql, const std::string & sql) const
diff --git a/libpqpp/pq-command.h b/libpqpp/pq-command.h
index 2c0bf14..056706e 100644
--- a/libpqpp/pq-command.h
+++ b/libpqpp/pq-command.h
@@ -4,9 +4,21 @@
#include <command.h>
#include <libpq-fe.h>
#include <vector>
+#include <visibility.h>
namespace PQ {
class Connection;
+
+ class DLL_PUBLIC CommandOptions : public DB::CommandOptions {
+ public:
+ CommandOptions(std::size_t hash,
+ unsigned int fetchTuples = 35,
+ bool useCursor = true);
+
+ unsigned int fetchTuples;
+ bool useCursor;
+ };
+
class Command : public virtual DB::Command {
public:
Command(Connection *, const std::string & sql, unsigned int no);
diff --git a/libpqpp/pq-connection.cpp b/libpqpp/pq-connection.cpp
index 1fadde3..5b560a9 100644
--- a/libpqpp/pq-connection.cpp
+++ b/libpqpp/pq-connection.cpp
@@ -99,11 +99,11 @@ PQ::Connection::ping() const
DB::SelectCommand *
PQ::Connection::newSelectCommand(const std::string & sql, const DB::CommandOptions * opts)
{
- // Yes, this is a hack
- if (sql.find("libdbpp:no-cursor") != (std::string::size_type)-1) {
+ auto pqco = dynamic_cast<const CommandOptions *>(opts);
+ if (pqco && !pqco->useCursor) {
return new BulkSelectCommand(this, sql, pstmntNo++, opts);
}
- return new CursorSelectCommand(this, sql, pstmntNo++);
+ return new CursorSelectCommand(this, sql, pstmntNo++, pqco);
}
DB::ModifyCommand *
diff --git a/libpqpp/pq-cursorselectcommand.cpp b/libpqpp/pq-cursorselectcommand.cpp
index ac4b825..d130b89 100644
--- a/libpqpp/pq-cursorselectcommand.cpp
+++ b/libpqpp/pq-cursorselectcommand.cpp
@@ -7,13 +7,13 @@ AdHocFormatter(PQCursorSelectDeclare, "DECLARE %? CURSOR FOR ");
AdHocFormatter(PQCursorSelectFetch, "FETCH %? IN %?");
AdHocFormatter(PQCursorSelectClose, "CLOSE %?");
-PQ::CursorSelectCommand::CursorSelectCommand(Connection * conn, const std::string & sql, unsigned int no) :
+PQ::CursorSelectCommand::CursorSelectCommand(Connection * conn, const std::string & sql, unsigned int no, const PQ::CommandOptions * pqco) :
DB::Command(sql),
PQ::SelectBase(sql),
PQ::Command(conn, sql, no),
executed(false),
txOpened(false),
- fTuples(35),
+ fTuples(pqco ? pqco->fetchTuples : 35),
s_fetch(PQCursorSelectFetch::get(fTuples, stmntName)),
s_close(PQCursorSelectClose::get(stmntName))
{
diff --git a/libpqpp/pq-cursorselectcommand.h b/libpqpp/pq-cursorselectcommand.h
index e7a67e6..417cff9 100644
--- a/libpqpp/pq-cursorselectcommand.h
+++ b/libpqpp/pq-cursorselectcommand.h
@@ -11,7 +11,7 @@ namespace PQ {
class Column;
class CursorSelectCommand : public SelectBase, public Command {
public:
- CursorSelectCommand(Connection *, const std::string & sql, unsigned int no);
+ CursorSelectCommand(Connection *, const std::string & sql, unsigned int no, const PQ::CommandOptions *);
virtual ~CursorSelectCommand();
bool fetch() override;
diff --git a/libpqpp/unittests/testpq.cpp b/libpqpp/unittests/testpq.cpp
index 15ea022..f7c327f 100644
--- a/libpqpp/unittests/testpq.cpp
+++ b/libpqpp/unittests/testpq.cpp
@@ -11,6 +11,7 @@
#include <boost/date_time/posix_time/posix_time.hpp>
#include <pq-error.h>
#include <pq-connection.h>
+#include <pq-command.h>
#include <selectcommandUtil.impl.h>
class StandardMockDatabase : public PQ::Mock {
@@ -291,7 +292,8 @@ BOOST_AUTO_TEST_CASE( statementReuse )
BOOST_AUTO_TEST_CASE( bulkSelect )
{
auto ro = DB::MockDatabase::openConnectionTo("PQmock");
- auto sel = ro->newSelectCommand("SELECT * FROM test WHERE id > ? --libdbpp:no-cursor");
+ PQ::CommandOptions co(0, 35, false);
+ auto sel = ro->newSelectCommand("SELECT * FROM test WHERE id > ?", &co);
sel->bindParamI(0, 1);
int totalInt = 0, count = 0;
sel->forEachRow<int64_t>([&totalInt, &count](auto i) {
@@ -307,7 +309,8 @@ BOOST_AUTO_TEST_CASE( bulkSelect )
BOOST_AUTO_TEST_CASE( insertReturning )
{
auto ro = DB::MockDatabase::openConnectionTo("PQmock");
- auto sel = ro->newSelectCommand("INSERT INTO test(id, fl) VALUES(1, 3) RETURNING id + fl --libdbpp:no-cursor");
+ PQ::CommandOptions co(0, 35, false);
+ auto sel = ro->newSelectCommand("INSERT INTO test(id, fl) VALUES(1, 3) RETURNING id + fl", &co);
int totalInt = 0, count = 0;
sel->forEachRow<int64_t>([&totalInt, &count](auto i) {
totalInt += i;