summaryrefslogtreecommitdiff
path: root/libpqpp/connection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libpqpp/connection.cpp')
-rw-r--r--libpqpp/connection.cpp211
1 files changed, 0 insertions, 211 deletions
diff --git a/libpqpp/connection.cpp b/libpqpp/connection.cpp
deleted file mode 100644
index de3f189..0000000
--- a/libpqpp/connection.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-#include "connection.h"
-#include "error.h"
-#include "selectcommand.h"
-#include "modifycommand.h"
-#include <unistd.h>
-#include <poll.h>
-#include <boost/assert.hpp>
-
-NAMEDFACTORY("postgresql", PQ::Connection, DB::ConnectionFactory);
-
-static void setup() __attribute__((constructor(101)));
-static void setup()
-{
- BOOST_ASSERT(PQisthreadsafe() == 1);
- PQinitOpenSSL(1, 0);
-}
-
-static void
-noNoticeProcessor(void *, const char *)
-{
-}
-
-PQ::Connection::Connection(const std::string & info) :
- conn(PQconnectdb(info.c_str())),
- txDepth(0),
- pstmntNo(0),
- rolledback(false)
-{
- if (PQstatus(conn) != CONNECTION_OK) {
- ConnectionError ce(conn);
- PQfinish(conn);
- throw ce;
- }
- PQsetNoticeProcessor(conn, noNoticeProcessor, NULL);
-}
-
-PQ::Connection::~Connection()
-{
- PQfinish(conn);
-}
-
-void
-PQ::Connection::finish() const
-{
- if (txDepth != 0) {
- rollbackTx();
- throw Error("Transaction still open");
- }
-}
-
-int
-PQ::Connection::beginTx() const
-{
- if (txDepth == 0) {
- checkResultFree(PQexec(conn, "BEGIN"), PGRES_COMMAND_OK);
- rolledback = false;
- }
- return ++txDepth;
-}
-
-int
-PQ::Connection::commitTx() const
-{
- if (rolledback) {
- return rollbackTx();
- }
- if (--txDepth == 0) {
- checkResultFree(PQexec(conn, "COMMIT"), PGRES_COMMAND_OK);
- }
- return txDepth;
-}
-
-int
-PQ::Connection::rollbackTx() const
-{
- if (--txDepth == 0) {
- checkResultFree(PQexec(conn, "ROLLBACK"), PGRES_COMMAND_OK);
- }
- else {
- rolledback = true;
- }
- return txDepth;
-}
-
-bool
-PQ::Connection::inTx() const
-{
- return txDepth;
-}
-
-void
-PQ::Connection::execute(const std::string & sql) const
-{
- checkResultFree(PQexec(conn, sql.c_str()), PGRES_COMMAND_OK, PGRES_TUPLES_OK);
-}
-
-DB::BulkDeleteStyle
-PQ::Connection::bulkDeleteStyle() const
-{
- return DB::BulkDeleteUsingSubSelect;
-}
-
-DB::BulkUpdateStyle
-PQ::Connection::bulkUpdateStyle() const
-{
- return DB::BulkUpdateUsingFromSrc;
-}
-
-void
-PQ::Connection::ping() const
-{
- struct pollfd fd { PQsocket(conn), POLLRDHUP | POLLERR | POLLHUP | POLLNVAL, 0 };
- if (PQstatus(conn) != CONNECTION_OK || poll(&fd, 1, 1)) {
- if (inTx()) {
- throw ConnectionError(conn);
- }
- PQreset(conn);
- if (PQstatus(conn) != CONNECTION_OK) {
- throw ConnectionError(conn);
- }
- }
-}
-
-
-DB::SelectCommand *
-PQ::Connection::newSelectCommand(const std::string & sql) const
-{
- return new SelectCommand(this, sql, pstmntNo++);
-}
-
-DB::ModifyCommand *
-PQ::Connection::newModifyCommand(const std::string & sql) const
-{
- return new ModifyCommand(this, sql, pstmntNo++);
-}
-
-bool
-PQ::Connection::checkResultInt(PGresult * res, int expected, int alt)
-{
- return (PQresultStatus(res) == expected) || (alt != -1 && (PQresultStatus(res) == alt));
-}
-
-PGresult *
-PQ::Connection::checkResult(PGresult * res, int expected, int alt) const
-{
- if (!checkResultInt(res, expected, alt)) {
- PQclear(res);
- throw Error(PQerrorMessage(conn));
- }
- return res;
-}
-
-void
-PQ::Connection::checkResultFree(PGresult * res, int expected, int alt) const
-{
- if (!checkResultInt(res, expected, alt)) {
- PQclear(res);
- throw Error(PQerrorMessage(conn));
- }
- PQclear(res);
-}
-
-void
-PQ::Connection::beginBulkUpload(const char * table, const char * extra) const
-{
- char buf[BUFSIZ];
- snprintf(buf, BUFSIZ, "COPY %s FROM STDIN %s", table, extra);
- checkResultFree(PQexec(conn, buf), PGRES_COPY_IN);
-}
-
-void
-PQ::Connection::endBulkUpload(const char * msg) const
-{
- switch (PQputCopyEnd(conn, msg)) {
- case 0:// block
- sleep(1);
- endBulkUpload(msg);
- return;
- case 1:// success
- checkResultFree(PQgetResult(conn), PGRES_COMMAND_OK);
- return;
- default:// -1 is error
- throw Error(PQerrorMessage(conn));
- }
-}
-
-size_t
-PQ::Connection::bulkUploadData(const char * data, size_t len) const
-{
- switch (PQputCopyData(conn, data, len)) {
- case 0:// block
- sleep(1);
- return bulkUploadData(data, len);
- case 1:// success
- return len;
- default:// -1 is error
- throw Error(PQerrorMessage(conn));
- }
-}
-
-int64_t
-PQ::Connection::insertId() const
-{
- SelectCommand getId(this, "SELECT lastval()", pstmntNo++);
- int64_t id = -1;
- while (getId.fetch()) {
- getId[0] >> id;
- }
- return id;
-}
-