my_request.cc 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. /*
  2. * Copyright [2022] JD.com, Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "../log/log.h"
  17. #include "my_request.h"
  18. #include "my_command.h"
  19. #include "../config/config.h"
  20. using namespace hsql;
  21. extern DTCConfig *g_dtc_config;
  22. bool MyRequest::do_mysql_protocol_parse()
  23. {
  24. char *p = this->raw;
  25. if (p == NULL || this->raw_len < MYSQL_HEADER_SIZE) {
  26. log4cplus_error("receive size small than package header.");
  27. return false;
  28. }
  29. int input_packet_length = uint_trans_3(p);
  30. log4cplus_debug("uint_trans_3:0x%x 0x%x 0x%x, len:%d", p[0], p[1], p[2],
  31. input_packet_length);
  32. p += 3;
  33. this->pkt_nr = (uint8_t)(*p); // mysql sequence id
  34. p++;
  35. log4cplus_debug("pkt_nr:%d, packet len:%d", this->pkt_nr,
  36. input_packet_length);
  37. if (sizeof(MYSQL_HEADER_SIZE) + input_packet_length > raw_len) {
  38. log4cplus_error(
  39. "mysql header len %d is different with actual len %d.",
  40. input_packet_length, raw_len);
  41. return false;
  42. }
  43. enum enum_server_command cmd = (enum enum_server_command)(uchar)p[0];
  44. if (cmd != COM_QUERY) {
  45. log4cplus_error("cmd type error:%d", cmd);
  46. return false;
  47. }
  48. input_packet_length --;
  49. p++;
  50. int count = 0;
  51. if (*p == 0x0) {
  52. p++;
  53. input_packet_length--;
  54. count++;
  55. }
  56. if (*p == 0x01) {
  57. p++;
  58. input_packet_length--;
  59. count++;
  60. }
  61. if(count == 2)
  62. {
  63. log4cplus_debug("new version query request.");
  64. eof_packet_new = true;
  65. }
  66. m_sql.assign(p, input_packet_length);
  67. log4cplus_debug("sql: \"%s\"", m_sql.c_str());
  68. return true;
  69. }
  70. bool MyRequest::load_sql()
  71. {
  72. log4cplus_debug("load_sql entry.");
  73. if (!check_packet_info())
  74. return false;
  75. if (!do_mysql_protocol_parse())
  76. return false;
  77. if ((m_sql.find("insert into") != string::npos ||
  78. m_sql.find("INSERT INTO") != string::npos) &&
  79. (m_sql.find(" where ") != string::npos ||
  80. m_sql.find(" WHERE ") != string::npos)) {
  81. m_sql = m_sql.substr(0, m_sql.find(" where "));
  82. m_sql = m_sql.substr(0, m_sql.find(" WHERE "));
  83. }
  84. log4cplus_debug("sql: %s", m_sql.c_str());
  85. hsql::SQLParser::parse(m_sql, &m_result);
  86. if (m_result.isValid()) {
  87. log4cplus_debug("load_sql success.");
  88. return true;
  89. } else {
  90. log4cplus_error("%s (Line %d:%d)", m_result.errorMsg(),
  91. m_result.errorLine(), m_result.errorColumn());
  92. return false;
  93. }
  94. //check statement size.
  95. if (m_result.size() != 1)
  96. return false;
  97. return false;
  98. }
  99. bool MyRequest::check_packet_info()
  100. {
  101. if (this->raw == NULL || this->raw_len <= 0) {
  102. log4cplus_error(
  103. "check packet info error:%p %d, set packet info first please",
  104. this->raw, this->raw_len);
  105. return false;
  106. } else
  107. return true;
  108. }
  109. hsql::Expr* find_node(hsql::Expr* node, char* key_name)
  110. {
  111. if(!node)
  112. return NULL;
  113. if (node->type == kExprOperator && node->opType == kOpAnd)
  114. {
  115. hsql::Expr* t1 = find_node(node->expr, key_name);
  116. if(t1)
  117. return t1;
  118. hsql::Expr* t2 = find_node(node->expr2, key_name);
  119. if(t2)
  120. return t2;
  121. }
  122. else if(node->type == kExprOperator && node->opType == kOpEquals)
  123. {
  124. if(strcmp(node->expr->name, key_name) == 0)
  125. {
  126. return node->expr2;
  127. }
  128. }
  129. return NULL;
  130. }
  131. bool MyRequest::get_key(DTCValue *key, char *key_name)
  132. {
  133. hsql::Expr *where = NULL;
  134. int t = m_result.getStatement(0)->type();
  135. if (hsql::StatementType::kStmtInsert == t) {
  136. hsql::InsertStatement *stmt = get_result()->getStatement(0);
  137. if(stmt->columns == NULL)
  138. {
  139. int i = 0;
  140. switch (stmt->values->at(i)->type) {
  141. case hsql::ExprType::kExprLiteralInt:
  142. *key = DTCValue::Make(
  143. stmt->values->at(i)->ival);
  144. return true;
  145. case hsql::ExprType::kExprLiteralFloat:
  146. *key = DTCValue::Make(
  147. stmt->values->at(i)->fval);
  148. return true;
  149. case hsql::ExprType::kExprLiteralString:
  150. *key = DTCValue::Make(
  151. stmt->values->at(i)->name);
  152. return true;
  153. default:
  154. return false;
  155. }
  156. }
  157. else
  158. {
  159. for (int i = 0; i < stmt->columns->size(); i++)
  160. {
  161. if (strcmp(stmt->columns->at(i), key_name) == 0) {
  162. switch (stmt->values->at(i)->type) {
  163. case hsql::ExprType::kExprLiteralInt:
  164. *key = DTCValue::Make(
  165. stmt->values->at(i)->ival);
  166. return true;
  167. case hsql::ExprType::kExprLiteralFloat:
  168. *key = DTCValue::Make(
  169. stmt->values->at(i)->fval);
  170. return true;
  171. case hsql::ExprType::kExprLiteralString:
  172. *key = DTCValue::Make(
  173. stmt->values->at(i)->name);
  174. return true;
  175. default:
  176. return false;
  177. }
  178. }
  179. }
  180. }
  181. } else {
  182. if (hsql::StatementType::kStmtUpdate == t) {
  183. hsql::UpdateStatement *stmt =
  184. get_result()->getStatement(0);
  185. where = stmt->where;
  186. } else if (hsql::StatementType::kStmtSelect == t) {
  187. hsql::SelectStatement *stmt =
  188. get_result()->getStatement(0);
  189. where = stmt->whereClause;
  190. } else if (hsql::StatementType::kStmtDelete == t) {
  191. hsql::DeleteStatement *stmt =
  192. get_result()->getStatement(0);
  193. where = stmt->expr;
  194. }
  195. if (!where)
  196. return false;
  197. hsql::Expr* node = find_node(where, key_name);
  198. if(node)
  199. {
  200. switch (node->type)
  201. {
  202. case hsql::ExprType::kExprLiteralInt:
  203. *key = DTCValue::Make(
  204. node->ival);
  205. return true;
  206. case hsql::ExprType::kExprLiteralFloat:
  207. *key = DTCValue::Make(
  208. node->fval);
  209. return true;
  210. case hsql::ExprType::kExprLiteralString:
  211. *key = DTCValue::Make(
  212. node->name);
  213. return true;
  214. default:
  215. return false;
  216. }
  217. }
  218. }
  219. return false;
  220. }
  221. uint32_t MyRequest::get_limit_start()
  222. {
  223. int t = m_result.getStatement(0)->type();
  224. if (t != hsql::StatementType::kStmtSelect) {
  225. return 0;
  226. }
  227. hsql::SelectStatement *stmt = get_result()->getStatement(0);
  228. LimitDescription* limit = stmt->limit;
  229. if(limit)
  230. {
  231. if(limit->offset)
  232. {
  233. int val = limit->offset->ival;
  234. log4cplus_debug("limit- offset: %d", val);
  235. if(val >= 0)
  236. return val;
  237. }
  238. }
  239. return 0;
  240. }
  241. uint32_t MyRequest::get_limit_count()
  242. {
  243. int t = m_result.getStatement(0)->type();
  244. if (t != hsql::StatementType::kStmtSelect) {
  245. return 0;
  246. }
  247. hsql::SelectStatement *stmt = get_result()->getStatement(0);
  248. LimitDescription* limit = stmt->limit;
  249. if(limit)
  250. {
  251. if(limit->limit)
  252. {
  253. int val = limit->limit->ival;
  254. log4cplus_debug("limit- limit: %d", val);
  255. if(val >= 0)
  256. return val;
  257. }
  258. }
  259. return 0;
  260. }
  261. uint32_t MyRequest::get_need_num_fields()
  262. {
  263. int t = m_result.getStatement(0)->type();
  264. if (t != hsql::StatementType::kStmtSelect) {
  265. return 0;
  266. }
  267. hsql::SelectStatement *stmt = get_result()->getStatement(0);
  268. std::vector<hsql::Expr *> *selectList = stmt->selectList;
  269. log4cplus_debug("select size:%d", selectList->size());
  270. if(selectList->size() == 1 && (*selectList)[0]->type == kExprStar)
  271. return g_dtc_config->get_config_node()["primary"]["cache"]["field"].size();
  272. else
  273. return selectList->size();
  274. }
  275. uint32_t MyRequest::get_update_num_fields()
  276. {
  277. int t = m_result.getStatement(0)->type();
  278. if (hsql::StatementType::kStmtUpdate == t) {
  279. hsql::UpdateStatement *stmt = get_result()->getStatement(0);
  280. return stmt->updates->size();
  281. } else if (hsql::StatementType::kStmtInsert == t) {
  282. hsql::InsertStatement *stmt = get_result()->getStatement(0);
  283. return stmt->values->size();
  284. }
  285. return 0;
  286. }
  287. std::vector<std::string> MyRequest::get_need_array()
  288. {
  289. std::vector<std::string> need;
  290. int t = m_result.getStatement(0)->type();
  291. if (t != hsql::StatementType::kStmtSelect) {
  292. log4cplus_error("need array type: %d", t);
  293. return need;
  294. }
  295. hsql::SelectStatement *stmt = get_result()->getStatement(0);
  296. std::vector<hsql::Expr *> *selectList = stmt->selectList;
  297. if(selectList->size() == 1 && (*selectList)[0]->type == kExprStar)
  298. {
  299. int num = g_dtc_config->get_config_node()["primary"]["cache"]["field"].size();
  300. for(int i = 0; i < num; i++)
  301. {
  302. need.push_back(g_dtc_config->get_config_node()["primary"]["cache"]["field"][i]["name"].as<std::string>());
  303. }
  304. }
  305. else
  306. {
  307. for (int i = 0; i < stmt->selectList->size(); i++) {
  308. need.push_back(stmt->selectList->at(i)->getName());
  309. }
  310. }
  311. return need;
  312. }
  313. char* MyRequest::get_table_name()
  314. {
  315. if (m_result.size() < 1)
  316. return NULL;
  317. int t = m_result.getStatement(0)->type();
  318. if (hsql::StatementType::kStmtInsert == t) {
  319. hsql::InsertStatement *stmt = get_result()->getStatement(0);
  320. if(stmt && stmt->tableName)
  321. return stmt->tableName;
  322. } else {
  323. if (hsql::StatementType::kStmtUpdate == t) {
  324. hsql::UpdateStatement *stmt =
  325. get_result()->getStatement(0);
  326. if(stmt && stmt->table)
  327. return stmt->table->name;
  328. } else if (hsql::StatementType::kStmtSelect == t) {
  329. hsql::SelectStatement *stmt =
  330. get_result()->getStatement(0);
  331. if(stmt && stmt->fromTable)
  332. return stmt->fromTable->name;
  333. } else if (hsql::StatementType::kStmtDelete == t) {
  334. hsql::DeleteStatement *stmt =
  335. get_result()->getStatement(0);
  336. if(stmt)
  337. return stmt->tableName;
  338. }
  339. }
  340. return NULL;
  341. }