ModuleSQL.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include "ModuleSQL.h"
  2. #include <boost/algorithm/string.hpp>
  3. namespace mdd {
  4. void ModuleSQL::erase_keyword(std::string& str, std::string key) {
  5. while (true) {
  6. int start = (int)str.find(key);
  7. if (start != -1) {
  8. str.erase(start, key.length());
  9. }
  10. else {
  11. return;
  12. }
  13. }
  14. }
  15. ModuleSQL::ModuleSQL(std::string dbname) {
  16. int rc = sqlite3_open(dbname.c_str(), &_db);
  17. if (rc) {
  18. fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(_db));
  19. return;
  20. }
  21. else {
  22. fprintf(stderr, "Opened database successfully\n");
  23. }
  24. std::string sql;
  25. sqlite3_stmt* res;
  26. int step;
  27. /* Create SQL statement */
  28. sql = "SELECT tbl_name "\
  29. "FROM sqlite_master "\
  30. "WHERE type = 'table' ";
  31. /* Execute SQL statement */
  32. rc = sqlite3_prepare_v2(_db, sql.c_str(), -1, &res, 0);
  33. if (rc != SQLITE_OK) {
  34. fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(_db));
  35. sqlite3_close(_db);
  36. }
  37. else {
  38. fprintf(stdout, "Operation done successfully\n");
  39. }
  40. step = sqlite3_step(res);
  41. if (step == SQLITE_ROW) {
  42. int nCol = sqlite3_column_count(res);
  43. for (size_t i = 0; i < nCol; i++)
  44. {
  45. _tbname = (char*)sqlite3_column_text(res, i);
  46. }
  47. }
  48. sqlite3_finalize(res);
  49. /* Create SQL statement */
  50. sql = "SELECT sql "\
  51. "FROM sqlite_master "\
  52. "WHERE type = 'table' AND tbl_name = '" + _tbname + "'";
  53. //std::cout << sql << std::endl;
  54. /* Execute SQL statement */
  55. rc = sqlite3_prepare_v2(_db, sql.c_str(), -1, &res, 0);
  56. if (rc != SQLITE_OK) {
  57. fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(_db));
  58. sqlite3_close(_db);
  59. }
  60. else {
  61. fprintf(stdout, "Operation done successfully\n");
  62. }
  63. step = sqlite3_step(res);
  64. if (step == SQLITE_ROW) {
  65. std::string sql_res = (char*)sqlite3_column_text(res, 0);
  66. int start = sql_res.find("(");
  67. int end = sql_res.find(")");
  68. sql_res = sql_res.substr(++start, (size_t)(--end) - start);
  69. erase_keyword(sql_res, "KEY");
  70. erase_keyword(sql_res, "PRIMARY");
  71. erase_keyword(sql_res, "AUTOINCREMENT");
  72. erase_keyword(sql_res, "NOT NULL");
  73. std::string::iterator new_end = std::unique(sql_res.begin(), sql_res.end(), [](char lhs, char rhs)->bool { return (lhs == rhs) && (lhs == ' '); });
  74. sql_res.erase(new_end, sql_res.end());
  75. _content.clear();
  76. while(true){
  77. end = sql_res.find(" ,");
  78. if (end == -1)
  79. {
  80. end = sql_res.length();
  81. }
  82. std::string sub_str = sql_res.substr(0, end);
  83. int mid = sub_str.find(" ");
  84. _entity enti;
  85. enti.key = sub_str.substr(0, mid);
  86. enti.type = sub_str.substr(mid + 1, sub_str.length() - (mid + 1));
  87. _content.push_back(enti);
  88. //std::cout << "'" << enti.key << "': '" << enti.type << "'\n";
  89. if (end != sql_res.length())
  90. {
  91. sql_res.erase(0, end + 2);
  92. }
  93. else {
  94. break;
  95. }
  96. }
  97. }
  98. sqlite3_finalize(res);
  99. json default_val;
  100. default_val["value"] = 1;
  101. addInput(_content[0].key, default_val);
  102. for (auto& cont :_content)
  103. {
  104. addOutput(cont.key, default_val);
  105. }
  106. setType("SQL");
  107. }
  108. bool ModuleSQL::update() {
  109. int rc;
  110. std::string sql;
  111. sqlite3_stmt* res;
  112. int step;
  113. /* Create SQL statement */
  114. sql = "SELECT * "\
  115. "FROM " + _tbname + " "\
  116. "WHERE " + _content[0].key + " = " + getInput(0)->getValue()["value"].dump();
  117. std::cout << sql << std::endl;
  118. /* Execute SQL statement */
  119. rc = sqlite3_prepare_v2(_db, sql.c_str(), -1, &res, 0);
  120. if (rc != SQLITE_OK) {
  121. fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(_db));
  122. sqlite3_close(_db);
  123. }
  124. else {
  125. fprintf(stdout, "Operation done successfully\n");
  126. }
  127. step = sqlite3_step(res);
  128. bool state = false;
  129. json ret;
  130. if (step == SQLITE_ROW) {
  131. int nCol = sqlite3_column_count(res);
  132. std::string parse_str = "{\"" + _tbname + "\" : {";
  133. for (size_t i = 0; i < nCol; i++)
  134. {
  135. std::string val = (char*)sqlite3_column_text(res, i);
  136. if (getOutput(i)->getValue()["value"].dump() != val) {
  137. getOutput(i)->getValueInternal()["value"] = val;
  138. state = true;
  139. }
  140. }
  141. }
  142. sqlite3_finalize(res);
  143. return state;
  144. }
  145. ModuleSQL::~ModuleSQL() {
  146. sqlite3_close(_db);
  147. }
  148. }