row1.hh
上传用户:clovervx
上传日期:2010-03-30
资源大小:787k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #ifndef __row1_hh__
  2. #define __row1_hh__
  3. #include <vector>
  4. #include <string>
  5. using namespace std ;
  6. #include "bad_query.hh"
  7. #include "defs.h"
  8. //#include "define_short.h"
  9. #include "coldata1.hh"
  10. #include "resiter1.hh"
  11. #include "vallist1.hh"
  12. template <class ThisType, class Res>
  13. class RowTemplate {
  14. protected:
  15.   virtual ThisType& self() = 0;
  16.   virtual const ThisType& self() const = 0;
  17. public:
  18.   virtual const Res & parent() const = 0;
  19.   //
  20.   // value_list
  21.   //
  22.   value_list_ba<ThisType,quote_type0>
  23.   value_list(const char *d = ",") const {
  24.     return value_list_ba<ThisType,quote_type0>
  25.       (self(), d, quote);
  26.   }
  27. // FIX: this piece of code refuses to work under VC++
  28. /*
  29.   template <class Manip>
  30.   value_list_ba<ThisType,Manip>
  31.   value_list(const char *d, Manip m) const {
  32.     return value_list_ba<ThisType,Manip> (self(), d, m);
  33.   }
  34.   template <class Manip>
  35.   value_list_b<ThisType,Manip>
  36.   value_list(const char *d, Manip m, const vector<bool> &vb) const {
  37.     return value_list_b<ThisType,Manip> (self(), vb, d, m);
  38.   }
  39. */
  40.   value_list_b<ThisType,quote_type0>
  41.   value_list(const char *d, const vector<bool> &vb) const {
  42.     return value_list_b<ThisType,quote_type0> (self(), vb, d, quote);
  43.   }
  44.   value_list_b<ThisType,quote_type0>
  45.   value_list(const vector<bool> &vb) const {
  46.     return value_list_b<ThisType,quote_type0> (self(), vb, ",", quote);
  47.   }
  48.   template <class Manip>
  49.   value_list_b<ThisType,Manip>
  50.   value_list(const char *d, Manip m, bool t0,
  51.      bool t1=false, bool t2=false, bool t3=false, bool t4=false,
  52.      bool t5=false, bool t6=false, bool t7=false, bool t8=false,
  53.      bool t9=false, bool ta=false, bool tb=false, bool tc=false) const {
  54.     vector<bool> vb;
  55.     create_vector(self().size(), vb, t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,ta,tb,tc);
  56.     return value_list_b<ThisType, Manip>(self(), vb, d, m);
  57.   }
  58.   value_list_b<ThisType,quote_type0>
  59.   value_list(const char *d, bool t0,
  60.      bool t1=false, bool t2=false, bool t3=false, bool t4=false,
  61.      bool t5=false, bool t6=false, bool t7=false, bool t8=false,
  62.      bool t9=false, bool ta=false, bool tb=false, bool tc=false) const {
  63.     vector<bool> vb;
  64.     create_vector(self().size(), vb, t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,ta,tb,tc);
  65.     return value_list_b<ThisType, quote_type0>(self(), vb, d, quote);
  66.   }
  67.   value_list_b<ThisType,quote_type0>
  68.   value_list(bool t0,
  69.      bool t1=false, bool t2=false, bool t3=false, bool t4=false,
  70.      bool t5=false, bool t6=false, bool t7=false, bool t8=false,
  71.      bool t9=false, bool ta=false, bool tb=false, bool tc=false) const {
  72.     vector<bool> vb;
  73.     create_vector(self().size(), vb, t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,ta,tb,tc);
  74.     return value_list_b<ThisType, quote_type0>(self(), vb, ",", quote);
  75.   }
  76.   template <class Manip>
  77.   value_list_b<ThisType,Manip>
  78.   value_list(const char *d, Manip m, string s0,
  79.      string s1="", string s2="", string s3="", string s4="",
  80.      string s5="", string s6="", string s7="", string s8="",
  81.      string s9="", string sa="", string sb="", string sc="") const {
  82.     vector<bool> vb;
  83.     create_vector(self(), vb, s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc);
  84.     return value_list_b<ThisType, Manip>(self(), vb, d, m);
  85.   }
  86.   value_list_b<ThisType,quote_type0>
  87.   value_list(const char *d, string s0,
  88.      string s1="", string s2="", string s3="", string s4="",
  89.      string s5="", string s6="", string s7="", string s8="",
  90.      string s9="", string sa="", string sb="", string sc="") const {
  91.     vector<bool> vb;
  92.     create_vector(self(), vb, s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc);
  93.     return value_list_b<ThisType, quote_type0>(self(), vb, d, quote);
  94.   }
  95.   value_list_b<ThisType,quote_type0>
  96.   value_list(string s0,
  97.      string s1="", string s2="", string s3="", string s4="",
  98.      string s5="", string s6="", string s7="", string s8="",
  99.      string s9="", string sa="", string sb="", string sc="") const {
  100.     vector<bool> vb;
  101.     create_vector(self(), vb, s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc);
  102.     return value_list_b<ThisType, quote_type0>(self(), vb, ",", quote);
  103.   }
  104.   //
  105.   // field_list
  106.   //
  107.   value_list_ba<FieldNames, do_nothing_type0>
  108.   field_list(const char *d = ",") const {
  109.     return value_list_ba<FieldNames, do_nothing_type0>
  110.       (parent().names(), d, do_nothing);
  111.   }
  112. // FIX: this piece of code refuses to work under VC++
  113. /*
  114.   template <class Manip>
  115.   value_list_ba<FieldNames,Manip>
  116.   field_list(const char *d, Manip m) const {
  117.     return value_list_ba<FieldNames, Manip>
  118.       (parent().names(), d, m);
  119.   }
  120.   template <class Manip>
  121.   value_list_b<FieldNames,Manip>
  122.   field_list(const char *d, Manip m, const vector<bool> &vb) const {
  123.     return value_list_b<FieldNames,Manip> (parent().names(), vb, d, m);
  124.   }
  125. */
  126.   value_list_b<FieldNames,quote_type0>
  127.   field_list(const char *d, const vector<bool> &vb) const {
  128.     return value_list_b<FieldNames,quote_type0> (parent().names(), vb, d, quote);
  129.   }
  130.   value_list_b<FieldNames,quote_type0>
  131.   field_list(const vector<bool> &vb) const {
  132.     return value_list_b<FieldNames,quote_type0> (parent().names(), vb, ",", quote);
  133.   }
  134.   template <class Manip>
  135.   value_list_b<FieldNames,Manip>
  136.   field_list(const char *d, Manip m, bool t0,
  137.      bool t1=false, bool t2=false, bool t3=false, bool t4=false,
  138.      bool t5=false, bool t6=false, bool t7=false, bool t8=false,
  139.      bool t9=false, bool ta=false, bool tb=false, bool tc=false) const {
  140.     vector<bool> vb;
  141.     create_vector(parent().names().size(), vb, t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,ta,tb,tc);
  142.     return value_list_b<FieldNames, Manip>(parent().names(), vb, d, m);
  143.   }
  144.   value_list_b<FieldNames,quote_type0>
  145.   field_list(const char *d, bool t0,
  146.      bool t1=false, bool t2=false, bool t3=false, bool t4=false,
  147.      bool t5=false, bool t6=false, bool t7=false, bool t8=false,
  148.      bool t9=false, bool ta=false, bool tb=false, bool tc=false) const {
  149.     vector<bool> vb;
  150.     create_vector(parent().names().size(), vb, t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,ta,tb,tc);
  151.     return value_list_b<FieldNames, quote_type0>(parent().names(), vb, d, quote);
  152.   }
  153.   value_list_b<FieldNames,quote_type0>
  154.   field_list(bool t0,
  155.      bool t1=false, bool t2=false, bool t3=false, bool t4=false,
  156.      bool t5=false, bool t6=false, bool t7=false, bool t8=false,
  157.      bool t9=false, bool ta=false, bool tb=false, bool tc=false) const {
  158.     vector<bool> vb;
  159.     create_vector(parent().names().size(), vb, t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,ta,tb,tc);
  160.     return value_list_b<FieldNames, quote_type0>(parent().names(), vb, ",", quote);
  161.   }
  162.   template <class Manip>
  163.   value_list_b<FieldNames,Manip>
  164.   field_list(const char *d, Manip m, string s0,
  165.      string s1="", string s2="", string s3="", string s4="",
  166.      string s5="", string s6="", string s7="", string s8="",
  167.      string s9="", string sa="", string sb="", string sc="") const {
  168.     vector<bool> vb;
  169.     create_vector(parent().names(), vb, s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc);
  170.     return value_list_b<FieldNames, Manip>(parent().names(), vb, d, m);
  171.   }
  172.   value_list_b<FieldNames,quote_type0>
  173.   field_list(const char *d, string s0,
  174.      string s1="", string s2="", string s3="", string s4="",
  175.      string s5="", string s6="", string s7="", string s8="",
  176.      string s9="", string sa="", string sb="", string sc="") const {
  177.     vector<bool> vb;
  178.     create_vector(parent().names(), vb, s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc);
  179.     return value_list_b<FieldNames, quote_type0>(parent().names(), vb, d, quote);
  180.   }
  181.   value_list_b<FieldNames,quote_type0>
  182.   field_list(string s0,
  183.      string s1="", string s2="", string s3="", string s4="",
  184.      string s5="", string s6="", string s7="", string s8="",
  185.      string s9="", string sa="", string sb="", string sc="") const {
  186.     vector<bool> vb;
  187.     create_vector(parent().names(), vb, s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc);
  188.     return value_list_b<FieldNames, quote_type0>(parent().names(), vb, ",", quote);
  189.   }
  190.   //
  191.   // equal_list
  192.   //
  193.   equal_list_ba<FieldNames,ThisType,quote_type0>
  194.   equal_list(const char *d = ",", const char *e = " = ") const {
  195.     return equal_list_ba<FieldNames,ThisType,quote_type0>
  196.       (parent().names(), self(), d, e, quote);
  197.   }
  198.   template <class Manip>
  199.   equal_list_ba<FieldNames,ThisType,Manip>
  200.   equal_list(const char *d, const char *e, Manip m) const {
  201.     return equal_list_ba<FieldNames,ThisType,Manip>
  202.       (parent().names(), self(), d, e, m);
  203.   }
  204.   virtual ~RowTemplate() {}
  205. };
  206. //: This class handles the actual rows in an intelligent manner.
  207. class Row : public const_subscript_container<Row,ColData,const ColData>,
  208.     public RowTemplate<Row, ResUse>
  209. {
  210. private:
  211.   vector <string> data;
  212. vector <bool> is_nulls;
  213.   const ResUse *res;
  214.   bool         throw_exceptions, initialized;
  215. public:
  216.   Row() {}
  217.   Row(MYSQL_ROW d, const ResUse *r, unsigned int *jj, bool te = false)
  218.     : res(r), throw_exceptions(te), initialized(false)
  219.   {
  220.      if (!d || !r)
  221.      {
  222.         if (throw_exceptions) throw BadQuery("ROW or RES is NULL");
  223.         else return;
  224.      }
  225.      data.clear(); is_nulls.clear(); initialized=true;
  226.      for (unsigned int i=0;i<size();i++)
  227.      {
  228.        string b ;
  229.        (d[i]) ?  b=string(d[i],jj[i]) : b=string("");
  230.        data.insert(data.end(),b);
  231.        is_nulls.insert(is_nulls.end(),d[i] ? false : true);
  232.      }
  233.   }
  234.   
  235.   const Row& self() const {return *this;}
  236.   Row& self() {return *this;}
  237.   const ResUse&  parent() const {return *res;}
  238.   inline size_type     size() const;
  239.   //: Returns the number of columns.
  240.   const ColData   operator [] (int i) const {
  241.   if (!initialized) {
  242. if (throw_exceptions) throw BadQuery("Row not initialized");
  243. else return ColData();
  244. }
  245. return operator[](size_type(i));
  246. }
  247.   inline const ColData   operator [] (size_type i) const;
  248.   //: Returns the value of the field with the index of i.
  249.   inline const ColData   operator [] (const char *) const;
  250.   //: Returns the value of the field with the field name of i.
  251.   // This method is not nearly as efficient as using the index number. Use sparingly.
  252.   inline const ColData   operator [] (const string &i) const;
  253.   //: Returns the value of the field with the field name of i.
  254.   // This method is not nearly as effecent as using the index number. Use sparingly.
  255.   const char *raw_data(int i) const {return data[i].data();}
  256.   operator bool() const {return (data.size()) ? true : false;}
  257.   //: Returns true if there is data in the row.
  258. ~Row() {data.clear(); is_nulls.clear(); initialized = false;}
  259. };
  260. #endif