log_db.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. #include <fstream>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <vector>
  5. #include <iterator>
  6. #include "log_db.h"
  7. #ifdef _WIN32
  8. #include <io.h>
  9. #include <direct.h>
  10. #include "atlbase.h"
  11. #endif //_WIN32
  12. #include "CMBSMDLL.h"
  13. #include "CppSQLite3.h"
  14. #include "inner_log.h"
  15. #include "log_util.h"
  16. #include <vector>
  17. #include <sys/stat.h>
  18. #include "zlib.h"
  19. #include "base64_openssl.h"
  20. #include <chrono>
  21. #include "baseFun.h"
  22. #ifndef _WIN32
  23. char* itoa(int value, char* buffer, int radix)
  24. {
  25. char* p;
  26. unsigned int a;
  27. //int len;
  28. char* b;
  29. char temp;
  30. unsigned int u;
  31. p = buffer;
  32. if (value < 0) {
  33. *p++ = '-';
  34. value = 0 - value;
  35. }
  36. u = (unsigned int)value;
  37. b = p;
  38. do {
  39. a = u % radix;
  40. u /= radix;
  41. *p++ = a + '0';
  42. } while (u > 0);
  43. //len = (int)(p-buffer);
  44. *p-- = 0;
  45. do {
  46. temp = *p;
  47. *p = *b;
  48. *b = temp;
  49. --p;
  50. ++b;
  51. } while (b < p);
  52. return buffer;
  53. }
  54. #endif // _WIN32
  55. #define MAX_CACHEDB_SIZE 500*1024*1024
  56. #define MIN_CACHEFREQUENCE_SIZE 50
  57. #define COMPRESS_CONTEXT
  58. const std::string COLUMN_ID = "id";
  59. const std::string COLUMN_DateTime = "date_time";
  60. const std::string COLUMN_Uuid = "uuid";
  61. const std::string COLUMN_Level = "level";
  62. const std::string COLUMN_Type = "type";
  63. const std::string COLUMN_Status = "status";
  64. const std::string COLUMN_Encrypt = "encrypt";
  65. const std::string COLUMN_Content = "content";
  66. int db_move_to_main(log_db_manager* manager);
  67. struct _log_db_manager {
  68. log_producer_config* config;
  69. CppSQLite3DB *db;
  70. std::string file_path;
  71. std::string file_name;
  72. std::string table_name;
  73. };
  74. log_db_manager* create_log_db(log_producer_config* config, char* base_path, char* file_name, char* table_name) {
  75. std::string str_file_name, dstFile;
  76. if (base_path == NULL || table_name == NULL || file_name == NULL) {
  77. aos_debug_log((LB, "create log db failed for null"));
  78. return NULL;
  79. }
  80. auto getFileSize = [](const char* fileName) -> int {
  81. if (fileName == NULL) {
  82. return -1;
  83. }
  84. struct stat statbuf;
  85. if (stat(fileName, &statbuf) == -1)
  86. return -1;
  87. // 获取文件大小
  88. size_t filesize = statbuf.st_size;
  89. return filesize;
  90. };
  91. auto IsFileOutDate = [](const char* fileName) -> bool
  92. {
  93. if (fileName == NULL) {
  94. return false;
  95. }
  96. struct stat statbuf;
  97. if (stat(fileName, &statbuf) == -1)
  98. return false;
  99. auto modifyTime = statbuf.st_mtime;
  100. auto curTime = time(nullptr);
  101. return (curTime - modifyTime) > 3600 * 72;//3 days
  102. };
  103. dstFile = std::string(base_path) + std::string(file_name);
  104. auto curFileSize = getFileSize(dstFile.c_str());
  105. const int MAX_DB_SIZE = 50 * 1024 * 1024;
  106. if (IsFileOutDate(dstFile.c_str()) || curFileSize > MAX_DB_SIZE) {
  107. #if defined(_MSC_VER)
  108. DeleteFile(dstFile.c_str());
  109. #else
  110. int status;
  111. status = unlink(dstFile.c_str());
  112. #endif //_MSC_VER
  113. }
  114. log_db_manager*log_db = new log_db_manager();
  115. log_db->file_path = base_path;
  116. str_file_name = file_name;
  117. log_db->file_name = str_file_name;
  118. log_db->table_name = table_name;
  119. log_db->db = new CppSQLite3DB();
  120. log_db->config = config;
  121. aos_debug_log((LB, "create log db success, db file_path %s, file_name %s, table_name %s",
  122. log_db->file_path.c_str(), log_db->file_name.c_str(), log_db->table_name.c_str()));
  123. return log_db;
  124. }
  125. void destroy_log_db(log_db_manager* manager) {
  126. if (manager != NULL) {
  127. if (manager != NULL) {
  128. try {
  129. if (manager->db)
  130. {
  131. manager->db->close();
  132. delete manager->db;
  133. manager->db = NULL;
  134. }
  135. }
  136. catch (...) {
  137. aos_error_log((LB, "close log db name %s failed.", manager->file_name.c_str()));
  138. }
  139. }
  140. aos_debug_log((LB, "destroy log db %s", manager->file_name.c_str()));
  141. delete manager;
  142. manager = NULL;
  143. }
  144. }
  145. bool createFile(std::string fileName) {
  146. std::fstream file;
  147. file.open(fileName, std::ios::out);
  148. if (!file) {
  149. return false;
  150. }
  151. file.close();
  152. return true;
  153. }
  154. int open_db(log_db_manager * manager) {
  155. if (manager == NULL || manager->db == NULL) {
  156. aos_error_log((LB, "open log db %s failed for null.", manager->file_name.c_str()));
  157. return false;
  158. }
  159. bool ret = true;
  160. try {
  161. std::string full_file_name;
  162. int mk_ret = mkdir_foreach((char*)manager->file_path.c_str(), manager->file_path.length());
  163. if (mk_ret < 0){
  164. aos_error_log((LB, "make log db %s file path failed.", manager->file_name.c_str()));
  165. return false;
  166. }
  167. full_file_name = manager->file_path + manager->file_name;
  168. char* name = (char*)full_file_name.c_str();
  169. manager->db->open(name);
  170. if (!db_is_exist_table_ex(manager, (char *)manager->table_name.c_str())) {
  171. std::string strCreateTable = "CREATE TABLE IF NOT EXISTS ";
  172. strCreateTable.append(manager->table_name).append(" (" +
  173. //COLUMN_ID + " INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT," +
  174. COLUMN_DateTime + " INTEGER," +
  175. COLUMN_Uuid + " TEXT NOT NULL PRIMARY KEY," +
  176. COLUMN_Level + " INTEGER," +
  177. COLUMN_Type + " INTEGER," +
  178. COLUMN_Status + " INTEGER DEFAULT 0," +
  179. COLUMN_Encrypt + " INTEGER DEFAULT 0," +
  180. COLUMN_Content + " TEXT" +
  181. ");");
  182. int CTRet = manager->db->execDML(strCreateTable.c_str());
  183. //aos_debug_log((LB, "create log table result %d, db name %s", CTRet, name));
  184. }
  185. //manager->db->execDML("PRAGMA synchronous = FULL;");
  186. }
  187. catch (CppSQLite3Exception& e)
  188. {
  189. aos_error_log((LB, "open log db %s error %s", manager->file_name.c_str(), e.errorMessage()));
  190. if (manager->db != NULL) {
  191. try {
  192. manager->db->close();
  193. }
  194. catch (...) {
  195. aos_error_log((LB, "close log db %s failed.", manager->file_name.c_str()));
  196. }
  197. delete manager->db;
  198. manager->db = NULL;
  199. }
  200. ret = false;
  201. }
  202. return ret;
  203. }
  204. void close_logdb(log_db_manager* manager)
  205. {
  206. if (manager!= NULL && manager->db != NULL) {
  207. try {
  208. manager->db->close();
  209. }
  210. catch (...) {
  211. aos_error_log((LB, "close log db %s failed.", manager->file_name.c_str()));
  212. }
  213. delete manager->db;
  214. manager->db = NULL;
  215. }
  216. }
  217. int drop_db(log_db_manager* manager)
  218. {
  219. if (manager == NULL || manager->db == NULL) {
  220. aos_error_log((LB, "drop log db %s failed for null.", manager->file_name.c_str()));
  221. return false;
  222. }
  223. bool ret = true;
  224. try {
  225. std::string strSql = "DROP TABLE IF EXISTS ";
  226. strSql.append(manager->table_name);
  227. int CTRet = manager->db->execDML(strSql.c_str());
  228. aos_debug_log((LB, "drop log db %s result %d table name %s", manager->file_name.c_str(), CTRet, manager->table_name.c_str()));
  229. }
  230. catch (CppSQLite3Exception& e)
  231. {
  232. aos_error_log((LB, "drop log db %s error %s", manager->file_name.c_str(), e.errorMessage()));
  233. ret = false;
  234. }
  235. return ret;
  236. }
  237. int db_insert_group(log_db_manager* manager, log_group_builder* builder) {
  238. if (manager == NULL || manager->db == NULL) {
  239. aos_error_log((LB, "insert log db %s failed for null.", manager->file_name.c_str()));
  240. return false;
  241. }
  242. int ret = true;
  243. serialize_buf buf;
  244. for (int i = 0; i < builder->grp->n_logs; i++) {
  245. memset(&buf, 0, sizeof(serialize_buf));
  246. serialize_to_buf(&builder->grp->logs[i], &buf);
  247. ret = db_insert_one(manager, &buf);
  248. }
  249. return ret;
  250. }
  251. int db_insert_one(log_db_manager* manager, serialize_buf* buf) {
  252. if (manager == NULL || manager->db == NULL) {
  253. aos_error_log((LB, "insert log db %s failed for null.", manager->file_name.c_str()));
  254. return false;
  255. }
  256. int ret = true;
  257. std::string strSql = "insert into ";
  258. long time = LOG_GET_TIME();
  259. char strTime[128];
  260. char strLevel[32];
  261. char strType[32];
  262. char strEncrypt[32];
  263. sprintf(strTime, "%ld", time);
  264. sprintf(strLevel, "%d", buf->level);
  265. sprintf(strType, "%d", buf->type);
  266. sprintf(strEncrypt, "%d", manager->config->usePersistentEncrypt);
  267. unsigned long end_time;
  268. unsigned long start_time = GetTickCount();
  269. //SM4加密,密文会比明文长16字节
  270. if (manager->config->usePersistentEncrypt == 1) {
  271. int input_length = strlen(buf->buffer) + 1;
  272. unsigned char* input_data = (unsigned char*)buf->buffer;
  273. int output_length = input_length + 16;
  274. unsigned char* output_data = (unsigned char*)malloc(output_length);
  275. CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, input_data, input_length, output_data, &output_length);
  276. char* output_str_data = (char*)malloc(output_length * 2 + 1);
  277. memset(output_str_data, 0, output_length * 2 + 1);
  278. convertUnCharTotr(output_str_data, output_data, output_length);
  279. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  280. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  281. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  282. append(strLevel).append(",").append(strType).append(",'").
  283. append(output_str_data).append("',").append(strEncrypt).append(",0)");
  284. free(output_data);
  285. free(output_str_data);
  286. end_time = GetTickCount();
  287. //aos_debug_log((LB, "db_insert_one Encrypt cust %d", end_time - start_time));
  288. }
  289. else if(manager->config->usePersistentEncrypt == 2)
  290. {
  291. int input_length = strlen(buf->buffer) + 1;
  292. unsigned char* input_data = (unsigned char*)buf->buffer;
  293. unsigned long compressLen = input_length * 2 + 1;
  294. unsigned char* compress_str_data = (unsigned char*)malloc(compressLen);
  295. memset(compress_str_data, 0, compressLen);
  296. compress(compress_str_data, &compressLen, (unsigned char*)input_data, input_length);
  297. int output_length = compressLen + 16;
  298. unsigned char* output_data = (unsigned char*)malloc(output_length);
  299. CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, compress_str_data, compressLen, output_data, &output_length);
  300. char* output_str_data = openssl_base64_encode((char*)output_data, output_length);
  301. //try to decrypt
  302. /*
  303. char* input_str_data = output_str_data;
  304. char* decoded_bytes = NULL;
  305. size_t decoded_length = 0;
  306. openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
  307. int SM4_length = decoded_length;
  308. char* SM4_data = (char*)malloc(decoded_length);
  309. memset(SM4_data, 0, decoded_length);
  310. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  311. (unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
  312. uLongf uncompress_length = SM4_length * 3;
  313. char *output_data2 = (char*)malloc(uncompress_length);
  314. memset(output_data2, 0, uncompress_length);
  315. uncompress((unsigned char*)output_data2, &uncompress_length, (unsigned char*)SM4_data, SM4_length);
  316. if(SM4_data)
  317. free(SM4_data);
  318. if(decoded_bytes)
  319. free(decoded_bytes);
  320. */
  321. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  322. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  323. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  324. append(strLevel).append(",").append(strType).append(",'").
  325. append((char*)output_str_data).append("',").append(strEncrypt).append(",0)");
  326. if(compress_str_data)
  327. free(compress_str_data);
  328. if(output_data)
  329. free(output_data);
  330. if(output_str_data)
  331. free(output_str_data);
  332. end_time = GetTickCount();
  333. }
  334. else if (manager->config->usePersistentEncrypt == 3)
  335. {
  336. if (strlen(buf->buffer) == 0)
  337. return ret;
  338. int input_length = strlen(buf->buffer) + 1;
  339. unsigned char* input_data = (unsigned char*)buf->buffer;
  340. int output_length = input_length + 16;
  341. unsigned char* output_data = (unsigned char*)malloc(output_length);
  342. CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, input_data, input_length, output_data, &output_length);
  343. char* output_str_data = openssl_base64_encode((char*)output_data, output_length);
  344. //try to decrypt
  345. /*
  346. char* input_str_data = output_str_data;
  347. char* decoded_bytes = NULL;
  348. size_t decoded_length = 0;
  349. openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
  350. int SM4_length = decoded_length;
  351. char* SM4_data = (char*)malloc(decoded_length);
  352. memset(SM4_data, 0, decoded_length);
  353. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  354. (unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
  355. //RvcLogSdkManager::getInstance().SendTestLog(output_str_data);
  356. if(SM4_data)
  357. free(SM4_data);
  358. if(decoded_bytes)
  359. free(decoded_bytes);
  360. */
  361. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  362. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  363. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  364. append(strLevel).append(",").append(strType).append(",'").
  365. append((char*)output_str_data).append("',").append(strEncrypt).append(",0)");
  366. if (output_data)
  367. free(output_data);
  368. if (output_str_data)
  369. free(output_str_data);
  370. end_time = GetTickCount();
  371. }
  372. else {
  373. #ifdef COMPRESS_CONTEXT
  374. unsigned char dstBuf[10000] = "";
  375. unsigned long len = 10000;
  376. compress(dstBuf, &len, (unsigned char*)buf->buffer, buf->buffer_len);
  377. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  378. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  379. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  380. append(strLevel).append(",").append(strType).append(",'").
  381. append((char*)dstBuf).append("',").append(strEncrypt).append(",0)");
  382. #else
  383. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  384. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  385. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  386. append(strLevel).append(",").append(strType).append(",'").
  387. append((char*)buf->buffer).append("',").append(strEncrypt).append(",0)");
  388. #endif
  389. }
  390. try {
  391. int CTRet = manager->db->execDML(strSql.c_str());
  392. end_time = GetTickCount();
  393. //aos_debug_log((LB, "db_insert_one execDML cust %d", end_time - start_time));
  394. //aos_debug_log((LB, "db %s insert one log result %d, log uuid %s", manager->file_name.c_str(), CTRet, buf->uuid));
  395. }
  396. catch (CppSQLite3Exception& e)
  397. {
  398. aos_error_log((LB, "db %s insert one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), buf->uuid));
  399. ret = false;
  400. }
  401. return ret;
  402. }
  403. int getReadType()
  404. {
  405. static unsigned int sum = 0;
  406. sum = sum % 100;
  407. sum++;
  408. int cmpData = sum % 11;
  409. if (cmpData <= 5)
  410. return build_type_e::LOG_TYPE_SYS_SKYEYE;
  411. else if (cmpData <= 6)
  412. return build_type_e::LOG_TYPE_BEIDOU;
  413. else if (cmpData <= 7)
  414. return build_type_e::LOG_TYPE_USER_SKYEYE;
  415. else if (cmpData <= 8)
  416. return build_type_e::LOG_TYPE_USER_BUSINESS;
  417. else if (cmpData <= 9)
  418. return build_type_e::LOG_TYPE_SYS_BUSINESS;
  419. else if (cmpData <= 10)
  420. return build_type_e::LOG_TYPE_WEBSDK;
  421. else
  422. return 1;
  423. }
  424. log_group_builder* db_read_table_last_logs(log_db_manager* manager, int count) {
  425. if (manager == NULL || manager->db == NULL) {
  426. aos_error_log((LB, "read last logs db %s failed for null.", manager->file_name.c_str()));
  427. return NULL;
  428. }
  429. build_item log;
  430. char strStatus[32];
  431. char strCount[32];
  432. log_group_builder* builder = log_group_create(manager->config);
  433. sprintf(strStatus, "%d", LOG_DB_STATUS_SENDING);
  434. sprintf(strCount, "%d", count);
  435. std::string querySql = "select * from ";
  436. querySql.append(manager->table_name);
  437. int readType = getReadType();
  438. querySql.append(" where " + COLUMN_Status + " != ").append(strStatus).append(" AND ").append(COLUMN_Type).append("=").append(std::to_string((long long)readType));
  439. querySql.append(/*" order by " + COLUMN_DateTime + */" LIMIT ").append(strCount).append(";");
  440. try {
  441. CppSQLite3Query q = manager->db->execQuery(querySql.c_str());
  442. if (q.eof())
  443. {
  444. //if can not find, try to get LOG_TYPE_SYS_SKYEYE logs
  445. std::string searchSys= "select * from ";
  446. searchSys.append(manager->table_name);
  447. searchSys.append(" where " + COLUMN_Status + " != ").append(strStatus);
  448. searchSys.append(/*" order by " + COLUMN_DateTime + */" LIMIT ").append(strCount).append(";");
  449. q = manager->db->execQuery(searchSys.c_str());
  450. }
  451. while (!q.eof()) {
  452. int encrypt = q.getIntField(COLUMN_Encrypt.c_str(), 0);
  453. log.type = (build_type_e)q.getIntField(COLUMN_Type.c_str(), LOG_TYPE_USER_SKYEYE);
  454. //只获取同一类型的日志
  455. if (builder->grp->n_logs != 0 && builder->grp->logs[0].type != log.type) {
  456. q.nextRow();
  457. continue;
  458. }
  459. strcpy(log.uuid, q.getStringField(COLUMN_Uuid.c_str()));
  460. log.level = (LOG_LEVEL_E)q.getIntField(COLUMN_Level.c_str(), LOG_LEVEL_DEBUG);
  461. //content
  462. char* output_data = NULL;
  463. if (encrypt == 1) {
  464. char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
  465. int input_length = strlen(input_str_data) / 2;
  466. unsigned char* input_data = (unsigned char*)malloc(input_length);
  467. memset(input_data, 0, input_length);
  468. convertStrToUnChar(input_str_data, input_data);
  469. int output_length = input_length;
  470. output_data = (char*)malloc(input_length);
  471. memset(output_data, 0, input_length);
  472. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  473. input_data, input_length, (unsigned char*)output_data, &output_length);
  474. log.buffer = output_data;
  475. log.buffer_len = strlen(log.buffer) + 1;
  476. add_log_raw(builder, &log);
  477. free(input_data);
  478. }
  479. else if (encrypt == 2) {
  480. char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
  481. char* decoded_bytes = NULL;
  482. size_t decoded_length = 0;
  483. openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
  484. int SM4_length = decoded_length;
  485. char *SM4_data = (char*)malloc(decoded_length);
  486. memset(SM4_data, 0, decoded_length);
  487. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  488. (unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
  489. uLongf uncompress_length = SM4_length * 3;
  490. output_data = (char*)malloc(uncompress_length);
  491. memset(output_data, 0, uncompress_length);
  492. uncompress((unsigned char*)output_data, &uncompress_length, (unsigned char*)SM4_data, SM4_length);
  493. log.buffer = (char*)output_data;
  494. log.buffer_len = strlen(log.buffer) + 1;
  495. add_log_raw(builder, &log);
  496. free(SM4_data);
  497. free(decoded_bytes);
  498. }
  499. else if (encrypt == 3) {
  500. char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
  501. char* decoded_bytes = NULL;
  502. size_t decoded_length = 0;
  503. openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
  504. int SM4_length = decoded_length;
  505. char* SM4_data = (char*)malloc(decoded_length);
  506. memset(SM4_data, 0, decoded_length);
  507. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  508. (unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
  509. log.buffer = (char*)SM4_data;
  510. log.buffer_len = strlen(log.buffer) + 1;
  511. add_log_raw(builder, &log);
  512. free(SM4_data);
  513. free(decoded_bytes);
  514. }
  515. else {
  516. std::string src = (char*)q.getStringField(COLUMN_Content.c_str());
  517. #ifdef COMPRESS_CONTEXT
  518. unsigned char dst[10000] = "";
  519. uLongf dstLen = 10000;
  520. uncompress(dst, &dstLen, (unsigned char*)src.c_str(), src.length());
  521. log.buffer = (char*)dst;
  522. log.buffer_len = dstLen + 1;
  523. #else
  524. log.buffer = (char*)q.getStringField(COLUMN_Content.c_str());
  525. log.buffer_len = strlen(log.buffer) + 1;
  526. #endif // COMPRESS_CONTEXT
  527. add_log_raw(builder, &log);
  528. }
  529. strcpy(builder->modular, manager->file_name.c_str());
  530. if (output_data != NULL) {
  531. free(output_data);
  532. }
  533. //aos_debug_log((LB, "read last log db %s, uuid %s.", manager->file_name.c_str(), log.uuid));
  534. q.nextRow();
  535. }
  536. q.finalize();
  537. }
  538. catch (CppSQLite3Exception& e)
  539. {
  540. aos_error_log((LB, "db %s read logs error %s, querySql %s", manager->file_name.c_str(), e.errorMessage(), querySql.c_str()));
  541. log_group_destroy(builder);
  542. return NULL;
  543. }
  544. if (builder->grp->n_logs == 0) {
  545. log_group_destroy(builder);
  546. return NULL;
  547. }
  548. return builder;
  549. }
  550. int db_delete_old_logs(log_db_manager* manager, int count) {
  551. if (manager == NULL || manager->db == NULL) {
  552. aos_error_log((LB, "delete old logs db %s failed for null.", manager->file_name.c_str()));
  553. return false;
  554. }
  555. int ret = true;
  556. char strCount[64];
  557. itoa(count, strCount, 10);
  558. std::string sql = "delete from ";
  559. sql.append(manager->table_name);
  560. sql.append(" where "+ COLUMN_Uuid + " in (select " + COLUMN_Uuid + " from "+ manager->table_name +" order by " + COLUMN_DateTime + " ASC LIMIT " + strCount+")");
  561. sql.append(";");
  562. try {
  563. int CTRet = manager->db->execDML(sql.c_str());
  564. aos_debug_log((LB, "db %s delete old log result %d table name %s", manager->file_name.c_str(), CTRet, manager->table_name.c_str()));
  565. }
  566. catch (CppSQLite3Exception& e)
  567. {
  568. aos_error_log((LB, "db %s delete old log error %s", manager->file_name.c_str(), e.errorMessage()));
  569. ret = false;
  570. }
  571. return ret;
  572. }
  573. int db_delete_one(log_db_manager* manager, char* uuid) {
  574. if (manager == NULL || manager->db == NULL) {
  575. aos_error_log((LB, "delete one log db %s failed for null.", manager->file_name.c_str()));
  576. return false;
  577. }
  578. int ret = true;
  579. std::string sql = "delete from ";
  580. sql.append(manager->table_name);
  581. sql.append(" where "+ COLUMN_Uuid + " = '").append(uuid).append("';");
  582. try {
  583. int CTRet = manager->db->execDML(sql.c_str());
  584. /*
  585. aos_debug_log((LB, "db %s delete one uuid:%s log result %d", manager->file_name.c_str(), uuid, CTRet));
  586. if (CTRet != 1)
  587. MessageBox(NULL, NULL, NULL, 0);
  588. */
  589. }
  590. catch (CppSQLite3Exception& e)
  591. {
  592. aos_error_log((LB, "db %s delete one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), uuid));
  593. ret = false;
  594. }
  595. return ret;
  596. }
  597. #if defined(_WIN32)
  598. #include <windows.h>
  599. #else
  600. #include <dirent.h>
  601. #include <cstring>
  602. #endif
  603. #include <winpr/file.h>
  604. #include <uuid4.h>
  605. #include <winpr/library.h>
  606. #include "../libtoolkit/path.h"
  607. std::vector<std::string> scan_db_files(const std::string& directory) {
  608. std::vector<std::string> db_files;
  609. #if defined(_WIN32)
  610. std::string search_path = directory + "/RvcLogSdk_*.db";
  611. WIN32_FIND_DATA find_file_data;
  612. HANDLE hFind = FindFirstFile(search_path.c_str(), &find_file_data);
  613. if (hFind == INVALID_HANDLE_VALUE) {
  614. std::cerr << "No files found." << std::endl;
  615. }
  616. else {
  617. do {
  618. std::string filename = find_file_data.cFileName;
  619. if (filename.size() > 3 && filename.substr(filename.size() - 3) == ".db") {
  620. db_files.push_back(directory + "/" + filename);
  621. }
  622. } while (FindNextFile(hFind, &find_file_data) != 0);
  623. FindClose(hFind);
  624. }
  625. #else
  626. DIR* dir = opendir(directory.c_str());
  627. if (dir != nullptr) {
  628. struct dirent* entry;
  629. while ((entry = readdir(dir)) != nullptr) {
  630. std::string filename = entry->d_name;
  631. if (filename.rfind("RvcLogSdk_", 0) == 0 && filename.size() > 3 && filename.substr(filename.size() - 3) == ".db") {
  632. db_files.push_back(directory + "/" + filename);
  633. }
  634. }
  635. closedir(dir);
  636. }
  637. else {
  638. std::cerr << "Failed to open directory." << std::endl;
  639. }
  640. #endif
  641. return db_files;
  642. }
  643. int db_get_count(log_db_manager* manager) {
  644. static auto start_time = std::chrono::high_resolution_clock::now();
  645. if (manager == NULL || manager->db == NULL) {
  646. aos_error_log((LB, "get db %s count failed for null.", manager->file_name.c_str()));
  647. return 0;
  648. }
  649. int ret = 0;
  650. std::string sql = "select count(";
  651. sql.append(COLUMN_Uuid).append(") from ");
  652. sql.append(manager->table_name);
  653. try {
  654. ret = manager->db->execScalar(sql.c_str());
  655. g_notUploadLogNum = ret;
  656. //aos_debug_log((LB, "db %s get count %d", manager->file_name.c_str(), ret));
  657. }
  658. catch (CppSQLite3Exception& e)
  659. {
  660. aos_error_log((LB, "get db %s count error %s", manager->file_name.c_str(), e.errorMessage()));
  661. ret = 0;
  662. }
  663. auto elapsed_time = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::high_resolution_clock::now() - start_time);
  664. if (elapsed_time.count() > 120 && ret < 500)
  665. {
  666. db_move_to_main(manager);
  667. start_time = std::chrono::high_resolution_clock::now();
  668. }
  669. return ret;
  670. }
  671. int db_move_to_main(log_db_manager* manager)
  672. {
  673. if (manager == NULL || manager->db == NULL) {
  674. aos_error_log((LB, "db_move_to_main get db %s count failed for null.", manager->file_name.c_str()));
  675. return 0;
  676. }
  677. char tmp[MAX_PATH];
  678. GetModuleFileNameA(NULL, tmp, MAX_PATH);
  679. *strrchr(tmp, SPLIT_SLASH) = 0;
  680. *strrchr(tmp, SPLIT_SLASH) = 0;
  681. *strrchr(tmp, SPLIT_SLASH) = 0;
  682. *strrchr(tmp, SPLIT_SLASH) = 0;
  683. *strrchr(tmp, SPLIT_SLASH) = 0;
  684. sprintf(tmp, "%s" SPLIT_SLASH_STR "rvc" SPLIT_SLASH_STR "terminaldbstorage" SPLIT_SLASH_STR "RVC.LogSdk", tmp);
  685. auto db_files = scan_db_files(tmp);
  686. if (db_files.size() == 0)
  687. return 0;
  688. auto uuidStr = "sql"+uuid4_generate(8);
  689. int ret = true;
  690. char *zSql = sqlite3_mprintf(
  691. "ATTACH DATABASE \"%s\" AS %s;\n"
  692. "INSERT OR IGNORE INTO RvcLogTable SELECT * FROM %s.RvcLogTable;\n"
  693. "DELETE FROM %s.RvcLogTable;\n"
  694. "DETACH DATABASE %s;\n",
  695. db_files[0].c_str(), uuidStr.c_str(), uuidStr.c_str(), uuidStr.c_str(), uuidStr.c_str()
  696. );
  697. std::string sqlStr = zSql;
  698. sqlite3_free(zSql);
  699. try {
  700. ret = manager->db->execDML(sqlStr.c_str()); // if failed, it will throw exception
  701. DeleteFile(db_files[0].c_str());
  702. }
  703. catch (CppSQLite3Exception& e)
  704. {
  705. ret = false;
  706. }
  707. return ret;
  708. }
  709. int db_update_status(log_db_manager* manager, char* uuid, log_db_status_e status) {
  710. if (manager == NULL || manager->db == NULL) {
  711. aos_error_log((LB, "db %s update log status failed for null.", manager->file_name.c_str()));
  712. return false;
  713. }
  714. int ret = true;
  715. char strStatus[32];
  716. char strSendingStatus[32];
  717. sprintf(strSendingStatus, "%d", LOG_DB_STATUS_SENDING);
  718. sprintf(strStatus, "%d", status);
  719. std::string sql = "update ";
  720. sql.append(manager->table_name);
  721. sql.append(" set " + COLUMN_Status + " = ").append(strStatus);
  722. if (uuid == NULL) {
  723. //sql.append(";");
  724. sql.append(" where " + COLUMN_Status + " = ").append(strSendingStatus).append(";");
  725. }
  726. else {
  727. sql.append(" where " + COLUMN_Uuid + " = '").append(uuid).append("';");
  728. }
  729. try {
  730. int CTRet = manager->db->execDML(sql.c_str());
  731. //aos_debug_log((LB, "db %s update one uuid:%s status:%d log result %d", manager->file_name.c_str(), uuid, status, CTRet));
  732. }
  733. catch (CppSQLite3Exception& e)
  734. {
  735. aos_error_log((LB, "db %s update one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), uuid));
  736. ret = false;
  737. }
  738. return ret;
  739. }
  740. int db_is_exist_table_ex(log_db_manager* manager, char* tablename){
  741. if (manager == NULL || manager->db == NULL) {
  742. aos_error_log((LB, "db %s is exist table ex failed for null.", manager->file_name.c_str()));
  743. return false;
  744. }
  745. std::string beginStr = "select count(*) from sqlite_master where type ='table' and name='";
  746. std::string queryStr = beginStr.append(tablename).append("';");
  747. try {
  748. int Ret = 0;
  749. Ret = manager->db->execScalar(queryStr.c_str());
  750. if( 0 == Ret)
  751. return false;
  752. }
  753. catch (CppSQLite3Exception& e)
  754. {
  755. aos_error_log((LB, "db %s update one log error %s", manager->file_name.c_str(), e.errorMessage()));
  756. return false;
  757. }
  758. return true;
  759. }
  760. int db_get_tables(log_db_manager* manager, char** tables, int* table_count) {
  761. if (manager == NULL || manager->db == NULL) {
  762. aos_error_log((LB, "db %s get table names failed for null.", manager->file_name.c_str()));
  763. return false;
  764. }
  765. std::vector<std::string> table_vec;
  766. std::string queryStr = "select name from sqlite_master where type ='table' and name NOT LIKE 'sqlite_%'";
  767. try {
  768. CppSQLite3Query q = manager->db->execQuery(queryStr.c_str());
  769. while (!q.eof()) {
  770. char* table_name = (char*)q.getStringField("name");
  771. table_vec.insert(table_vec.begin(), table_name);
  772. q.nextRow();
  773. }
  774. q.finalize();
  775. *table_count = table_vec.size();
  776. tables = (char **)malloc(*table_count * sizeof(char *));
  777. for (int i = 0; i < *table_count; i++) {
  778. int len = table_vec[i].length();
  779. tables[i] = (char *)malloc(len + 1);
  780. strcpy(tables[i], table_vec[i].c_str());
  781. }
  782. }
  783. catch (CppSQLite3Exception& e)
  784. {
  785. aos_error_log((LB, "db %s get table names error %s", manager->file_name.c_str(), e.errorMessage()));
  786. return false;
  787. }
  788. return true;
  789. }
  790. int db_vacuum(log_db_manager* manager){
  791. int CTRet;
  792. try {
  793. CTRet = manager->db->execDML("VACUUM");
  794. aos_debug_log((LB, "db %s exec VACUUM result %d", manager->file_name.c_str(), CTRet));
  795. }
  796. catch (CppSQLite3Exception& e)
  797. {
  798. aos_error_log((LB, "db %s exec VACUUM error %s", manager->file_name.c_str(), e.errorMessage()));
  799. return false;
  800. }
  801. return true;
  802. }
  803. int db_transaction_begin(log_db_manager* manager) {
  804. int CTRet;
  805. try {
  806. CTRet = manager->db->execDML("begin;");
  807. //aos_debug_log((LB, "db %s exec begin result %d", manager->file_name.c_str(), CTRet));
  808. }
  809. catch (CppSQLite3Exception& e)
  810. {
  811. aos_error_log((LB, "db %s exec begin error %s", manager->file_name.c_str(), e.errorMessage()));
  812. return false;
  813. }
  814. return true;
  815. }
  816. int db_transaction_commit(log_db_manager* manager) {
  817. int CTRet;
  818. try {
  819. CTRet = manager->db->execDML("commit;");
  820. //aos_debug_log((LB, "db %s exec commit result %d", manager->file_name.c_str(), CTRet));
  821. }
  822. catch (CppSQLite3Exception& e)
  823. {
  824. aos_error_log((LB, "db %s exec commit error %s", manager->file_name.c_str(), e.errorMessage()));
  825. return false;
  826. }
  827. return true;
  828. }