You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

643 lines
24 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include <sqlite3.h>
  2. //
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include "db_service.hpp"
  6. //
  7. #include "iflytop/components/sqlite_orm/sqlite_orm.hpp"
  8. using namespace std;
  9. using namespace iflytop;
  10. using namespace iflytop::db;
  11. using namespace sqlite_orm;
  12. using namespace nlohmann;
  13. // 数据库工具使用手册
  14. // auto notJohn = storage.get_all<User>(where(c(&User::firstName) != "John"));
  15. // 主键必须是int,或者不要主键
  16. #define USER_DB_STRUCT \
  17. USER_DB, /**/ \
  18. make_table("users", /**/ \
  19. make_column("id", &User::id, primary_key().autoincrement()), /**/ \
  20. make_column("uid", &User::uid), /**/ \
  21. make_column("passwd", &User::passwd), /**/ \
  22. make_column("permission_level", &User::permission_level), /**/ \
  23. make_column("visible", &User::visible))
  24. #define SETTING_DB_STRUCT \
  25. make_table("settings", /**/ \
  26. make_column("id", &Setting::id, primary_key()), /**/ \
  27. make_column("name", &Setting::name), /**/ \
  28. make_column("name_ch", &Setting::name_ch), /**/ \
  29. make_column("val_lower_limit", &Setting::val_lower_limit), /**/ \
  30. make_column("val_upper_limit", &Setting::val_upper_limit), /**/ \
  31. make_column("permission_level", &Setting::permission_level), /**/ \
  32. make_column("val", &Setting::val))
  33. #define FORMULA_DB_STRUCT \
  34. make_table("formulas", /**/ \
  35. make_column("id", &Formula::id, primary_key()), /**/ \
  36. make_column("loglevel", &Formula::loglevel), /**/ \
  37. make_column("formula_id", &Formula::formula_id), /**/ \
  38. make_column("stoped_gs", &Formula::stoped_gs), /**/ \
  39. make_column("continued_gs", &Formula::continued_gs), /**/ \
  40. make_column("stoped_satur", &Formula::stoped_satur), /**/ \
  41. make_column("continued_satur", &Formula::continued_satur), /**/ \
  42. make_column("stoped_humi", &Formula::stoped_humi), /**/ \
  43. make_column("continued_humi", &Formula::continued_humi), /**/ \
  44. make_column("injection_pump_speed", &Formula::injection_pump_speed))
  45. #define USER_BEHAVIOR_RECORD_STRUCT \
  46. make_table("user_behavior_records", /**/ \
  47. make_column("id", &UserBehaviorRecord::id, primary_key().autoincrement()), /**/ \
  48. make_column("uid", &UserBehaviorRecord::uid), /**/ \
  49. make_column("date", &UserBehaviorRecord::date), /**/ \
  50. make_column("behavior", &UserBehaviorRecord::behavior), /**/ \
  51. make_column("behaviorinfo", &UserBehaviorRecord::behaviorinfo))
  52. DBService::DBService(/* args */) {}
  53. void DBService::initialize() {
  54. /**
  55. * @brief
  56. */
  57. //
  58. init_usr_db();
  59. init_setting_db();
  60. json settings = getAllSettingJson();
  61. logger->info("settings: {}", settings.dump());
  62. }
  63. void DBService::init_usr_db() {
  64. bool suc = false;
  65. do {
  66. try {
  67. logger->info("init user db");
  68. auto storage = make_storage(USER_DB_STRUCT);
  69. storage.sync_schema();
  70. auto admin = storage.get_all<User>(where(c(&User::uid) == "admin"));
  71. if (admin.size() == 0) {
  72. storage.insert<User>({-1, "admin", "9973", 1, true}); // 管理员
  73. }
  74. auto user = storage.get_all<User>(where(c(&User::uid) == "user"));
  75. if (user.size() == 0) {
  76. storage.insert<User>({-1, "user", "0000", 3, true}); // 普通用户
  77. }
  78. suc = true;
  79. } catch (const std::exception& e) {
  80. logger->error("init user db failed: {}", e.what());
  81. system("rm -rf user.db");
  82. sleep(1);
  83. }
  84. } while (!suc);
  85. }
  86. void DBService::init_setting_db() {
  87. bool suc = false;
  88. #if 0
  89. id setting_name setting_name_ch val_upper_limit val_lower_limit permission_level val
  90. 0 stoped_gs 0 2000 1 1000
  91. 1 continued_gs 0 2000 1 800
  92. 2 stoped_satur 0 100 1 80
  93. 3 continued_satur 0 100 1 60
  94. 4 max_humidity 湿 0 100 1 90
  95. 5 drainage_pump_speed 0 2000 2 500
  96. 6 injection_pump_speed 0 2000 2 500
  97. #endif
  98. do {
  99. try {
  100. logger->info("init setting db");
  101. auto storage = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  102. storage.sync_schema();
  103. if (storage.get_all<Setting>(where(c(&Setting::id) == 1)).size() == 0) //
  104. storage.insert(Setting{1, "stoped_gs", "消毒停止过氧化氢溶度", 0, 2000, 0, 1800});
  105. if (storage.get_all<Setting>(where(c(&Setting::id) == 2)).size() == 0)
  106. storage.insert(Setting{2, "continued_gs", "消毒继续过氧化氢溶度", 0, 2000, 0, 1500});
  107. if (storage.get_all<Setting>(where(c(&Setting::id) == 3)).size() == 0)
  108. storage.insert(Setting{3, "stoped_satur", "消毒停止过氧化氢相对饱和度", 0, 100, 0, 85});
  109. if (storage.get_all<Setting>(where(c(&Setting::id) == 4)).size() == 0)
  110. storage.insert(Setting{4, "continued_satur", "消毒继续过氧化氢相对饱和度", 0, 100, 0, 70});
  111. if (storage.get_all<Setting>(where(c(&Setting::id) == 5)).size() == 0) //
  112. storage.insert(Setting{5, "max_humidity", "允许消毒最大湿度", 0, 100, 0, 90});
  113. if (storage.get_all<Setting>(where(c(&Setting::id) == 6)).size() == 0)
  114. storage.insert(Setting{6, "drainage_pump_speed", "排液蠕动泵转速", 0, 90, 0, 90}); // g/min
  115. if (storage.get_all<Setting>(where(c(&Setting::id) == 7)).size() == 0)
  116. storage.insert(Setting{7, "injection_pump_speed", "喷射蠕动泵转速", 0, 50, 0, 50}); // g/min
  117. if (storage.get_all<Setting>(where(c(&Setting::id) == 8)).size() == 0) //
  118. storage.insert(Setting{8, "pre_heat_time_s", "预热时间", 0, 600, 0, 120});
  119. if (storage.get_all<Setting>(where(c(&Setting::id) == 9)).size() == 0) //
  120. storage.insert(Setting{9, "stoped_humi", "消毒停止相对湿度", 0, 100, 0, 85});
  121. if (storage.get_all<Setting>(where(c(&Setting::id) == 10)).size() == 0) //
  122. storage.insert(Setting{10, "continued_humi", "消毒继续相对湿度", 0, 100, 0, 70});
  123. suc = true;
  124. } catch (const std::exception& e) {
  125. logger->error("init setting db failed: {}", e.what());
  126. system("rm -rf setting.db");
  127. sleep(1);
  128. }
  129. } while (!suc);
  130. }
  131. void DBService::init_formula_db() {
  132. bool suc = false;
  133. do {
  134. try {
  135. logger->info("init formula db");
  136. auto storage = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  137. storage.sync_schema();
  138. suc = true;
  139. } catch (const std::exception& e) {
  140. logger->error("init setting db failed: {}", e.what());
  141. system("rm -rf setting.db");
  142. sleep(1);
  143. }
  144. } while (!suc);
  145. }
  146. list<shared_ptr<User>> DBService::getAllUser() {
  147. lock_guard<recursive_mutex> lock(lock_);
  148. list<shared_ptr<User>> users;
  149. auto usertable = make_storage(USER_DB_STRUCT);
  150. usertable.sync_schema();
  151. auto all = usertable.get_all<User>();
  152. for (auto& u : all) {
  153. users.push_back(make_shared<User>(u));
  154. }
  155. return users;
  156. }
  157. void DBService::addUser(string uid, string passwd, int permission_level) {
  158. lock_guard<recursive_mutex> lock(lock_);
  159. auto usertable = make_storage(USER_DB_STRUCT);
  160. usertable.sync_schema();
  161. logger->info("add user: {} {} {}", uid, passwd, permission_level);
  162. usertable.insert(User{-1, uid, passwd, permission_level, true});
  163. }
  164. shared_ptr<db::User> DBService::delUser(int id) {
  165. lock_guard<recursive_mutex> lock(lock_);
  166. auto usertable = make_storage(USER_DB_STRUCT);
  167. usertable.sync_schema();
  168. /**
  169. * @brief find admin user
  170. */
  171. auto admin = usertable.get_all<User>(where(c(&User::uid) == "admin"));
  172. ZCHECK(admin.size() == 1, "admin user not found");
  173. if (admin[0].id == id) {
  174. logger->error("can not delete admin user");
  175. return nullptr;
  176. }
  177. auto remove_user = usertable.get_all<User>(where(c(&User::id) == id));
  178. if (remove_user.size() == 0) {
  179. logger->error("remove user fail, user not found");
  180. return nullptr;
  181. }
  182. logger->info("delete user: {}:{}", id, remove_user[0].uid);
  183. usertable.remove_all<User>(where(c(&User::id) == id));
  184. return make_shared<User>(remove_user[0]);
  185. }
  186. shared_ptr<db::User> DBService::updateUserPermissionLevel(int id, int permission_level) {
  187. lock_guard<recursive_mutex> lock(lock_);
  188. auto usertable = make_storage(USER_DB_STRUCT);
  189. usertable.sync_schema();
  190. auto user = usertable.get_all<User>(where(c(&User::id) == id));
  191. if (user.size() == 0) {
  192. logger->error("update user permission level fail, user not found");
  193. return nullptr;
  194. }
  195. logger->info("update user permission level: {} {} -> {}", id, user[0].permission_level, permission_level);
  196. user[0].permission_level = permission_level;
  197. usertable.update(user[0]);
  198. return make_shared<User>(user[0]);
  199. }
  200. shared_ptr<db::User> DBService::changePasswd(string uid, string passwd) {
  201. lock_guard<recursive_mutex> lock(lock_);
  202. auto usertable = make_storage(USER_DB_STRUCT);
  203. usertable.sync_schema();
  204. auto user = usertable.get_all<User>(where(c(&User::uid) == uid));
  205. if (user.size() == 0) {
  206. logger->error("change passwd fail, user not found");
  207. return nullptr;
  208. }
  209. logger->info("change passwd: {} {} -> {}", uid, user[0].passwd, passwd);
  210. user[0].passwd = passwd;
  211. usertable.update(user[0]);
  212. return make_shared<User>(user[0]);
  213. }
  214. shared_ptr<db::User> DBService::updateUserUid(int id, string uid, string& olduid) {
  215. lock_guard<recursive_mutex> lock(lock_);
  216. auto usertable = make_storage(USER_DB_STRUCT);
  217. usertable.sync_schema();
  218. auto user = usertable.get_all<User>(where(c(&User::id) == id));
  219. if (user.size() == 0) {
  220. logger->error("change user uid fail, user not found");
  221. return nullptr;
  222. }
  223. olduid = user[0].uid;
  224. logger->info("change user uid: {} {} -> {}", id, user[0].uid, uid);
  225. user[0].uid = uid;
  226. usertable.update(user[0]);
  227. return make_shared<User>(user[0]);
  228. }
  229. json DBService::getAllUserJson() {
  230. lock_guard<recursive_mutex> lock(lock_);
  231. json j_users;
  232. auto usertable = make_storage(USER_DB_STRUCT);
  233. usertable.sync_schema();
  234. auto all = usertable.get_all<User>();
  235. for (auto& u : all) {
  236. json j_user;
  237. j_user["id"] = u.id;
  238. j_user["uid"] = u.uid;
  239. j_user["passwd"] = u.passwd;
  240. j_user["permission_level"] = u.permission_level;
  241. j_user["visible"] = u.visible;
  242. j_users.push_back(j_user);
  243. }
  244. return j_users;
  245. }
  246. shared_ptr<User> DBService::getUser(string uid) {
  247. lock_guard<recursive_mutex> lock(lock_);
  248. auto usertable = make_storage(USER_DB_STRUCT);
  249. usertable.sync_schema();
  250. auto user = usertable.get_all<User>(where(c(&User::uid) == uid));
  251. if (user.size() == 0) {
  252. return nullptr;
  253. }
  254. return make_shared<User>(user[0]);
  255. }
  256. list<shared_ptr<db::Setting>> DBService::getAllSetting() {
  257. lock_guard<recursive_mutex> lock(lock_);
  258. list<shared_ptr<db::Setting>> settings;
  259. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  260. settingtable.sync_schema();
  261. auto all = settingtable.get_all<Setting>();
  262. for (auto& s : all) {
  263. settings.push_back(make_shared<Setting>(s));
  264. }
  265. return settings;
  266. }
  267. json DBService::getAllSettingJson() {
  268. lock_guard<recursive_mutex> lock(lock_);
  269. json j_settings;
  270. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  271. settingtable.sync_schema();
  272. auto all = settingtable.get_all<Setting>();
  273. for (auto& s : all) {
  274. json j_setting;
  275. j_setting["id"] = s.id;
  276. j_setting["name"] = s.name;
  277. j_setting["name_ch"] = s.name_ch;
  278. j_setting["val"] = s.val;
  279. j_setting["val_lower_limit"] = s.val_lower_limit;
  280. j_setting["val_upper_limit"] = s.val_upper_limit;
  281. j_setting["permission_level"] = s.permission_level;
  282. j_setting["val"] = s.val;
  283. j_settings.push_back(j_setting);
  284. }
  285. return j_settings;
  286. }
  287. bool DBService::isUserExist(string uid) {
  288. lock_guard<recursive_mutex> lock(lock_);
  289. auto usertable = make_storage(USER_DB_STRUCT);
  290. usertable.sync_schema();
  291. auto user = usertable.get_all<User>(where(c(&User::uid) == uid));
  292. if (user.size() == 0) {
  293. return false;
  294. }
  295. return true;
  296. }
  297. bool DBService::ispasswdCorrect(string uid, string passwd) {
  298. lock_guard<recursive_mutex> lock(lock_);
  299. auto usertable = make_storage(USER_DB_STRUCT);
  300. usertable.sync_schema();
  301. auto user = usertable.get_all<User>(where(c(&User::uid) == uid));
  302. if (user.size() == 0) {
  303. return false;
  304. }
  305. if (user[0].passwd == passwd) {
  306. return true;
  307. }
  308. return false;
  309. }
  310. bool DBService::setSettingVal(int id, int val) {
  311. lock_guard<recursive_mutex> lock(lock_);
  312. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  313. settingtable.sync_schema();
  314. auto setting = settingtable.get_all<Setting>(where(c(&Setting::id) == id));
  315. if (setting.size() == 0) {
  316. return false;
  317. }
  318. if (setting[0].val < setting[0].val_lower_limit || setting[0].val > setting[0].val_upper_limit) {
  319. return false;
  320. }
  321. setting[0].val = val;
  322. settingtable.update(setting[0]);
  323. return true;
  324. }
  325. bool DBService::setSettingVal(string setting_name, int val) {
  326. lock_guard<recursive_mutex> lock(lock_);
  327. logger->info("set setting val: {} {}", setting_name, val);
  328. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  329. settingtable.sync_schema();
  330. auto setting = settingtable.get_all<Setting>(where(c(&Setting::name) == setting_name));
  331. if (setting.size() == 0) {
  332. logger->error("set setting val failed: {} not found", setting_name);
  333. return false;
  334. }
  335. if (setting[0].val < setting[0].val_lower_limit || setting[0].val > setting[0].val_upper_limit) {
  336. logger->error("set setting val failed: {} out of range", setting_name);
  337. return false;
  338. }
  339. setting[0].val = val;
  340. Setting s = setting[0];
  341. settingtable.update(s);
  342. settingtable.sync_schema();
  343. return true;
  344. }
  345. int DBService::getSettingVal(string name) {
  346. lock_guard<recursive_mutex> lock(lock_);
  347. auto settingtable = make_storage(SETTING_DB, SETTING_DB_STRUCT);
  348. settingtable.sync_schema();
  349. auto setting = settingtable.get_all<Setting>(where(c(&Setting::name) == name));
  350. if (setting.size() == 0) {
  351. return -1;
  352. }
  353. return setting[0].val;
  354. }
  355. list<shared_ptr<db::Formula>> DBService::getAllFormula() {
  356. lock_guard<recursive_mutex> lock(lock_);
  357. list<shared_ptr<db::Formula>> formulas;
  358. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  359. formulatable.sync_schema();
  360. auto all = formulatable.get_all<Formula>();
  361. for (auto& f : all) {
  362. formulas.push_back(make_shared<Formula>(f));
  363. }
  364. return formulas;
  365. }
  366. shared_ptr<db::Formula> DBService::getFormula(int id) {
  367. lock_guard<recursive_mutex> lock(lock_);
  368. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  369. formulatable.sync_schema();
  370. auto formula = formulatable.get_all<Formula>(where(c(&Formula::id) == id));
  371. if (formula.size() == 0) {
  372. return nullptr;
  373. }
  374. return make_shared<Formula>(formula[0]);
  375. }
  376. json DBService::getAllFormulaJson() {
  377. lock_guard<recursive_mutex> lock(lock_);
  378. json j_formulas;
  379. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  380. formulatable.sync_schema();
  381. auto all = formulatable.get_all<Formula>();
  382. for (auto& f : all) {
  383. json j_formula;
  384. j_formula["id"] = f.id;
  385. j_formula["loglevel"] = f.loglevel;
  386. j_formula["formula_id"] = f.formula_id;
  387. j_formula["stoped_gs"] = f.stoped_gs;
  388. j_formula["continued_gs"] = f.continued_gs;
  389. j_formula["stoped_satur"] = f.stoped_satur;
  390. j_formula["continued_satur"] = f.continued_satur;
  391. j_formula["stoped_humi"] = f.stoped_humi;
  392. j_formula["continued_humi"] = f.continued_humi;
  393. j_formula["injection_pump_speed"] = f.injection_pump_speed;
  394. j_formulas.push_back(j_formula);
  395. }
  396. json jret;
  397. jret["formulas"] = j_formulas;
  398. jret["settings"] = getAllSettingJson();
  399. return jret;
  400. }
  401. void DBService::addFormula(string formula_id,string loglevel, string stoped_gs, string continued_gs, string stoped_satur, string continued_satur,
  402. string stoped_humi, string continued_humi, string injection_pump_speed) {
  403. lock_guard<recursive_mutex> lock(lock_);
  404. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  405. formulatable.sync_schema();
  406. Formula f;
  407. f.loglevel = loglevel;
  408. f.formula_id = formula_id;
  409. f.stoped_gs = stoped_gs;
  410. f.continued_gs = continued_gs;
  411. f.stoped_satur = stoped_satur;
  412. f.continued_satur = continued_satur;
  413. f.stoped_humi = stoped_humi;
  414. f.continued_humi = continued_humi;
  415. f.injection_pump_speed = injection_pump_speed;
  416. formulatable.insert(f);
  417. formulatable.sync_schema();
  418. }
  419. void DBService::addFormula(string formula_id, int loglevel, int stoped_gs, int continued_gs, int stoped_satur, int continued_satur, int stoped_humi,
  420. int continued_humi, int injection_pump_speed) {
  421. addFormula(formula_id, to_string(loglevel), to_string(stoped_gs), to_string(continued_gs), to_string(stoped_satur), to_string(continued_satur),
  422. to_string(stoped_humi), to_string(continued_humi), to_string(injection_pump_speed));
  423. }
  424. shared_ptr<db::Formula> DBService::delFormula(int id) {
  425. lock_guard<recursive_mutex> lock(lock_);
  426. // remove_all
  427. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  428. formulatable.sync_schema();
  429. auto formula = formulatable.get_all<Formula>(where(c(&Formula::id) == id));
  430. formulatable.remove_all<Formula>(where(c(&Formula::id) == id));
  431. formulatable.sync_schema();
  432. if (formula.size() == 0) {
  433. return nullptr;
  434. }
  435. return make_shared<Formula>(formula[0]);
  436. }
  437. shared_ptr<db::Formula> DBService::updateFormula(int id, string column, string val) {
  438. lock_guard<recursive_mutex> lock(lock_);
  439. auto formulatable = make_storage(FORMULA_DB, FORMULA_DB_STRUCT);
  440. formulatable.sync_schema();
  441. auto formula = formulatable.get_all<Formula>(where(c(&Formula::id) == id));
  442. if (formula.size() == 0) {
  443. return nullptr;
  444. }
  445. if (column == "formula_id") {
  446. formula[0].formula_id = val;
  447. } else if (column == "stoped_gs") {
  448. formula[0].stoped_gs = val;
  449. } else if (column == "continued_gs") {
  450. formula[0].continued_gs = val;
  451. } else if (column == "stoped_satur") {
  452. formula[0].stoped_satur = val;
  453. } else if (column == "continued_satur") {
  454. formula[0].continued_satur = val;
  455. } else if (column == "stoped_humi") {
  456. formula[0].stoped_humi = val;
  457. } else if (column == "continued_humi") {
  458. formula[0].continued_humi = val;
  459. } else if (column == "injection_pump_speed") {
  460. formula[0].injection_pump_speed = val;
  461. }
  462. formulatable.update(formula[0]);
  463. formulatable.sync_schema();
  464. return make_shared<Formula>(formula[0]);
  465. }
  466. int DBService::getUserBehaviorRecordCount() {
  467. lock_guard<recursive_mutex> lock(lock_);
  468. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  469. user_behavior_record_table.sync_schema();
  470. return user_behavior_record_table.count<UserBehaviorRecord>(where(c(&UserBehaviorRecord::id) > 0));
  471. }
  472. int DBService::getUserBehaviorRecordTheFirstId() {
  473. lock_guard<recursive_mutex> lock(lock_);
  474. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  475. user_behavior_record_table.sync_schema();
  476. auto all = user_behavior_record_table.get_all<UserBehaviorRecord>(order_by(&UserBehaviorRecord::id).asc());
  477. if (all.size() == 0) {
  478. return -1;
  479. }
  480. return all[0].id;
  481. }
  482. list<shared_ptr<db::UserBehaviorRecord>> DBService::getAllUserBehaviorRecord() {
  483. lock_guard<recursive_mutex> lock(lock_);
  484. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  485. user_behavior_record_table.sync_schema();
  486. auto all = user_behavior_record_table.get_all<UserBehaviorRecord>(order_by(&UserBehaviorRecord::id).desc());
  487. list<shared_ptr<db::UserBehaviorRecord>> user_behavior_records;
  488. for (auto& u : all) {
  489. user_behavior_records.push_back(make_shared<UserBehaviorRecord>(u));
  490. }
  491. return user_behavior_records;
  492. }
  493. json DBService::getUserBehaviorRecordDescJson(int page, int page_size) {
  494. lock_guard<recursive_mutex> lock(lock_);
  495. json j_user_behavior_records;
  496. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  497. user_behavior_record_table.sync_schema();
  498. auto all = user_behavior_record_table.get_all<UserBehaviorRecord>(order_by(&UserBehaviorRecord::id).desc());
  499. int i = 0;
  500. int from = page * page_size;
  501. int to = (page + 1) * page_size;
  502. for (auto& u : all) {
  503. if (i >= from && i < to) {
  504. json j_user_behavior_record;
  505. j_user_behavior_record["id"] = u.id;
  506. j_user_behavior_record["uid"] = u.uid;
  507. j_user_behavior_record["behavior"] = u.behavior;
  508. j_user_behavior_record["behaviorZH"] = user_behavior_to_str((user_behavior_t)u.behavior);
  509. j_user_behavior_record["behaviorinfo"] = u.behaviorinfo;
  510. j_user_behavior_record["date"] = u.date;
  511. j_user_behavior_records["iterms"].push_back(j_user_behavior_record);
  512. } else if (i >= to) {
  513. break;
  514. }
  515. i++;
  516. }
  517. j_user_behavior_records["total"] = all.size();
  518. j_user_behavior_records["page"] = page;
  519. j_user_behavior_records["totalpage"] = all.size() / page_size + (all.size() % page_size == 0 ? 0 : 1);
  520. return j_user_behavior_records;
  521. }
  522. static string getTime() {
  523. struct tm tm = {0};
  524. time_t t = ::time(nullptr);
  525. struct tm* tmp = localtime_r(&t, &tm);
  526. return fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}", tm.tm_year + 1900, //
  527. tm.tm_mon + 1, //
  528. tm.tm_mday, //
  529. tm.tm_hour, //
  530. tm.tm_min, tm.tm_sec);
  531. }
  532. void DBService::addUserBehaviorRecord(string uid, int behavior, string behaviorinfo) {
  533. lock_guard<recursive_mutex> lock(lock_);
  534. auto user_behavior_record_table = make_storage(USER_BEHAVIOR_RECORD_DB, USER_BEHAVIOR_RECORD_STRUCT);
  535. user_behavior_record_table.sync_schema();
  536. UserBehaviorRecord u;
  537. u.uid = uid;
  538. u.behavior = behavior;
  539. u.behaviorinfo = behaviorinfo;
  540. u.date = getTime();
  541. user_behavior_record_table.insert(u);
  542. user_behavior_record_table.sync_schema();
  543. auto all = user_behavior_record_table.get_all<UserBehaviorRecord>(order_by(&UserBehaviorRecord::id).asc());
  544. /**
  545. * @brief 5000
  546. */
  547. if (all.size() > USER_BEHAVIOR_RECORD_DB_MAX_RECORDS) {
  548. user_behavior_record_table.remove_all<UserBehaviorRecord>(where(c(&UserBehaviorRecord::id) == all[0].id));
  549. user_behavior_record_table.sync_schema();
  550. }
  551. return;
  552. }
  553. void DBService::cleanUserBehaviorRecord() {
  554. lock_guard<recursive_mutex> lock(lock_);
  555. system(fmt::format("rm -rf {}", USER_BEHAVIOR_RECORD_DB).c_str());
  556. }