00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef PQXX_TRANSACTIONITF_H
00016 #define PQXX_TRANSACTIONITF_H
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "pqxx/connection.h"
00030 #include "pqxx/result.h"
00031
00032
00033
00034
00035
00036 namespace pqxx
00037 {
00038 class Connection;
00039 class Result;
00040 class TableStream;
00041
00042
00043 template<> inline PGSTD::string Classname(const TableStream *)
00044 {
00045 return "TableStream";
00046 }
00047
00048
00050
00054 class PQXX_LIBEXPORT TransactionItf
00055 {
00056 public:
00057 virtual ~TransactionItf() =0;
00058
00059 void Commit();
00060 void Abort();
00061
00063 Result Exec(const char[]);
00064
00066 Result Exec(const PGSTD::string &Q) { return Exec(Q.c_str()); }
00067
00068 void ProcessNotice(const char Msg[]) { m_Conn.ProcessNotice(Msg); }
00069 void ProcessNotice(const PGSTD::string &Msg)
00070 { m_Conn.ProcessNotice(Msg); }
00071
00072 PGSTD::string Name() const { return m_Name; }
00073
00074 protected:
00077 explicit TransactionItf(Connection &,
00078 const PGSTD::string &TName=PGSTD::string());
00079
00082 void Begin();
00083
00085 void End() throw ();
00086
00088 virtual void DoBegin() =0;
00089 virtual Result DoExec(const char C[]) =0;
00090 virtual void DoCommit() =0;
00091 virtual void DoAbort() =0;
00092
00093
00094
00096 Result DirectExec(const char C[], int Retries, const char OnReconnect[]);
00097 Connection &Conn() const { return m_Conn; }
00098
00099
00100 private:
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 enum Status
00119 {
00120 st_nascent,
00121 st_active,
00122 st_aborted,
00123 st_committed,
00124 st_in_doubt
00125 };
00126
00127
00128 friend class Cursor;
00129 int GetUniqueCursorNum() { return m_UniqueCursorNum++; }
00130 void MakeEmpty(Result &R) const { m_Conn.MakeEmpty(R); }
00131
00132 friend class TableStream;
00133 void RegisterStream(const TableStream *);
00134 void UnregisterStream(const TableStream *) throw ();
00135 void EndCopy() { m_Conn.EndCopy(); }
00136 friend class TableReader;
00137 void BeginCopyRead(const PGSTD::string &Table)
00138 { m_Conn.BeginCopyRead(Table); }
00139 bool ReadCopyLine(PGSTD::string &L) { return m_Conn.ReadCopyLine(L); }
00140 friend class TableWriter;
00141 void BeginCopyWrite(const PGSTD::string &Table)
00142 { m_Conn.BeginCopyWrite(Table); }
00143 void WriteCopyLine(const PGSTD::string &L) { m_Conn.WriteCopyLine(L); }
00144
00145 Connection &m_Conn;
00146
00147 PGSTD::string m_Name;
00148 int m_UniqueCursorNum;
00149 Unique<TableStream> m_Stream;
00150 Status m_Status;
00151 bool m_Registered;
00152
00153
00154 TransactionItf();
00155 TransactionItf(const TransactionItf &);
00156 TransactionItf &operator=(const TransactionItf &);
00157 };
00158
00159
00161
00167 class PQXX_LIBEXPORT in_doubt_error : public PGSTD::runtime_error
00168 {
00169 public:
00170 explicit in_doubt_error(const PGSTD::string &whatarg) :
00171 PGSTD::runtime_error(whatarg) {}
00172 };
00173
00174 }
00175
00176 #endif
00177