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

MySQL数据库

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include "sql_query3.hh"
  3. SQLQuery::SQLQuery(const SQLQuery &q) {
  4.   *this << q.str();
  5.   Success = q.Success;
  6.   def = q.def;
  7. }
  8. SQLQuery& SQLQuery::operator = (const SQLQuery &q) {
  9.   reset();
  10.   *this << q.str();
  11.   Success = q.Success;
  12.   def = q.def;
  13.   return *this;
  14. }
  15. void SQLQuery::reset() {
  16.   seekg (0L,ios::beg);
  17.   seekp (0L,ios::beg);
  18.   parsed.erase(parsed.begin(), parsed.end());
  19.   def.clear(); clear();
  20. }
  21. char * SQLQuery::preview_char() {
  22.   *this << ends;
  23. #ifdef __USLC__
  24.   strstreambuf *tmpbuf = rdbuf();
  25.   uint length = tmpbuf->pcount();
  26. #else
  27.   uint length = pcount();
  28. #endif
  29.   char *s = new char[length+1]; 
  30.   get(s, length, ''); 
  31.   seekg (0,ios::beg);
  32.   seekp (-1,ios::cur);
  33.   return s;
  34. }
  35. SQLString * pprepare (char option, SQLString &S, bool replace = true) {
  36.   if (S.processed) return &S;
  37.   if (option == 'r' || (option == 'q' && S.is_string)) {
  38.     char *s = new char[S.size()*2 + 1];
  39.     mysql_escape_string(s,const_cast<char *>(S.c_str()),S.size());
  40.     SQLString *ss = new SQLString("'");
  41.     *ss += s;
  42.     *ss += "'";
  43.     delete[] s;
  44.     if (replace) {S = *ss; S.processed = true; return &S;}
  45.     return ss;
  46.   } else if (option == 'R' || (option == 'Q' && S.is_string)) {
  47.     SQLString *ss = new SQLString("'" + S + "'");
  48.     if (replace) {S = *ss; S.processed = true; return &S;}
  49.     return ss;
  50.   } else {
  51.     if (replace) S.processed = true;
  52.     return &S;
  53.   }
  54. }
  55. void SQLQuery::proc(SQLQueryParms& p) {
  56.   seekg (0,ios::beg);
  57.   seekp (0,ios::beg);
  58.   char      num;
  59.   SQLString *ss;
  60.   SQLQueryParms *c;
  61.   for (vector<SQLParseElement>::iterator i = parsed.begin();
  62.        i != parsed.end(); i++) {
  63.     *this << i->before;
  64.     num    = i->num;
  65.     if (num == -1) {
  66.       // do nothing
  67.     } else {
  68.       if (num < (int)p.size()) c = &p;
  69.       else if (num < (int)def.size()) c = &def;
  70.       else {
  71. *this << " ERROR";
  72. throw SQLQueryNEParms("Not enough parameters to fill the template.");
  73.       }
  74.       ss = pprepare(i->option, (*c)[num], c->bound());
  75.       *this << *ss;
  76.       if (ss != &(*c)[num]) delete ss;
  77.     }
  78.   }
  79. }
  80. //---------------------------------------------------------------
  81. string SQLQuery::str(const SQLQueryParms &p) const
  82. {
  83.   SQLQuery *const_this = const_cast<SQLQuery *>(this);
  84.   if (!parsed.empty()) const_this->proc(const_cast<SQLQueryParms&>(p));
  85.   *const_this << ends;
  86.   strstreambuf *tmpbuf = const_this->rdbuf();
  87.   uint length = tmpbuf->pcount() + 1;
  88.   char *s = new char[length];
  89.   const_this->get(s, length, '');
  90.   const_this->seekg (0,ios::beg);
  91.   const_this->seekp (-1,ios::cur);
  92.   
  93.   // FIX: work-around for memory leak; make temporary string, copy s in it,
  94.   // free s and return the temporary string
  95.   string tmpstr(s);
  96.   delete[] s;
  97.   return tmpstr;
  98. }
  99. //-------------------------------------------------------------
  100. string SQLQuery::str(const SQLQueryParms &p, query_reset r)
  101. {
  102.   string tmp = str(p);
  103.   if (r==RESET_QUERY) reset();
  104.   return tmp;
  105. }
  106. SQLQueryParms SQLQueryParms::operator + (const SQLQueryParms &other) const {
  107.   if (other.size() <= size()) return *this;
  108.   SQLQueryParms New = *this;
  109.   unsigned int i;
  110.   for(i = size(); i < other.size(); i++) {
  111.     New.push_back(other[i]);
  112.   }
  113.   return New;
  114. }
  115. void SQLQuery::parse() {
  116.   string str = "";
  117.   char num[3];
  118.   long int n;
  119.   char option;
  120.   string name;
  121.   char *s, *s0;
  122.   s0 = s = preview_char();
  123.   while (*s) {
  124.     if (*s == '%') {
  125.       s++;
  126.       if (*s == '%') {
  127. str += *s++;
  128.       } else if (*s >= '0' && *s <= '9') {
  129. num[0] = *s;
  130. s++;
  131. if (*s >= '0' && *s <= '9') {
  132.   num[1] = *s;
  133.   num[2] = 0;
  134.           s++;
  135. } else {
  136.   num[1] = 0;
  137. }
  138.         n = strtol(num,NULL,10);
  139.         option = ' ';
  140.         if (*s == 'q' || *s == 'Q' || *s == 'r' || *s == 'R')
  141.   option = *s++;
  142. if (*s == ':') {
  143.   s++;
  144.   for (;(*s>='A' && *s<='Z') || *s=='_' || (*s>='a' && *s<='z'); s++) {
  145.     name += *s;
  146.   }
  147.   if (*s == ':') s++;
  148.           if (n >= (long int)parsed_names.size())
  149.     parsed_names.insert(parsed_names.end(),
  150. (vector<string>::size_type)(n+1)
  151. - parsed_names.size(), string());
  152.   parsed_names[n] = name;
  153.   parsed_nums[name] = n;
  154. }
  155. parsed.push_back( SQLParseElement(str,option,n) );
  156. str = "";
  157. name = "";
  158.       } else {
  159. str += '%';
  160.       }
  161.     } else {
  162.       str += *s++;
  163.     }
  164.   }
  165.   parsed.push_back( SQLParseElement(str,' ',-1) );
  166.   delete[] s0;
  167. }