aboutsummaryrefslogtreecommitdiff
path: root/odb/pgsql/database.cxx
diff options
context:
space:
mode:
authorConstantin Michael <constantin@codesynthesis.com>2011-05-11 12:27:41 +0200
committerConstantin Michael <constantin@codesynthesis.com>2011-05-12 11:27:57 +0200
commit3faf8e7a8aa2411f207fa09fe81982615d90a726 (patch)
tree8b6cf5f11362a80e4de979ca5f4e4de2b8a4078f /odb/pgsql/database.cxx
parent4e955852b9d59338a5bb50facc1594e97b8ca2d8 (diff)
Implement database::execute
Diffstat (limited to 'odb/pgsql/database.cxx')
-rw-r--r--odb/pgsql/database.cxx34
1 files changed, 28 insertions, 6 deletions
diff --git a/odb/pgsql/database.cxx b/odb/pgsql/database.cxx
index 080b17f..ac7a991 100644
--- a/odb/pgsql/database.cxx
+++ b/odb/pgsql/database.cxx
@@ -6,6 +6,7 @@
#include <sstream>
#include <odb/pgsql/database.hxx>
+#include <odb/pgsql/error.hxx>
#include <odb/pgsql/exceptions.hxx>
#include <odb/pgsql/connection-factory.hxx>
#include <odb/pgsql/transaction.hxx>
@@ -208,12 +209,33 @@ namespace odb
{
}
- // @@ Implement on completion of supporting code.
- //
- // unsigned long long database::
- // execute (const char* s, std::size_t n)
- // {
- // }
+ unsigned long long database::
+ execute (const char* s, std::size_t)
+ {
+ if (!transaction::has_current ())
+ throw not_in_transaction ();
+
+ connection_type& c (transaction::current ().connection ());
+
+ PGresult* r = PQexec (c.handle (), s);
+
+ ExecStatusType status;
+ unsigned long long count (0);
+
+ if (!r)
+ translate_result_error (c);
+ else if (!is_good_result (r, &status))
+ translate_result_error (c, r, status);
+ else if (status == PGRES_TUPLES_OK)
+ count = static_cast<unsigned long long> (PQntuples (r));
+ else
+ {
+ istringstream ss (PQcmdTuples (r));
+ ss >> count;
+ }
+
+ return count;
+ }
transaction_impl* database::
begin ()