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/util.h"
00031
00032
00033
00034
00035
00036
00037
00038 namespace pqxx
00039 {
00040 class Connection;
00041 class Result;
00042 class TableStream;
00043
00044
00045 template<> inline PGSTD::string Classname(const TableStream *)
00046 {
00047 return "TableStream";
00048 }
00049
00050
00052
00056 class PQXX_LIBEXPORT TransactionItf
00057 {
00058 public:
00059 virtual ~TransactionItf() =0;
00060
00061 void Commit();
00062 void Abort();
00063
00065 Result Exec(const char[]);
00066
00067 void ProcessNotice(const char Msg[]) { m_Conn.ProcessNotice(Msg); }
00068 void ProcessNotice(PGSTD::string Msg) { m_Conn.ProcessNotice(Msg); }
00069
00070 PGSTD::string Name() const { return m_Name; }
00071
00072 protected:
00075 explicit TransactionItf(Connection &,
00076 PGSTD::string Name=PGSTD::string());
00077
00080 void Begin();
00081
00083 void End() throw ();
00084
00086 virtual void DoBegin() =0;
00087 virtual Result DoExec(const char C[]) =0;
00088 virtual void DoCommit() =0;
00089 virtual void DoAbort() =0;
00090
00091
00092
00094 Result DirectExec(const char C[], int Retries, const char OnReconnect[]);
00095 Connection &Conn() const { return m_Conn; }
00096
00097
00098 private:
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 enum Status
00117 {
00118 st_nascent,
00119 st_active,
00120 st_aborted,
00121 st_committed,
00122 st_in_doubt
00123 };
00124
00125
00126 friend class Cursor;
00127 int GetUniqueCursorNum() { return m_UniqueCursorNum++; }
00128 void MakeEmpty(Result &R) const { m_Conn.MakeEmpty(R); }
00129
00130 friend class TableStream;
00131 void RegisterStream(const TableStream *);
00132 void UnregisterStream(const TableStream *) throw ();
00133 void EndCopy() { m_Conn.EndCopy(); }
00134 friend class TableReader;
00135 void BeginCopyRead(PGSTD::string Table) { m_Conn.BeginCopyRead(Table); }
00136 bool ReadCopyLine(PGSTD::string &L) { return m_Conn.ReadCopyLine(L); }
00137 friend class TableWriter;
00138 void BeginCopyWrite(PGSTD::string Table) {m_Conn.BeginCopyWrite(Table);}
00139 void WriteCopyLine(PGSTD::string L) { m_Conn.WriteCopyLine(L); }
00140
00141 Connection &m_Conn;
00142
00143 PGSTD::string m_Name;
00144 int m_UniqueCursorNum;
00145 Unique<TableStream> m_Stream;
00146 Status m_Status;
00147 bool m_Registered;
00148
00149
00150 TransactionItf();
00151 TransactionItf(const TransactionItf &);
00152 TransactionItf &operator=(const TransactionItf &);
00153 };
00154
00155
00157
00163 class PQXX_LIBEXPORT in_doubt_error : public PGSTD::runtime_error
00164 {
00165 public:
00166 explicit in_doubt_error(const PGSTD::string &whatarg) :
00167 PGSTD::runtime_error(whatarg) {}
00168 };
00169
00170 }
00171
00172 #endif
00173