00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #include "pqxx/result"
00020 #include "pqxx/tablestream"
00021 
00022 
00023 
00024 
00025 namespace pqxx
00026 {
00027 
00029 
00043 class PQXX_LIBEXPORT tablereader : public tablestream
00044 {
00045 public:
00046   tablereader(transaction_base &, 
00047       const PGSTD::string &RName,
00048       const PGSTD::string &Null=PGSTD::string());                       
00049 
00051 
00053   template<typename ITER>
00054   tablereader(transaction_base &, 
00055       const PGSTD::string &RName,
00056       ITER begincolumns,
00057       ITER endcolumns,
00058       const PGSTD::string &Null=PGSTD::string());                       
00059 
00060   ~tablereader() throw ();                                              
00061 
00062   template<typename TUPLE> tablereader &operator>>(TUPLE &);            
00063 
00064   operator bool() const throw () { return !m_Done; }                    
00065   bool operator!() const throw () { return m_Done; }                    
00066 
00068 
00072   bool get_raw_line(PGSTD::string &Line);                               
00073 
00074   template<typename TUPLE> 
00075   void tokenize(PGSTD::string, TUPLE &) const;                          
00076 
00078 
00085   virtual void complete();                                              
00086 
00087 #ifdef PQXX_DEPRECATED_HEADERS
00088 
00089   bool GetRawLine(PGSTD::string &L) { return get_raw_line(L); }
00091   template<typename TUPLE> void Tokenize(PGSTD::string L, TUPLE &T) const
00092         { tokenize(L, T); }
00093 #endif
00094 
00095 private:
00096   void setup(transaction_base &T,
00097       const PGSTD::string &RName,
00098       const PGSTD::string &Columns=PGSTD::string());
00099   void reader_close();
00100   PGSTD::string extract_field(const PGSTD::string &, 
00101       PGSTD::string::size_type &) const;
00102 
00103   bool m_Done;
00104 };
00105 
00106 
00107 
00108 
00109 
00110 template<typename ITER> inline
00111 tablereader::tablereader(transaction_base &T, 
00112     const PGSTD::string &RName,
00113     ITER begincolumns,
00114     ITER endcolumns,
00115     const PGSTD::string &Null) :
00116   tablestream(T, RName, Null, "tablereader"),
00117   m_Done(true)
00118 {
00119   setup(T, RName, columnlist(begincolumns, endcolumns));
00120 }
00121 
00122 
00123 template<typename TUPLE> 
00124 inline void tablereader::tokenize(PGSTD::string Line, TUPLE &T) const
00125 {
00126   PGSTD::back_insert_iterator<TUPLE> ins = PGSTD::back_inserter(T);
00127 
00128   
00129   PGSTD::string::size_type here=0;
00130   while (here < Line.size()) *ins++ = extract_field(Line, here);
00131 }
00132 
00133 
00134 template<typename TUPLE> 
00135 inline tablereader &pqxx::tablereader::operator>>(TUPLE &T)
00136 {
00137   PGSTD::string Line;
00138   if (get_raw_line(Line)) tokenize(Line, T);
00139   return *this;
00140 }
00141 
00142 
00143 } 
00144