00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "pqxx/libcompiler.h"
00020
00021 #include <map>
00022 #include <string>
00023
00024 #include "pqxx/transaction_base"
00025
00026
00027
00028
00029
00030 namespace pqxx
00031 {
00032
00034
00057 class PQXX_LIBEXPORT pipeline : public internal::transactionfocus
00058 {
00059 public:
00060 typedef long query_id;
00061
00062 explicit pipeline(transaction_base &, const PGSTD::string &PName="");
00063
00064 ~pipeline() throw ();
00065
00067
00072 query_id insert(const PGSTD::string &);
00073
00075 void complete();
00076
00078
00084 void flush();
00085
00087 bool is_finished(query_id) const;
00088
00090
00093 result retrieve(query_id qid)
00094 { return retrieve(m_queries.find(qid)).second; }
00095
00097 PGSTD::pair<query_id, result> retrieve();
00098
00099 bool empty() const throw () { return m_queries.empty(); }
00100
00101 int retain(int retain_max=2);
00102
00103
00105 void resume();
00106
00107 private:
00109 void invariant() const;
00110
00111 class Query
00112 {
00113 public:
00114 explicit Query(const PGSTD::string &q) : m_query(q), m_res() {}
00115
00116 const result &get_result() const throw () { return m_res; }
00117 void set_result(const result &r) throw () { m_res = r; }
00118 const PGSTD::string &get_query() const throw () { return m_query; }
00119
00120 private:
00121 PGSTD::string m_query;
00122 result m_res;
00123 };
00124
00125 typedef PGSTD::map<query_id,Query> QueryMap;
00126
00128 static query_id qid_limit() throw ()
00129 {
00130 #ifdef _MSC_VER
00131 return LONG_MAX;
00132 #else
00133 return PGSTD::numeric_limits<query_id>::max();
00134 #endif
00135 }
00136
00138 query_id generate_id();
00139
00140 bool have_pending() const throw ()
00141 { return m_issuedrange.second != m_issuedrange.first; }
00142
00143 void issue();
00144
00146 void set_error_at(query_id qid) throw () { if (qid < m_error) m_error = qid; }
00147
00148 void internal_error(const PGSTD::string &err) throw (PGSTD::logic_error);
00149
00150 bool obtain_result(bool expect_none=false);
00151
00152 void obtain_dummy();
00153 void get_further_available_results();
00154 void check_end_results();
00155
00157 void receive_if_available();
00158
00160 void receive(QueryMap::const_iterator stop);
00161 PGSTD::pair<query_id, result> retrieve(QueryMap::iterator);
00162
00163 QueryMap m_queries;
00164 PGSTD::pair<QueryMap::iterator,QueryMap::iterator> m_issuedrange;
00165 int m_retain;
00166 int m_num_waiting;
00167 query_id m_q_id;
00168
00170 bool m_dummy_pending;
00171
00173 query_id m_error;
00174
00176 pipeline(const pipeline &);
00178 pipeline &operator=(const pipeline &);
00179 };
00180
00181
00182 }
00183
00184