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