From 74d9ab3518d50ebafb12e8252c01fa904b089481 Mon Sep 17 00:00:00 2001 From: Constantin Michael Date: Fri, 6 May 2011 11:44:02 +0200 Subject: Add error support --- odb/pgsql/error.cxx | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 odb/pgsql/error.cxx (limited to 'odb/pgsql/error.cxx') diff --git a/odb/pgsql/error.cxx b/odb/pgsql/error.cxx new file mode 100644 index 0000000..2dd4f03 --- /dev/null +++ b/odb/pgsql/error.cxx @@ -0,0 +1,78 @@ +// file : odb/pgsql/errors.cxx +// author : Constantin Michael +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#include +#include + +#include +#include + +using namespace std; + +namespace odb +{ + namespace pgsql + { + void + translate_error (connection& c) + { + PGconn* h (0); // @@ c.handle (); + + assert (CONNECTION_BAD == PQstatus (h)); + + if (const char* m = PQerrorMessage (h)) + throw database_exception (m); + else + throw database_exception ("unknown error"); + } + + void + translate_error (connection& c, PGresult* r) + { + PGconn* h (0); // @@ c.handle (); + + if (!r) + { + if (CONNECTION_BAD == PQstatus (h)) + throw connection_lost (); + else + throw bad_alloc (); + } + + switch (PQresultStatus (r)) + { + case PGRES_BAD_RESPONSE: + { + if (const char* m = PQresultErrorMessage (r)) + throw database_exception (m); + else + throw database_exception ("bad server response"); + } + + case PGRES_FATAL_ERROR: + { + // PG_DIAG_SQLSTATE field is always present. + // + string s (PQresultErrorField (r, PG_DIAG_SQLSTATE)); + + // Deadlock detected. + // + if ("40P01" == s) + throw deadlock (); + + else if (CONNECTION_BAD == PQstatus (h)) + throw connection_lost (); + + else + throw database_exception (s, PQresultErrorMessage (r)); + } + + default: + assert (0); + break; + }; + } + } +} -- cgit v1.1