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/connectionitf.h"
00030 #include "pqxx/result.h"
00031
00032
00033
00034
00035
00036 namespace pqxx
00037 {
00038 class ConnectionItf;
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
00067 Result Exec(const char Query[],
00068 const PGSTD::string &Desc=PGSTD::string());
00069
00071
00078 Result Exec(const PGSTD::string &Query,
00079 const PGSTD::string &Desc=PGSTD::string())
00080 { return Exec(Query.c_str(), Desc); }
00081
00083 void ProcessNotice(const char Msg[]) { m_Conn.ProcessNotice(Msg); }
00085
00086 { m_Conn.ProcessNotice(Msg); }
00087
00088 PGSTD::string Name() const { return m_Name; }
00089
00091 ConnectionItf &Conn() const { return m_Conn; }
00092
00093 protected:
00096 explicit TransactionItf(ConnectionItf &,
00097 const PGSTD::string &TName=PGSTD::string());
00098
00101 void Begin();
00102
00104 void End() throw ();
00105
00107 virtual void DoBegin() =0;
00108 virtual Result DoExec(const char Query[]) =0;
00109 virtual void DoCommit() =0;
00110 virtual void DoAbort() =0;
00111
00112
00113
00115 Result DirectExec(const char C[], int Retries, const char OnReconnect[]);
00116
00117 private:
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 enum Status
00136 {
00137 st_nascent,
00138 st_active,
00139 st_aborted,
00140 st_committed,
00141 st_in_doubt
00142 };
00143
00144
00145 friend class Cursor;
00146 int GetUniqueCursorNum() { return m_UniqueCursorNum++; }
00147 void MakeEmpty(Result &R) const { m_Conn.MakeEmpty(R); }
00148
00149 friend class TableStream;
00150 void RegisterStream(const TableStream *);
00151 void UnregisterStream(const TableStream *) throw ();
00152 void EndCopy() { m_Conn.EndCopy(); }
00153 friend class TableReader;
00154 void BeginCopyRead(const PGSTD::string &Table)
00155 { m_Conn.BeginCopyRead(Table); }
00156 bool ReadCopyLine(PGSTD::string &L) { return m_Conn.ReadCopyLine(L); }
00157 friend class TableWriter;
00158 void BeginCopyWrite(const PGSTD::string &Table)
00159 { m_Conn.BeginCopyWrite(Table); }
00160 void WriteCopyLine(const PGSTD::string &L) { m_Conn.WriteCopyLine(L); }
00161
00162 ConnectionItf &m_Conn;
00163
00164 PGSTD::string m_Name;
00165 int m_UniqueCursorNum;
00166 Unique<TableStream> m_Stream;
00167 Status m_Status;
00168 bool m_Registered;
00169
00170
00171 TransactionItf();
00172 TransactionItf(const TransactionItf &);
00173 TransactionItf &operator=(const TransactionItf &);
00174 };
00175
00176
00178
00184 class PQXX_LIBEXPORT in_doubt_error : public PGSTD::runtime_error
00185 {
00186 public:
00187 explicit in_doubt_error(const PGSTD::string &whatarg) :
00188 PGSTD::runtime_error(whatarg) {}
00189 };
00190
00191 }
00192
00193 #endif
00194