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

模拟服务器

开发平台:

C/C++

  1. // S3PTableObjList.h: interface for the S3PTableObjList class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_S3PTABLEOBJLIST_H__0F1D2380_72D6_4A8B_8D68_2A937A1748E7__INCLUDED_)
  5. #define AFX_S3PTABLEOBJLIST_H__0F1D2380_72D6_4A8B_8D68_2A937A1748E7__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #pragma warning(disable:4786)
  10. #include "KStdAfx.h"
  11. #include <string>
  12. #include <vector>
  13. #include "S3PRow.h"
  14. #include "S3PResult.h"
  15. #include "S3PTableDAO.h"
  16. #include "S3PDBConnector.h"
  17. #include "S3PDBConnection.h"
  18. #include "regexpr2.h"
  19. using namespace std;
  20. using namespace regex;
  21. template <class T>
  22. class   S3PTableObjList  
  23. {
  24. protected:
  25. BOOL m_bInit;
  26. std::vector<T*> m_list;
  27. std::string m_foreignValue;
  28. std::string m_foreignKey;
  29. std::string m_tableName;
  30. std::string m_orderBy;
  31. public:
  32.  S3PTableObjList(std::string tableName, 
  33. std::string orderBy,
  34. std::string foreignKey,
  35. std::string foreignValue)
  36. {
  37. m_foreignValue = foreignValue;
  38. m_foreignKey   = foreignKey;
  39. m_tableName = tableName;
  40. m_orderBy = orderBy;
  41. if ( Init() > 0 )
  42. {
  43. m_bInit = TRUE;
  44. }
  45. else
  46. {
  47. m_bInit = FALSE;
  48. }
  49. }
  50. virtual ~S3PTableObjList()
  51. {
  52. Clear();
  53. }
  54. virtual int DeleteAll()
  55. {
  56. if (!m_bInit)
  57. {
  58. return 0;
  59. }
  60. std::vector<T*>::iterator i;
  61. for(i=m_list.begin(); i!=m_list.end(); i++)
  62. {
  63. T *pT = (*i);
  64. pT->Delete();
  65. delete pT;
  66. }
  67. m_list.clear();
  68. return 1;
  69. }
  70. virtual int Delete(int idx)
  71. {
  72. if (!m_bInit)
  73. {
  74. return 0;
  75. }
  76. T * pT = m_list[idx];
  77. pT->Delete();
  78. delete pT;
  79. m_list.erase(m_list.begin()+idx);
  80. return 1;
  81. }
  82. virtual int Add(ColumnAndValue & cav)
  83. {
  84. if (!m_bInit)
  85. {
  86. return 0;
  87. }
  88. T *pT = new T();
  89. if (pT)
  90. {
  91. subst_results results;
  92. rpattern pat("^\s*"+ m_foreignKey +"\s*$", NOCASE);
  93. ColumnAndValue::iterator i;
  94. BOOL bFound = FALSE;
  95. for(i=cav.begin(); i!=cav.end() && !bFound; i++)
  96. {
  97. std::string key = i->first;
  98. rpattern_c::backref_type br = pat.match(key, results );
  99. if( br.matched )
  100. {
  101. bFound = TRUE;
  102. cav[key]=m_foreignValue;
  103. }
  104. }
  105. if (!bFound)
  106. {
  107. cav[m_foreignKey] = m_foreignValue;
  108. }
  109. if (pT->Add(cav)>0)
  110. {
  111. m_list.push_back(pT);
  112. }
  113. else
  114. {
  115. delete pT;
  116. return -2;
  117. }
  118. }
  119. else
  120. {
  121. if(pT)
  122. {
  123. delete pT;
  124. }
  125. return -1;
  126. }
  127. return 1;
  128. }
  129. virtual void Clear()
  130. {
  131. std::vector<T*>::iterator i;
  132. for(i=m_list.begin(); i!=m_list.end(); i++)
  133. {
  134. delete (*i);
  135. }
  136. m_list.clear();
  137. }
  138. virtual int Reload()
  139. {
  140. Clear();
  141. if ( Init() > 0 )
  142. {
  143. m_bInit = TRUE;
  144. }
  145. else
  146. {
  147. m_bInit = FALSE;
  148. }
  149. return m_bInit;
  150. }
  151. virtual T * operator [] (int i) const
  152. {
  153. if (!m_bInit)
  154. {
  155. return NULL;
  156. }
  157. return m_list[i];
  158. }
  159. virtual int Size()
  160. {
  161. if (!m_bInit)
  162. {
  163. return 0;
  164. }
  165. return m_list.size();
  166. }
  167. protected:
  168. virtual int Init()
  169. {
  170. S3PDBConnection * pConn = S3PDBConnector::Instance()->ApplyDBConnection(def_ROLEDB);
  171. if (NULL == pConn)
  172. {
  173. return -1;
  174. }
  175. std::string strQuery = "select * from " + m_tableName + " where ";
  176. ColumnAndValue w;
  177. w[m_foreignKey] = m_foreignValue;
  178. S3PRow row(m_tableName, &w, pConn);
  179. std::string strWhere;
  180. if (row.GetExpLikeWhereAnd(strWhere)<=0)
  181. {
  182. pConn->Close();
  183. return -2;
  184. }
  185. strQuery += strWhere + " order by " + m_orderBy;
  186. S3PResult result;
  187. if (S3PTableDAO::Query(pConn, strQuery, result)<=0)
  188. {
  189. pConn->Close();
  190. return -3;
  191. }
  192. for(int i=0; i<result.size(); i++)
  193. {
  194. ColumnAndValue cav = result[i];
  195. T * pT = new T(atoi(cav["iid"].c_str()));
  196. m_list.push_back(pT);
  197. }
  198. pConn->Close();
  199. return 1;
  200. };
  201. };
  202. #endif // !defined(AFX_S3PTABLEOBJLIST_H__0F1D2380_72D6_4A8B_8D68_2A937A1748E7__INCLUDED_)