S3PRow.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:5k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /**************************************************/
  2. /*                                                */
  3. /*  文件名:    S3PRow.cpp                         */
  4. /*  描述    :  它接受一个hash表作为每个行的数据, */
  5. /*             协助S3PTableDAO生成sql语句         */
  6. /*                                                */
  7. /* 作者  : Liu Wansong                        */
  8. /* 创建日期 : 8/22/2002                          */
  9. /*  修改日期 : 8/26/2002                          */
  10. /**************************************************/
  11. #include "S3PRow.h"
  12. #include "S3PDBConnection.h"
  13. #include "regexpr2.h"
  14. #include "S3PTableInfoCatch.h"
  15. using namespace std;
  16. using namespace regex;
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. S3PRow::S3PRow(const std::string & tableName, ColumnAndValue * pCAV, S3PDBConnection * pConn)
  21. {
  22. m_tableName = tableName;
  23. m_pCAV = pCAV;
  24. m_pConn = pConn;
  25. Init();
  26. }
  27. S3PRow::~S3PRow()
  28. {
  29. m_pCAV = NULL;
  30. m_pConn = NULL;
  31. }
  32. int S3PRow::GetExpLikeInsert(std::string & exp)
  33. {
  34. if (NULL == m_pCAV)
  35. {
  36. return -1;
  37. }
  38. std::string keys;
  39. std::string values;
  40. ColumnAndValue::iterator i;
  41. for(i=m_pCAV->begin(); i!=m_pCAV->end(); i++)
  42. {
  43. std::string key   = i->first;
  44. std::string value = i->second;
  45. keys += key + ",";
  46. std::string value_q = "";
  47. if ( FixValue(key, value, value_q) > 0 )
  48. {
  49. values += value_q + ",";
  50. }
  51. else
  52. {
  53. // 错误,不能修正字段的值
  54. return -2;
  55. }
  56. }
  57. subst_results results;
  58. rpattern pat(",$", "");
  59. pat.substitute(keys, results );
  60. pat.substitute(values, results);
  61. exp = "(" + keys + ") values(" + values + ")";
  62. return 1;
  63. }
  64. int S3PRow::FixValue(const std::string & key, const std::string & value, std::string & outValue)
  65. {
  66. if (NULL == m_columnInfoMap)
  67. return -1;
  68. BOOL bFound = FALSE;
  69. std::string strType = "";
  70. outValue = value;
  71. std::map<string,string>::iterator i;
  72. for(i=m_columnInfoMap->begin(); i!=m_columnInfoMap->end(); i++)
  73. {
  74. std::string strKey = i->first;
  75. match_results results;
  76. rpattern pat("^\s*" + key + "\s*$", NOCASE);
  77. match_results::backref_type br = pat.match( strKey, results );
  78. if ( br.matched )
  79. {
  80. bFound = TRUE;
  81. strType = i->second;
  82. break;
  83. }
  84. }
  85. if ( !bFound )
  86. {
  87. //这个表中没有这个字段
  88. return -1;
  89. }
  90. if ( IsNeedQuote(strType) )
  91. {
  92. if ( Quote(value, outValue) <= 0 )
  93. {
  94. //给数据去掉敏感字符时出错
  95. return -2;
  96. }
  97. }
  98. return 1;
  99. }
  100. int S3PRow::Quote(const std::string &value, std::string &outValue)
  101. {
  102. outValue = value;
  103. subst_results results;
  104. rpattern pat("'", "''", GLOBAL);
  105. pat.substitute(outValue, results );
  106. outValue = "'" + outValue + "'";
  107. return 1;
  108. }
  109. BOOL S3PRow::IsNeedQuote(const std::string &column)
  110. {
  111. match_results results;
  112.     rpattern pat("^\s*(bigint|decimal|double|enum|float|int|mediumint|numeric|real|set|smallint|tinyint)",NOCASE);
  113.     match_results::backref_type br = pat.match( column, results );
  114.     if( br.matched )
  115. {
  116. return FALSE;
  117.     }
  118. return TRUE;
  119. }
  120. BOOL S3PRow::Init()
  121. {
  122. if (NULL == m_pCAV)
  123. return FALSE;
  124. if (NULL == m_pConn)
  125. return FALSE;
  126. m_columnInfoMap = 
  127. S3PTableInfoCatch::Instance()->GetColumnInfo(m_tableName, m_pConn);
  128. if (NULL == m_columnInfoMap)
  129. return FALSE;
  130. return TRUE;
  131. }
  132. int S3PRow::GetExpLikeUpdate(std::string &exp)
  133. {
  134. if (NULL == m_pCAV)
  135. {
  136. return -1;
  137. }
  138. ColumnAndValue::iterator i;
  139. for(i=m_pCAV->begin(); i!=m_pCAV->end(); i++)
  140. {
  141. std::string key   = i->first;
  142. std::string value = i->second;
  143. exp += key + "=";
  144. std::string value_q = "";
  145. if ( FixValue(key, value, value_q) > 0 )
  146. {
  147. exp += value_q + ",";
  148. }
  149. else
  150. {
  151. // 错误,不能修正字段的值
  152. return -1;
  153. }
  154. }
  155. subst_results results;
  156. rpattern pat(",$", "");
  157. pat.substitute(exp, results );
  158. return 1;
  159. }
  160. int S3PRow::GetExpLikeWhereAnd(std::string &exp)
  161. {
  162. if (NULL == m_pCAV)
  163. {
  164. return -1;
  165. }
  166. ColumnAndValue::iterator i;
  167. for(i=m_pCAV->begin(); i!=m_pCAV->end(); i++)
  168. {
  169. std::string key   = i->first;
  170. std::string value = i->second;
  171. exp += key + "=";
  172. std::string value_q = "";
  173. if ( FixValue(key, value, value_q) > 0 )
  174. {
  175. exp += value_q + " and ";
  176. }
  177. else
  178. {
  179. // 错误,不能修正字段的值
  180. return -1;
  181. }
  182. }
  183. subst_results results;
  184. rpattern pat("and\s*$", "");
  185. pat.substitute(exp, results );
  186. return 1;
  187. }
  188. int S3PRow::GetExpLikeInsertKey(std::string &exp)
  189. {
  190. if (NULL == m_pCAV)
  191. {
  192. return -1;
  193. }
  194. std::string keys;
  195. ColumnAndValue::iterator i;
  196. for(i=m_pCAV->begin(); i!=m_pCAV->end(); i++)
  197. {
  198. std::string key   = i->first;
  199. keys += key + ",";
  200. }
  201. subst_results results;
  202. rpattern pat(",$", "");
  203. pat.substitute(keys, results );
  204. exp = "(" + keys + ")";
  205. return 1;
  206. }
  207. int S3PRow::GetExpLikeInsertValue(std::string &exp)
  208. {
  209. if (NULL == m_pCAV)
  210. {
  211. return -1;
  212. }
  213. std::string values;
  214. ColumnAndValue::iterator i;
  215. for(i=m_pCAV->begin(); i!=m_pCAV->end(); i++)
  216. {
  217. std::string key   = i->first;
  218. std::string value = i->second;
  219. std::string value_q = "";
  220. if ( FixValue(key, value, value_q) > 0 )
  221. {
  222. values += value_q + ",";
  223. }
  224. else
  225. {
  226. // 错误,不能修正字段的值
  227. return -2;
  228. }
  229. }
  230. subst_results results;
  231. rpattern pat(",$", "");
  232. pat.substitute(values, results);
  233. exp = "(" + values + ")";
  234. return 1;
  235. }