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

MySQL数据库

开发平台:

Visual C++

  1. #ifndef __manip1_hh__
  2. #define __manip1_hh__
  3. #include <mysql.h>
  4. #include <iostream>
  5. using namespace std;
  6. #include "define_short.h"
  7. #include "sql_string1.hh"
  8. #include "sql_query1.hh"
  9. #include "datetime1.hh"
  10. #include "set1.hh"
  11. //quote manipulaor
  12. extern bool dont_quote_auto;
  13. class SQLQueryParms;
  14. enum quote_type0 {mysql_quote};
  15. struct quote_type1
  16. {
  17.   ostream *ostr;
  18.   quote_type1(ostream *o) : ostr(o) {}
  19. };
  20. inline quote_type1 operator << (ostream &o, quote_type0 esc) {
  21.   return quote_type1(&o);
  22. }
  23. struct quote_type2
  24. {
  25.   SQLQueryParms *qparms;
  26.   quote_type2(SQLQueryParms *p) : qparms(p) {}
  27. };
  28. inline quote_type2 operator << (SQLQueryParms &p, quote_type0 esc)
  29. {
  30.   return quote_type2(&p);
  31. }
  32. SQLQueryParms& operator << (quote_type2 p, SQLString &in);
  33. template <class T>
  34. inline ostream& operator << (quote_type1 o, const T &in)
  35. {
  36.   return *o.ostr << in;
  37. }
  38. ostream& operator << (ostream& o,const mysql_ColData<string>& in);
  39. ostream& operator << (ostream& o, const mysql_ColData<const_string>& in);
  40. SQLQuery& operator << (SQLQuery& o, const mysql_ColData<string>& in);
  41. SQLQuery& operator << (SQLQuery& o, const mysql_ColData<const_string>& in);
  42. // FIX: the implementation of this function is moved to manip.cpp
  43. // to avoid VC++ linker errors
  44. SQLQuery& operator << (SQLQuery& o, const char* txt);
  45. template <class T>
  46. ostream& operator << (quote_type1 o, const string &in) {
  47.   char* s = new char[in.size()*2+1];
  48.   mysql_escape_string(s, const_cast<char *>(in.c_str()), in.size() );
  49.   *o.ostr << "'" << s << "'";
  50.   delete[] s;
  51.   return *o.ostr;
  52. }
  53. template <class T>
  54. ostream& operator << (quote_type1 o, const char* const &in) {
  55.   unsigned int size;
  56.   for (size=0; in[size]; size++);
  57.   char* s = new char[size*2+1];
  58.   mysql_escape_string(s, const_cast<char *>(in), size);
  59.   *o.ostr << "'" << s << "'";
  60.   delete[] s;
  61.   return *o.ostr;
  62. }
  63. template <class T>
  64. ostream& operator << (quote_type1 o, const mysql_ColData<string>& in) {
  65.   return _manip(o,in);
  66. }
  67. template <class T>
  68. ostream& operator << (quote_type1 o, const mysql_ColData<const_string>& in) {
  69.   return _manip(o,in);
  70. }
  71. template <class T>
  72. inline ostream& operator << (quote_type1 o, char* const &in) {
  73.   return operator << (o, const_cast<const char* const &>(in));
  74. }
  75. template <class T>
  76. inline ostream& operator << (quote_type1 o, const Date &in) {
  77.   return *o.ostr << "'" << in << "'";
  78. }
  79. template <class T>
  80. inline ostream& operator << (quote_type1 o, const Time &in) {
  81.   return *o.ostr << "'" << in << "'";
  82. }
  83. template <class T>
  84. inline ostream& operator << (quote_type1 o, const DateTime &in) {
  85.   return *o.ostr << "'" << in << "'";
  86. }
  87. template <class ST>
  88. inline ostream& operator << (quote_type1 o, const MysqlSet<ST> &in) {
  89.   return *o.ostr << "'" << in << "'";
  90. }
  91. // quote only manipulator
  92. enum quote_only_type0 {mysql_quote_only};
  93. struct quote_only_type1 {
  94.   ostream *ostr;
  95.   quote_only_type1(ostream *o) : ostr(o) {}
  96. };
  97. inline quote_only_type1 operator << (ostream &o, quote_only_type0 esc) {
  98.   return quote_only_type1(&o);
  99. }
  100. struct quote_only_type2 {
  101.   SQLQueryParms *qparms;
  102.   quote_only_type2(SQLQueryParms *p) : qparms(p) {}
  103. };
  104. inline quote_only_type2 operator << (SQLQueryParms &p, quote_only_type0 esc) {
  105.   return quote_only_type2(&p);
  106. }
  107. SQLQueryParms & operator << (quote_only_type2 p, SQLString &in);
  108. template <class T>
  109. inline ostream& operator << (quote_only_type1 o, const T &in) {
  110.   return *o.ostr << in;
  111. }
  112. template <class T>
  113. inline ostream& operator << (quote_only_type1 o, const string &in) {
  114.   return *o.ostr << "'" << in << "'";
  115. }
  116. template <class T>
  117. ostream& operator << (quote_only_type1 o, const mysql_ColData<string>& in) {
  118.   if (in.quote_q()) {
  119.     *o.ostr << "'" << in << "'";
  120.   } else {
  121.     *o.ostr << in;
  122.   }
  123.   return *o.ostr;
  124. }
  125. template <class T>
  126. ostream& operator << (quote_only_type1 o, const mysql_ColData<const_string>& in) {
  127.   if (in.quote_q()) {
  128.     *o.ostr << "'" << in << "'";
  129.   } else {
  130.     *o.ostr << in;
  131.   }
  132.   return *o.ostr;
  133. }
  134. template <class T>
  135. inline ostream& operator << (quote_only_type1 o, const Date &in) {
  136.   return *o.ostr << "'" << in << "'";
  137. }
  138. template <class T>
  139. inline ostream& operator << (quote_only_type1 o, const Time &in) {
  140.   return *o.ostr << "'" << in << "'";
  141. }
  142. template <class T>
  143. inline ostream& operator << (quote_only_type1 o, const DateTime &in) {
  144.   return *o.ostr << "'" << in << "'";
  145. }
  146. template <class ST>
  147. inline ostream& operator << (quote_only_type1 o, const MysqlSet<ST> &in) {
  148.   return *o.ostr << "'" << in << "'";
  149. }
  150. // quote double (") only manipulator
  151. enum quote_double_only_type0 {mysql_quote_double_only};
  152. struct quote_double_only_type1 {
  153.   ostream *ostr;
  154.   quote_double_only_type1(ostream *o) : ostr(o) {}
  155. }; 
  156. inline quote_double_only_type1 operator << (ostream &o, 
  157.     quote_double_only_type0 esc) {
  158.   return quote_double_only_type1(&o);
  159. }
  160. struct quote_double_only_type2 {
  161.   SQLQueryParms *qparms;
  162.   quote_double_only_type2(SQLQueryParms *p) : qparms(p) {}
  163. };
  164. inline quote_double_only_type2 operator << (SQLQueryParms &p, 
  165.      quote_double_only_type0 esc) {
  166.   return quote_double_only_type2(&p);
  167. }
  168. SQLQueryParms & operator << (quote_double_only_type2 p, SQLString &in);
  169. template <class T>
  170. inline ostream& operator << (quote_double_only_type1 o, const T &in) {
  171.   return *o.ostr << in;
  172. }
  173. template <class T>
  174. inline ostream& operator << (quote_double_only_type1 o, const string &in) {
  175.   return *o.ostr << """ << in << """;
  176. }
  177. template <class T>
  178. ostream& operator << (quote_double_only_type1 o, const mysql_ColData<string>& in) {
  179.   if (in.quote_q()) {
  180.     *o.ostr << "'" << in << "'";
  181.   } else {
  182.     *o.ostr << in;
  183.   }
  184.   return *o.ostr;
  185. }
  186. template <class T>
  187. ostream& operator << (quote_double_only_type1 o, const mysql_ColData<const_string>& in) {
  188.   if (in.quote_q()) {
  189.     *o.ostr << "'" << in << "'";
  190.   } else {
  191.     *o.ostr << in;
  192.   }
  193.   return *o.ostr;
  194. }
  195. template <class T>
  196. inline ostream& operator << (quote_double_only_type1 o, const Date &in) {
  197.   return *o.ostr << """ << in << """;
  198. }
  199. template <class T>
  200. inline ostream& operator << (quote_double_only_type1 o, const Time &in) {
  201.   return *o.ostr << """ << in << """;
  202. }
  203. template <class T>
  204. inline ostream& operator << (quote_double_only_type1 o, 
  205.      const DateTime &in) {
  206.   return *o.ostr << """ << in << """;
  207. }
  208. template <class ST>
  209. inline ostream& operator << (quote_double_only_type1 o, 
  210.      const MysqlSet<ST> &in) {
  211.   return *o.ostr << """ << in << """;
  212. }
  213. // escape manipulator
  214. enum escape_type0 {mysql_escape};
  215. struct escape_type1 {
  216.   ostream *ostr;
  217.   escape_type1(ostream *o) : ostr(o) {}
  218. }; 
  219. inline escape_type1 operator << (ostream &o, escape_type0 esc) {
  220.   return escape_type1(&o);
  221. }
  222. struct escape_type2 {
  223.   SQLQueryParms *qparms;
  224.   escape_type2(SQLQueryParms *p) : qparms(p) {}
  225. };
  226. inline escape_type2 operator << (SQLQueryParms &p, escape_type0 esc) {
  227.   return escape_type2(&p);
  228. }
  229. SQLQueryParms & operator << (escape_type2 p, SQLString &in);
  230. template <class T>
  231. inline ostream& operator << (escape_type1 o, const T &in) {
  232.   return *o.ostr << in;
  233. }
  234. template <class T>
  235. ostream& operator << (escape_type1 o, const string &in) {
  236.   char* s = new char[in.size()*2+1];
  237.   mysql_escape_string(s, const_cast<char *>(in.c_str()), in.size());
  238.   *o.ostr << s;
  239.   delete[] s;
  240.   return *o.ostr;
  241. }
  242. template <class T>
  243. ostream& operator << (escape_type1 o, const char* const &in) {
  244.   unsigned int size;
  245.   for (size=0; in[size]; size++);
  246.   char* s = new char[size*2+1];
  247.   mysql_escape_string(s, const_cast<char *>(in), size);
  248.   *o.ostr << s;
  249.   delete[] s; 
  250.   return *o.ostr;
  251. }
  252. template <class T>
  253. ostream& operator << (escape_type1 o, const mysql_ColData<string>& in) {
  254.   return _manip(o,in);
  255. }
  256. template <class T>
  257. ostream& operator << (escape_type1 o, const mysql_ColData<const_string>& in) {
  258.   return _manip(o,in);
  259. }
  260. template <class T>
  261. inline ostream& operator << (escape_type1 o, char* const &in) {
  262.   return operator << (o, const_cast<const char* const &>(in));
  263. }
  264. //do nothing manipulator
  265. enum do_nothing_type0 {mysql_do_nothing};
  266. struct do_nothing_type1 {
  267.   ostream *ostr;
  268.   do_nothing_type1(ostream *o) : ostr(o) {}
  269. }; 
  270. inline do_nothing_type1 operator << (ostream &o, do_nothing_type0 esc) {
  271.   return do_nothing_type1(&o);
  272. }
  273. template <class T>
  274. inline ostream& operator << (do_nothing_type1 o, const T &in) {
  275.   return *o.ostr << in;
  276. }
  277. struct do_nothing_type2 {
  278.   SQLQueryParms *qparms;
  279.   do_nothing_type2(SQLQueryParms *p) : qparms(p) {}
  280. };
  281. inline do_nothing_type2 operator << (SQLQueryParms &p, do_nothing_type0 esc) {
  282.   return do_nothing_type2(&p);
  283. }
  284. inline SQLQueryParms & operator << (do_nothing_type2 p, SQLString &in) {
  285.   in.processed = true;
  286.   return *p.qparms << in;
  287. }
  288. enum ignore_type0 {mysql_ignore};
  289. struct ignore_type2 {
  290.   SQLQueryParms *qparms;
  291.   ignore_type2(SQLQueryParms *p) : qparms(p) {}
  292. };
  293. inline ignore_type2 operator << (SQLQueryParms &p, ignore_type0 esc) {
  294.   return ignore_type2(&p);
  295. }
  296. inline SQLQueryParms & operator << (ignore_type2 p, SQLString &in) {
  297.   return *p.qparms << in;
  298. }
  299. #endif