00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef PQXX_TABLEREADER_H
00015 #define PQXX_TABLEREADER_H
00016
00017 #include <string>
00018
00019 #include "pqxx/result.h"
00020 #include "pqxx/tablestream.h"
00021
00022
00023
00024
00025
00026 namespace pqxx
00027 {
00028
00030
00042 class PQXX_LIBEXPORT TableReader : public TableStream
00043 {
00044 public:
00045 TableReader(TransactionItf &, const PGSTD::string &RName);
00046 ~TableReader();
00047
00048 TableReader &operator>>(Result &);
00049 TableReader &operator>>(PGSTD::string &);
00050
00051 template<typename TUPLE> TableReader &operator>>(TUPLE &);
00052
00053 operator bool() const throw () { return !m_Done; }
00054 bool operator!() const throw () { return m_Done; }
00055
00056 bool GetRawLine(PGSTD::string &Line);
00057
00058 template<typename TUPLE>
00059 void Tokenize(PGSTD::string, TUPLE &) const;
00060
00061 private:
00062 bool m_Done;
00063 };
00064
00065 }
00066
00067
00068
00069
00070 template<typename TUPLE>
00071 inline void pqxx::TableReader::Tokenize(PGSTD::string Line,
00072 TUPLE &T) const
00073 {
00074 PGSTD::back_insert_iterator<TUPLE> ins = PGSTD::back_inserter(T);
00075
00076
00077 PGSTD::string::size_type token = 0;
00078 for (PGSTD::string::size_type i=0; i < Line.size(); ++i)
00079 {
00080 switch (Line[i])
00081 {
00082 case '\t':
00083 *ins++ = PGSTD::string(Line, token, i-token);
00084 token = i+1;
00085 break;
00086
00087 case '\\':
00088
00089 if ((i+1) >= Line.size())
00090 throw PGSTD::runtime_error("Row ends in backslash");
00091
00092 switch (Line[i+1])
00093 {
00094 case 'N':
00095
00096 Line.replace(i, 2, NullStr());
00097 i += NullStr().size() - 1;
00098 break;
00099
00100 case 't':
00101 Line.replace(i++, 2, "\t");
00102 break;
00103
00104 case 'n':
00105 Line.replace(i++, 2, "\n");
00106 break;
00107
00108 default:
00109 Line.erase(i, 1);
00110 }
00111 break;
00112 }
00113 }
00114
00115 *ins++ = PGSTD::string(Line, token);
00116 }
00117
00118
00119 template<typename TUPLE>
00120 inline pqxx::TableReader &pqxx::TableReader::operator>>(TUPLE &T)
00121 {
00122 PGSTD::string Line;
00123 if (GetRawLine(Line)) Tokenize(Line, T);
00124 return *this;
00125 }
00126
00127
00128
00129 #endif
00130