中间件底层,websocket

CellExecSql.cpp 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include "StdAfx.h"
  2. #include "CellExecSql.h"
  3. #include "IvrFlow.h"
  4. #include "FlowDataProvider.h"
  5. #include "DBInterface.h"
  6. #include <boost\timer.hpp>
  7. #include <iostream>
  8. #include "OtlConn.h"
  9. using namespace std;
  10. IMPLEMENT_CELL_AUTOCREATE(CCellExecSql, CELL_NAME_SQL)
  11. CCellExecSql::CCellExecSql(void)
  12. {
  13. m_IsSaveRs = 0;
  14. m_SuccessPos = 0;
  15. m_FailPos = 0;
  16. m_Sql = "";
  17. m_Connect = "";
  18. }
  19. CCellExecSql::CCellExecSql(CCellExecSql & cellExeSql) : CCellBase(cellExeSql)
  20. {
  21. m_IsSaveRs = cellExeSql.m_IsSaveRs;
  22. m_Connect = cellExeSql.m_Connect;
  23. m_SuccessPos = cellExeSql.m_SuccessPos;
  24. m_FailPos = cellExeSql.m_FailPos;
  25. m_Sql = cellExeSql.m_Sql;
  26. }
  27. CCellExecSql::~CCellExecSql(void)
  28. {
  29. }
  30. /*****************************************************************
  31. **【函数名称】 Operate
  32. **【函数功能】 节点执行函数
  33. **【参数】
  34. **【返回值】 下一个节点编号
  35. ****************************************************************/
  36. int CCellExecSql::operate(void)
  37. {
  38. if (m_pIvrFlow == NULL)
  39. return CELL_OP_ERROR;
  40. CString Info;
  41. _getCellInfo(Info);
  42. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info);
  43. CString SQL;
  44. // 替换SQL语句中的变量
  45. if (!m_pIvrFlow->replaceVar(m_Sql, SQL))
  46. {
  47. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 替换SQL语句中变量失败, SQL = %s"), Info, SQL);
  48. return m_FailPos;
  49. }
  50. // 初始化数据库
  51. CString strErrMessage = _T("");
  52. DataSet& RS = m_pIvrFlow->recordSet();
  53. RS.RemoveAll();
  54. int nRet = CELL_OP_ERROR; // 执行的返回值
  55. boost::timer t; // 2022-05-30 计算sql执行时间
  56. auto pOtlDB = new COtlConn();
  57. std::string strConn = m_Connect.GetBuffer(0);
  58. m_Connect.ReleaseBuffer();
  59. // 解密 判断是否是密文
  60. if (m_Connect.Find("Provider=SQLOLEDB.1") <= -1 && m_Connect.Find("DRIVER") <= -1) {
  61. auto mingwen = Crypto::aes_decrypt_ecb_base64(strConn, (std::uint8_t*)"GHYU80DV3465QSFG", 16);
  62. m_Connect.Format("%s", mingwen.c_str());
  63. }
  64. // 连接数据库
  65. if (m_Connect.Find("Provider=SQLOLEDB.1") > -1 || m_Connect.Find("DRIVER") > -1) {
  66. m_Connect.Replace("Provider=SQLOLEDB.1", "DRIVER={SQL Server}");
  67. m_Connect.Replace("Data Source", "Server");
  68. m_Connect.Replace("User ID", "UID");
  69. m_Connect.Replace("Password", "PWD");
  70. m_Connect.Replace("Initial Catalog", "Database");
  71. }
  72. // 数据源连接方式 dsn/用户名@密码 DSN=middle; UID=root; PWD=800100;
  73. if (pOtlDB->ConnectDataBase(m_Connect, strErrMessage)) {
  74. // 执行SQL 语句
  75. if (pOtlDB->GetRecordSet(SQL, strErrMessage, m_IsSaveRs)) {
  76. nRet = m_SuccessPos;
  77. if (m_IsSaveRs) {
  78. auto it = pOtlDB->GetAllValues(strErrMessage);
  79. if (it.second) {
  80. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]时间[%lf]结束, SQL = %s, 数据库中有记录"), Info, t.elapsed(), SQL);
  81. if (!it.first.empty()) {
  82. auto row = it.first.front();
  83. for (auto cloVal : row) {
  84. RS.AddTail(cloVal);
  85. }
  86. }
  87. else {
  88. auto nField = pOtlDB->GetFields();
  89. for (auto i = 0; i < nField; ++i) {
  90. RS.AddTail("");
  91. }
  92. }
  93. }
  94. else { // 空结果集
  95. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]时间[%lf]结束, SQL = %s, 数据库中无记录"), Info, t.elapsed(), m_Sql);
  96. nRet = m_FailPos;
  97. }
  98. }
  99. else { // 不需要结果
  100. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 执行[%s]时间[%lf]结束, SQL = %s"), Info, t.elapsed(), m_Sql);
  101. //nRet = m_FailPos; 2024-01-11 按照sql是否成功
  102. }
  103. }
  104. else { // SQL执行失败
  105. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]失败, SQL = %s, Error = %s"), Info, m_Sql, strErrMessage);
  106. nRet = m_FailPos;
  107. /*2022-03-30 如果执行失败暂停1秒再次执行*/
  108. bool bIsSuccess = false;
  109. if (SQL.Find("update") >= 0)
  110. {
  111. Sleep(1000);
  112. strErrMessage = "";
  113. auto bResult = pOtlDB->GetRecordSet(SQL, strErrMessage, m_IsSaveRs);
  114. bIsSuccess = bResult;
  115. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 重新执行[%s]%s, SQL = %s, Error = %s"), Info, bResult ? "成功" : "失败", m_Sql, strErrMessage);
  116. }
  117. // SQL 执行失败时,推送到钉钉
  118. if (!bIsSuccess) {
  119. GetDingDing()->PushFailSQL(SQL.GetBuffer(0), strErrMessage.GetBuffer(0));
  120. SQL.ReleaseBuffer();
  121. strErrMessage.ReleaseBuffer();
  122. }
  123. else {
  124. nRet = m_SuccessPos;
  125. }
  126. }
  127. }
  128. else { // sql连接失败
  129. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 连接数据库失败, Error = %s"), Info, strErrMessage);
  130. nRet = m_FailPos;
  131. }
  132. // 2023-03-30 普通指针申请之后要手动释放内存
  133. if (pOtlDB != nullptr) {
  134. delete pOtlDB;
  135. pOtlDB = nullptr;
  136. }
  137. // 返回执行结果
  138. return nRet;
  139. }
  140. /*****************************************************************
  141. **【函数名称】 copy
  142. **【函数功能】 拷贝自身
  143. **【参数】
  144. **【返回值】 拷贝副本
  145. ****************************************************************/
  146. CCellBase * CCellExecSql::copy(void)
  147. {
  148. CCellBase *pCellBase = new CCellExecSql(*this);
  149. return pCellBase;
  150. }
  151. /*****************************************************************
  152. **【函数名称】 fillData
  153. **【函数功能】 节点解析,填充数据
  154. **【参数】 Provider:数据提供器
  155. **【返回值】 成功true,失败false
  156. ****************************************************************/
  157. bool CCellExecSql::fillData(IFlowDataProvider& Provider)
  158. {
  159. CString Data;
  160. do
  161. {
  162. if (!Provider.getData(CELL_ATTRIBUTE_POS, Data))
  163. {
  164. Data = _T("节点号");
  165. break;
  166. }
  167. else
  168. {
  169. sscanf_s(Data, _T("%d"), &m_Pos);
  170. if (m_Pos < 1)
  171. {
  172. Data = _T("节点号");
  173. break;
  174. }
  175. }
  176. if (!Provider.getData(CELL_ATTRIBUTE_CONN_STR, m_Connect))
  177. {
  178. Data = _T("连接字符串");
  179. break;
  180. }
  181. if (!Provider.getData(CELL_ATTRIBUTE_SQL_STR, m_Sql))
  182. {
  183. Data = _T("SQL语句");
  184. break;
  185. }
  186. if (!Provider.getData(CELL_ATTRIBUTE_SAVE_FLAG, Data))
  187. {
  188. Data = _T("保存标志");
  189. break;
  190. }
  191. else
  192. {
  193. if (Data == DATA_BOOL_YES)
  194. m_IsSaveRs = true;
  195. else
  196. m_IsSaveRs = false;
  197. }
  198. if (!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data))
  199. {
  200. Data = _T("成功跳转节点");
  201. break;
  202. }
  203. else
  204. {
  205. sscanf_s(Data, _T("%d"), &m_SuccessPos);
  206. if (m_SuccessPos < 0)
  207. {
  208. Data = _T("成功跳转节点");
  209. break;
  210. }
  211. }
  212. if (!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data))
  213. {
  214. Data = _T("失败跳转节点");
  215. break;
  216. }
  217. else
  218. {
  219. sscanf_s(Data, _T("%d"), &m_FailPos);
  220. if (m_FailPos < 0)
  221. {
  222. Data = _T("失败跳转节点");
  223. break;
  224. }
  225. }
  226. Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note);
  227. return true;
  228. } while (false);
  229. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_SQL, Data);
  230. return false;
  231. }