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