00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "pqxx/compiler-public.hxx"
00020 #include "pqxx/compiler-internal-pre.hxx"
00021
00022 #include "pqxx/connection_base"
00023 #include "pqxx/transaction"
00024
00025
00026
00027
00028
00030 #define PQXX_DEPRECATED_TRANSACTION_CALLBACKS
00031
00032 namespace pqxx
00033 {
00034
00036
00065 template<typename TRANSACTION=transaction<read_committed> >
00066 class transactor :
00067 public PGSTD::unary_function<TRANSACTION, void>
00068 {
00069 public:
00070 explicit transactor(const PGSTD::string &TName="transactor") :
00071 m_Name(TName) { }
00072
00074
00085 void operator()(TRANSACTION &T);
00086
00087
00088
00089
00090
00091
00092
00094
00102 void on_abort(const char[]) throw () {}
00103
00105
00109 void on_commit() {}
00110
00112
00123 void on_doubt() throw () {}
00124
00125 #ifdef PQXX_DEPRECATED_TRANSACTION_CALLBACKS
00126
00130
00131
00132 void OnCommit() {}
00134
00135 void OnAbort(const char[]) throw () {}
00137
00138 void OnDoubt() throw () {}
00140 #endif
00141
00142
00144 PGSTD::string Name() const { return m_Name; }
00145
00146 private:
00147 PGSTD::string m_Name;
00148 };
00149
00150
00151 }
00152
00153
00164 template<typename TRANSACTOR>
00165 inline void pqxx::connection_base::perform(const TRANSACTOR &T,
00166 int Attempts)
00167 {
00168 if (Attempts <= 0) return;
00169
00170 bool Done = false;
00171
00172
00173
00174 do
00175 {
00176 --Attempts;
00177
00178
00179 TRANSACTOR T2(T);
00180 try
00181 {
00182 typename TRANSACTOR::argument_type X(*this, T2.Name());
00183 T2(X);
00184 X.commit();
00185 Done = true;
00186 }
00187 catch (const in_doubt_error &)
00188 {
00189
00190
00191 #ifdef PQXX_DEPRECATED_TRANSACTION_CALLBACKS
00192 T2.OnDoubt();
00193 #endif
00194 T2.on_doubt();
00195 throw;
00196 }
00197 catch (const PGSTD::exception &e)
00198 {
00199
00200 #ifdef PQXX_DEPRECATED_TRANSACTION_CALLBACKS
00201 T2.OnAbort(e.what());
00202 #endif
00203 T2.on_abort(e.what());
00204 if (Attempts <= 0) throw;
00205 continue;
00206 }
00207 catch (...)
00208 {
00209
00210 #ifdef PQXX_DEPRECATED_TRANSACTION_CALLBACKS
00211 T2.OnAbort("Unknown exception");
00212 #endif
00213 T2.on_abort("Unknown exception");
00214 throw;
00215 }
00216
00217 #ifdef PQXX_DEPRECATED_TRANSACTION_CALLBACKS
00218 T2.OnCommit();
00219 #endif
00220 T2.on_commit();
00221 } while (!Done);
00222 }
00223
00224
00225 #include "pqxx/compiler-internal-post.hxx"