Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

tablereader.h

Go to the documentation of this file.
00001 /*-------------------------------------------------------------------------
00002  *
00003  *   FILE
00004  *      pqxx/tablereader.h
00005  *
00006  *   DESCRIPTION
00007  *      definition of the pqxx::TableReader class.
00008  *   pqxx::TableReader enables optimized batch reads from a database table
00009  *
00010  * Copyright (c) 2001-2003, Jeroen T. Vermeulen <jtv@xs4all.nl>
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 /* Methods tested in eg. self-test program test1 are marked with "//[t1]"
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);            //[t6]
00046   ~TableReader();                                                       //[t6]
00047 
00048   TableReader &operator>>(Result &);
00049   TableReader &operator>>(PGSTD::string &);
00050 
00051   template<typename TUPLE> TableReader &operator>>(TUPLE &);            //[t8]
00052 
00053   operator bool() const throw () { return !m_Done; }                    //[t6]
00054   bool operator!() const throw () { return m_Done; }                    //[t6]
00055 
00056   bool GetRawLine(PGSTD::string &Line);                                 //[t8]
00057 
00058   template<typename TUPLE> 
00059   void Tokenize(PGSTD::string, TUPLE &) const;                  //[t8]
00060 
00061 private:
00062   bool m_Done;
00063 };
00064 
00065 }
00066 
00067 // TODO: Find meaningful definition of input iterator
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   // Filter and tokenize line, inserting tokens at end of T
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': // End of token
00083       *ins++ = PGSTD::string(Line, token, i-token);
00084       token = i+1;
00085       break;
00086 
00087     case '\\':
00088       // Ignore the backslash and accept literally whatever comes after it 
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         // This is a \N, signifying a NULL value.
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 

Generated on Fri Jan 24 16:36:06 2003 for libpqxx by doxygen1.3-rc2