00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
#include <string>
00020 
00021 
#include "pqxx/transaction_base"
00022 
00023 
namespace pqxx
00024 {
00025 
00027 
00054 class PQXX_LIBEXPORT dbtransaction : 
public transaction_base
00055 {
00056 
protected:
00057   explicit dbtransaction(
connection_base &C,
00058                          
const PGSTD::string &IsolationString,
00059                          
const PGSTD::string &NName,
00060                          
const PGSTD::string &CName) :
00061     
transaction_base(C, NName, CName),
00062     m_StartCmd()
00063   {
00064     
if (IsolationString != 
isolation_traits<read_committed>::name())
00065       m_StartCmd = 
"SET TRANSACTION ISOLATION LEVEL " + IsolationString;
00066   }
00067 
00069   void start_backend_transaction()
00070   {
00071     DirectExec(
"BEGIN", 2);
00072     
if (!startcommand().empty()) DirectExec(startcommand().c_str());
00073   }
00074 
00076   const PGSTD::string &startcommand()
 const { 
return m_StartCmd; }
00077 
00078 
#ifdef PQXX_DEPRECATED_HEADERS
00079 
00080   
const PGSTD::string &StartCmd()
 const { 
return startcommand(); }
00081 
#endif
00082 
00083 
private:
00084 
00086   
virtual void do_begin() =0;
00088   
virtual result do_exec(
const char Query[]);                           
00090   
virtual void do_commit() =0;
00092   
virtual void do_abort() =0;
00093 
00095   PGSTD::string m_StartCmd;
00096 };
00097 
00098 
00099 
inline result dbtransaction::do_exec(
const char Query[])
00100 {
00101   result R;
00102   
try
00103   {
00104     R = 
DirectExec(Query);
00105   }
00106   
catch (
const PGSTD::exception &)
00107   {
00108     
try { 
abort(); } 
catch (
const PGSTD::exception &) {}
00109     
throw;
00110   }
00111   
return R;
00112 }
00113 
00114 } 
00115