log_db.cpp 27 KB

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