log_db.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  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. }
  195. catch (CppSQLite3Exception& e)
  196. {
  197. aos_error_log((LB, "open log db %s error %s", manager->file_name.c_str(), e.errorMessage()));
  198. if (manager->db != NULL) {
  199. try {
  200. manager->db->close();
  201. }
  202. catch (...) {
  203. aos_error_log((LB, "close log db %s failed.", manager->file_name.c_str()));
  204. }
  205. delete manager->db;
  206. manager->db = NULL;
  207. }
  208. ret = false;
  209. }
  210. return ret;
  211. }
  212. void close_logdb(log_db_manager* manager)
  213. {
  214. if (manager!= NULL && manager->db != NULL) {
  215. try {
  216. manager->db->close();
  217. }
  218. catch (...) {
  219. aos_error_log((LB, "close log db %s failed.", manager->file_name.c_str()));
  220. }
  221. delete manager->db;
  222. manager->db = NULL;
  223. }
  224. }
  225. int drop_db(log_db_manager* manager)
  226. {
  227. if (manager == NULL || manager->db == NULL) {
  228. aos_error_log((LB, "drop log db %s failed for null.", manager->file_name.c_str()));
  229. return false;
  230. }
  231. bool ret = true;
  232. try {
  233. std::string strSql = "DROP TABLE IF EXISTS ";
  234. strSql.append(manager->table_name);
  235. int CTRet = manager->db->execDML(strSql.c_str());
  236. aos_debug_log((LB, "drop log db %s result %d table name %s", manager->file_name.c_str(), CTRet, manager->table_name.c_str()));
  237. }
  238. catch (CppSQLite3Exception& e)
  239. {
  240. aos_error_log((LB, "drop log db %s error %s", manager->file_name.c_str(), e.errorMessage()));
  241. ret = false;
  242. }
  243. return ret;
  244. }
  245. int db_insert_group(log_db_manager* manager, log_group_builder* builder) {
  246. if (manager == NULL || manager->db == NULL) {
  247. aos_error_log((LB, "insert log db %s failed for null.", manager->file_name.c_str()));
  248. return false;
  249. }
  250. int ret = true;
  251. serialize_buf buf;
  252. for (int i = 0; i < builder->grp->n_logs; i++) {
  253. memset(&buf, 0, sizeof(serialize_buf));
  254. serialize_to_buf(&builder->grp->logs[i], &buf);
  255. ret = db_insert_one(manager, &buf);
  256. }
  257. return ret;
  258. }
  259. int db_insert_one(log_db_manager* manager, serialize_buf* buf) {
  260. if (manager == NULL || manager->db == NULL) {
  261. aos_error_log((LB, "insert log db %s failed for null.", manager->file_name.c_str()));
  262. return false;
  263. }
  264. int ret = true;
  265. std::string strSql = "insert into ";
  266. long time = LOG_GET_TIME();
  267. char strTime[128];
  268. char strLevel[32];
  269. char strType[32];
  270. char strEncrypt[32];
  271. sprintf(strTime, "%ld", time);
  272. sprintf(strLevel, "%d", buf->level);
  273. sprintf(strType, "%d", buf->type);
  274. sprintf(strEncrypt, "%d", manager->config->usePersistentEncrypt);
  275. unsigned long end_time;
  276. unsigned long start_time = GetTickCount();
  277. //SM4加密,密文会比明文长16字节
  278. if (manager->config->usePersistentEncrypt == 1) {
  279. int input_length = strlen(buf->buffer) + 1;
  280. unsigned char* input_data = (unsigned char*)buf->buffer;
  281. int output_length = input_length + 16;
  282. unsigned char* output_data = (unsigned char*)malloc(output_length);
  283. CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, input_data, input_length, output_data, &output_length);
  284. char* output_str_data = (char*)malloc(output_length * 2 + 1);
  285. memset(output_str_data, 0, output_length * 2 + 1);
  286. convertUnCharTotr(output_str_data, output_data, output_length);
  287. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  288. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  289. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  290. append(strLevel).append(",").append(strType).append(",'").
  291. append(output_str_data).append("',").append(strEncrypt).append(",0)");
  292. free(output_data);
  293. free(output_str_data);
  294. end_time = GetTickCount();
  295. //aos_debug_log((LB, "db_insert_one Encrypt cust %d", end_time - start_time));
  296. }
  297. else if(manager->config->usePersistentEncrypt == 2)
  298. {
  299. int input_length = strlen(buf->buffer) + 1;
  300. unsigned char* input_data = (unsigned char*)buf->buffer;
  301. unsigned long compressLen = input_length * 2 + 1;
  302. unsigned char* compress_str_data = (unsigned char*)malloc(compressLen);
  303. memset(compress_str_data, 0, compressLen);
  304. compress(compress_str_data, &compressLen, (unsigned char*)input_data, input_length);
  305. int output_length = compressLen + 16;
  306. unsigned char* output_data = (unsigned char*)malloc(output_length);
  307. CMBSM4EncryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword, compress_str_data, compressLen, output_data, &output_length);
  308. char* output_str_data = openssl_base64_encode((char*)output_data, output_length);
  309. /*
  310. unsigned long len = output_length * 2 + 1;
  311. unsigned char* output_str_data = (unsigned char*)malloc(len);
  312. memset(output_str_data, 0, len);
  313. compress(output_str_data, &len, (unsigned char*)output_data, output_length);
  314. */
  315. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  316. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  317. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  318. append(strLevel).append(",").append(strType).append(",'").
  319. append((char*)output_str_data).append("',").append(strEncrypt).append(",0)");
  320. free(compress_str_data);
  321. free(output_data);
  322. free(output_str_data);
  323. end_time = GetTickCount();
  324. }
  325. else {
  326. #ifdef COMPRESS_CONTEXT
  327. unsigned char dstBuf[10000] = "";
  328. unsigned long len = 10000;
  329. compress(dstBuf, &len, (unsigned char*)buf->buffer, buf->buffer_len);
  330. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  331. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  332. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  333. append(strLevel).append(",").append(strType).append(",'").
  334. append((char*)dstBuf).append("',").append(strEncrypt).append(",0)");
  335. #else
  336. strSql.append(manager->table_name).append("(" + COLUMN_DateTime +
  337. "," + COLUMN_Uuid + "," + COLUMN_Level + "," + COLUMN_Type + "," + COLUMN_Content + "," + COLUMN_Encrypt + "," + COLUMN_Status +
  338. ") VALUES (").append(strTime).append(",'").append(buf->uuid).append("',").
  339. append(strLevel).append(",").append(strType).append(",'").
  340. append((char*)buf->buffer).append("',").append(strEncrypt).append(",0)");
  341. #endif
  342. }
  343. try {
  344. int CTRet = manager->db->execDML(strSql.c_str());
  345. end_time = GetTickCount();
  346. //aos_debug_log((LB, "db_insert_one execDML cust %d", end_time - start_time));
  347. //aos_debug_log((LB, "db %s insert one log result %d, log uuid %s", manager->file_name.c_str(), CTRet, buf->uuid));
  348. }
  349. catch (CppSQLite3Exception& e)
  350. {
  351. aos_error_log((LB, "db %s insert one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), buf->uuid));
  352. ret = false;
  353. }
  354. return ret;
  355. }
  356. log_group_builder* db_read_table_last_log(log_db_manager* manager, char *table_name) {
  357. if (manager == NULL || manager->db == NULL) {
  358. aos_error_log((LB, "read last log db %s failed for null.", manager->file_name.c_str()));
  359. return NULL;
  360. }
  361. build_item log;
  362. log_group_builder* builder = NULL;
  363. char strStatus[32];
  364. sprintf(strStatus, "%d", LOG_DB_STATUS_SENDING);
  365. std::string querySql = "select * from ";
  366. querySql.append(table_name);
  367. querySql.append(" where " + COLUMN_Status + " != ").append(strStatus);
  368. querySql.append(" order by " + COLUMN_DateTime + " DESC LIMIT 1;");
  369. try {
  370. CppSQLite3Query q = manager->db->execQuery(querySql.c_str());
  371. if (!q.eof()) {
  372. int encrypt = q.getIntField(COLUMN_Encrypt.c_str(), 0);
  373. log.type = (build_type_e)q.getIntField(COLUMN_Type.c_str(), LOG_TYPE_BEIDOU);
  374. strcpy(log.uuid, q.getStringField(COLUMN_Uuid.c_str()));
  375. log.level = (LOG_LEVEL_E)q.getIntField(COLUMN_Level.c_str(), LOG_LEVEL_DEBUG);
  376. //content
  377. char* output_data = NULL;
  378. if (encrypt == 1) {
  379. char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
  380. int input_length = strlen(input_str_data) / 2;
  381. unsigned char* input_data = (unsigned char*)malloc(input_length);
  382. convertStrToUnChar(input_str_data, input_data);
  383. int output_length = input_length;
  384. output_data = (char*)malloc(input_length);
  385. memset(output_data, 0, input_length);
  386. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  387. input_data, input_length, (unsigned char*)output_data, &output_length);
  388. log.buffer = output_data;
  389. log.buffer_len = strlen(log.buffer) + 1;
  390. free(input_data);
  391. }
  392. else if (encrypt == 2) {
  393. char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
  394. /*
  395. uLongf input_length = strlen(input_str_data);
  396. unsigned char* input_data = (unsigned char*)malloc(input_length);
  397. uncompress(input_data, &input_length, (unsigned char*)input_str_data, strlen(input_str_data));
  398. */
  399. char* decoded_bytes = NULL;
  400. size_t decoded_length = 0;
  401. openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
  402. int SM4_length = decoded_length;
  403. char* SM4_data = (char*)malloc(decoded_length);
  404. memset(SM4_data, 0, decoded_length);
  405. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  406. (unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
  407. uLongf uncompress_length = SM4_length;
  408. output_data = (char*)malloc(uncompress_length);
  409. memset(output_data, 0, uncompress_length);
  410. uncompress((unsigned char*)output_data, &uncompress_length, (unsigned char*)SM4_data, SM4_length);
  411. log.buffer = (char*)output_data;
  412. log.buffer_len = strlen(log.buffer) + 1;
  413. free(SM4_data);
  414. free(decoded_bytes);
  415. }
  416. else {
  417. std::string src = (char*)q.getStringField(COLUMN_Content.c_str());
  418. #ifdef COMPRESS_CONTEXT
  419. unsigned char dst[10000] = "";
  420. uLongf dstLen = 10000;
  421. uncompress(dst, &dstLen, (unsigned char*)src.c_str(), src.length());
  422. log.buffer = (char*)dst;
  423. log.buffer_len = dstLen + 1;
  424. #else
  425. log.buffer = (char*)q.getStringField(COLUMN_Content.c_str());
  426. log.buffer_len = strlen(log.buffer) + 1;
  427. #endif
  428. }
  429. builder = log_group_create(manager->config);
  430. strcpy(builder->modular, manager->file_name.c_str());
  431. add_log_raw(builder, &log);
  432. if (output_data != NULL) {
  433. free(output_data);
  434. }
  435. //aos_debug_log((LB, "read last log db %s, uuid %s.", manager->file_name.c_str(), log.uuid));
  436. }
  437. q.finalize();
  438. }
  439. catch (CppSQLite3Exception& e)
  440. {
  441. aos_error_log((LB, "db %s read one log error %s", manager->file_name.c_str(), e.errorMessage()));
  442. return NULL;
  443. }
  444. return builder;
  445. }
  446. log_group_builder* db_read_last_log(log_db_manager* manager) {
  447. return db_read_table_last_log(manager, (char *)(manager->table_name.c_str()));
  448. }
  449. int getReadType()
  450. {
  451. static unsigned int sum = 0;
  452. sum = sum % 100;
  453. sum++;
  454. int cmpData = sum % 11;
  455. if (cmpData <= 5)
  456. return build_type_e::LOG_TYPE_SYS_SKYEYE;
  457. else if (cmpData <= 6)
  458. return build_type_e::LOG_TYPE_BEIDOU;
  459. else if (cmpData <= 7)
  460. return build_type_e::LOG_TYPE_USER_SKYEYE;
  461. else if (cmpData <= 8)
  462. return build_type_e::LOG_TYPE_USER_BUSINESS;
  463. else if (cmpData <= 9)
  464. return build_type_e::LOG_TYPE_SYS_BUSINESS;
  465. else if (cmpData <= 10)
  466. return build_type_e::LOG_TYPE_WEBSDK;
  467. else
  468. return 1;
  469. }
  470. log_group_builder* db_read_table_last_logs(log_db_manager* manager, int count) {
  471. if (manager == NULL || manager->db == NULL) {
  472. aos_error_log((LB, "read last logs db %s failed for null.", manager->file_name.c_str()));
  473. return NULL;
  474. }
  475. build_item log;
  476. char strStatus[32];
  477. char strCount[32];
  478. log_group_builder* builder = log_group_create(manager->config);
  479. sprintf(strStatus, "%d", LOG_DB_STATUS_SENDING);
  480. sprintf(strCount, "%d", count);
  481. std::string querySql = "select * from ";
  482. querySql.append(manager->table_name);
  483. int readType = getReadType();
  484. querySql.append(" where " + COLUMN_Status + " != ").append(strStatus).append(" AND ").append(COLUMN_Type).append("=").append(std::to_string((long long)readType));
  485. querySql.append(/*" order by " + COLUMN_DateTime + */" LIMIT ").append(strCount).append(";");
  486. try {
  487. CppSQLite3Query q = manager->db->execQuery(querySql.c_str());
  488. if (q.eof())
  489. {
  490. //if can not find, try to get LOG_TYPE_SYS_SKYEYE logs
  491. std::string searchSys= "select * from ";
  492. searchSys.append(manager->table_name);
  493. searchSys.append(" where " + COLUMN_Status + " != ").append(strStatus).append(strStatus).append(" AND ").append(COLUMN_Type).append("=").append(std::to_string(LOG_TYPE_SYS_SKYEYE));
  494. searchSys.append(/*" order by " + COLUMN_DateTime + */" LIMIT ").append(strCount).append(";");
  495. q = manager->db->execQuery(searchSys.c_str());
  496. }
  497. while (!q.eof()) {
  498. int encrypt = q.getIntField(COLUMN_Encrypt.c_str(), 0);
  499. log.type = (build_type_e)q.getIntField(COLUMN_Type.c_str(), LOG_TYPE_USER_SKYEYE);
  500. //只获取同一类型的日志
  501. if (builder->grp->n_logs != 0 && builder->grp->logs[0].type != log.type) {
  502. q.nextRow();
  503. continue;
  504. }
  505. strcpy(log.uuid, q.getStringField(COLUMN_Uuid.c_str()));
  506. log.level = (LOG_LEVEL_E)q.getIntField(COLUMN_Level.c_str(), LOG_LEVEL_DEBUG);
  507. //content
  508. char* output_data = NULL;
  509. if (encrypt == 1) {
  510. char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
  511. int input_length = strlen(input_str_data) / 2;
  512. unsigned char* input_data = (unsigned char*)malloc(input_length);
  513. memset(input_data, 0, input_length);
  514. convertStrToUnChar(input_str_data, input_data);
  515. int output_length = input_length;
  516. output_data = (char*)malloc(input_length);
  517. memset(output_data, 0, input_length);
  518. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  519. input_data, input_length, (unsigned char*)output_data, &output_length);
  520. log.buffer = output_data;
  521. log.buffer_len = strlen(log.buffer) + 1;
  522. free(input_data);
  523. }
  524. else if (encrypt == 2) {
  525. char* input_str_data = (char*)q.getStringField(COLUMN_Content.c_str());
  526. /*
  527. uLongf input_length = strlen(input_str_data);
  528. unsigned char* input_data = (unsigned char*)malloc(input_length);
  529. uncompress(input_data, &input_length, (unsigned char*)input_str_data, strlen(input_str_data));
  530. */
  531. char* decoded_bytes = NULL;
  532. size_t decoded_length = 0;
  533. openssl_base64_decode(input_str_data, &decoded_bytes, &decoded_length);
  534. int SM4_length = decoded_length;
  535. char *SM4_data = (char*)malloc(decoded_length);
  536. memset(SM4_data, 0, decoded_length);
  537. CMBSM4DecryptWithECB((unsigned char*)manager->config->PersistentEncryptPassword,
  538. (unsigned char*)decoded_bytes, decoded_length, (unsigned char*)SM4_data, &SM4_length);
  539. uLongf uncompress_length = SM4_length * 3;
  540. output_data = (char*)malloc(uncompress_length);
  541. memset(output_data, 0, uncompress_length);
  542. uncompress((unsigned char*)output_data, &uncompress_length, (unsigned char*)SM4_data, SM4_length);
  543. log.buffer = (char*)output_data;
  544. log.buffer_len = strlen(log.buffer) + 1;
  545. free(SM4_data);
  546. free(decoded_bytes);
  547. }
  548. else {
  549. std::string src = (char*)q.getStringField(COLUMN_Content.c_str());
  550. #ifdef COMPRESS_CONTEXT
  551. unsigned char dst[10000] = "";
  552. uLongf dstLen = 10000;
  553. uncompress(dst, &dstLen, (unsigned char*)src.c_str(), src.length());
  554. log.buffer = (char*)dst;
  555. log.buffer_len = dstLen + 1;
  556. #else
  557. log.buffer = (char*)q.getStringField(COLUMN_Content.c_str());
  558. log.buffer_len = strlen(log.buffer) + 1;
  559. #endif // COMPRESS_CONTEXT
  560. }
  561. strcpy(builder->modular, manager->file_name.c_str());
  562. add_log_raw(builder, &log);
  563. if (output_data != NULL) {
  564. free(output_data);
  565. }
  566. //aos_debug_log((LB, "read last log db %s, uuid %s.", manager->file_name.c_str(), log.uuid));
  567. q.nextRow();
  568. }
  569. q.finalize();
  570. }
  571. catch (CppSQLite3Exception& e)
  572. {
  573. aos_error_log((LB, "db %s read logs error %s, querySql %s", manager->file_name.c_str(), e.errorMessage(), querySql.c_str()));
  574. log_group_destroy(builder);
  575. return NULL;
  576. }
  577. if (builder->grp->n_logs == 0) {
  578. log_group_destroy(builder);
  579. return NULL;
  580. }
  581. return builder;
  582. }
  583. int db_delete_old_logs(log_db_manager* manager, int count) {
  584. if (manager == NULL || manager->db == NULL) {
  585. aos_error_log((LB, "delete old logs db %s failed for null.", manager->file_name.c_str()));
  586. return false;
  587. }
  588. int ret = true;
  589. char strCount[64];
  590. itoa(count, strCount, 10);
  591. std::string sql = "delete from ";
  592. sql.append(manager->table_name);
  593. sql.append(" where "+ COLUMN_Uuid + " in (select " + COLUMN_Uuid + " from "+ manager->table_name +" order by " + COLUMN_DateTime + " ASC LIMIT " + strCount+")");
  594. sql.append(";");
  595. try {
  596. int CTRet = manager->db->execDML(sql.c_str());
  597. 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()));
  598. }
  599. catch (CppSQLite3Exception& e)
  600. {
  601. aos_error_log((LB, "db %s delete old log error %s", manager->file_name.c_str(), e.errorMessage()));
  602. ret = false;
  603. }
  604. return ret;
  605. }
  606. int db_delete_one(log_db_manager* manager, char* uuid) {
  607. if (manager == NULL || manager->db == NULL) {
  608. aos_error_log((LB, "delete one log db %s failed for null.", manager->file_name.c_str()));
  609. return false;
  610. }
  611. int ret = true;
  612. std::string sql = "delete from ";
  613. sql.append(manager->table_name);
  614. sql.append(" where "+ COLUMN_Uuid + " = '").append(uuid).append("';");
  615. try {
  616. int CTRet = manager->db->execDML(sql.c_str());
  617. //aos_debug_log((LB, "db %s delete one uuid:%s log result %d", manager->file_name.c_str(), uuid, CTRet));
  618. }
  619. catch (CppSQLite3Exception& e)
  620. {
  621. aos_error_log((LB, "db %s delete one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), uuid));
  622. ret = false;
  623. }
  624. return ret;
  625. }
  626. int db_get_count(log_db_manager* manager) {
  627. if (manager == NULL || manager->db == NULL) {
  628. aos_error_log((LB, "get db %s count failed for null.", manager->file_name.c_str()));
  629. return 0;
  630. }
  631. int ret = 0;
  632. std::string sql = "select count(";
  633. sql.append(COLUMN_Uuid).append(") from ");
  634. sql.append(manager->table_name);
  635. try {
  636. ret = manager->db->execScalar(sql.c_str());
  637. //aos_debug_log((LB, "db %s get count %d", manager->file_name.c_str(), ret));
  638. }
  639. catch (CppSQLite3Exception& e)
  640. {
  641. aos_error_log((LB, "get db %s count error %s", manager->file_name.c_str(), e.errorMessage()));
  642. ret = 0;
  643. }
  644. return ret;
  645. }
  646. int db_update_status(log_db_manager* manager, char* uuid, log_db_status_e status) {
  647. if (manager == NULL || manager->db == NULL) {
  648. aos_error_log((LB, "db %s update log status failed for null.", manager->file_name.c_str()));
  649. return false;
  650. }
  651. int ret = true;
  652. char strStatus[32];
  653. char strSendingStatus[32];
  654. sprintf(strSendingStatus, "%d", LOG_DB_STATUS_SENDING);
  655. sprintf(strStatus, "%d", status);
  656. std::string sql = "update ";
  657. sql.append(manager->table_name);
  658. sql.append(" set " + COLUMN_Status + " = ").append(strStatus);
  659. if (uuid == NULL) {
  660. //sql.append(";");
  661. sql.append(" where " + COLUMN_Status + " = ").append(strSendingStatus).append(";");
  662. }
  663. else {
  664. sql.append(" where " + COLUMN_Uuid + " = '").append(uuid).append("';");
  665. }
  666. try {
  667. int CTRet = manager->db->execDML(sql.c_str());
  668. //aos_debug_log((LB, "db %s update one uuid:%s status:%d log result %d", manager->file_name.c_str(), uuid, status, CTRet));
  669. }
  670. catch (CppSQLite3Exception& e)
  671. {
  672. aos_error_log((LB, "db %s update one log error %s, log uuid %s", manager->file_name.c_str(), e.errorMessage(), uuid));
  673. ret = false;
  674. }
  675. return ret;
  676. }
  677. int db_is_exist_table_ex(log_db_manager* manager, char* tablename){
  678. if (manager == NULL || manager->db == NULL) {
  679. aos_error_log((LB, "db %s is exist table ex failed for null.", manager->file_name.c_str()));
  680. return false;
  681. }
  682. std::string beginStr = "select count(*) from sqlite_master where type ='table' and name='";
  683. std::string queryStr = beginStr.append(tablename).append("';");
  684. try {
  685. int Ret = 0;
  686. Ret = manager->db->execScalar(queryStr.c_str());
  687. if( 0 == Ret)
  688. return false;
  689. }
  690. catch (CppSQLite3Exception& e)
  691. {
  692. aos_error_log((LB, "db %s update one log error %s", manager->file_name.c_str(), e.errorMessage()));
  693. return false;
  694. }
  695. return true;
  696. }
  697. int db_get_tables(log_db_manager* manager, char** tables, int* table_count) {
  698. if (manager == NULL || manager->db == NULL) {
  699. aos_error_log((LB, "db %s get table names failed for null.", manager->file_name.c_str()));
  700. return false;
  701. }
  702. std::vector<std::string> table_vec;
  703. std::string queryStr = "select name from sqlite_master where type ='table' and name NOT LIKE 'sqlite_%'";
  704. try {
  705. CppSQLite3Query q = manager->db->execQuery(queryStr.c_str());
  706. while (!q.eof()) {
  707. char* table_name = (char*)q.getStringField("name");
  708. table_vec.insert(table_vec.begin(), table_name);
  709. q.nextRow();
  710. }
  711. q.finalize();
  712. *table_count = table_vec.size();
  713. tables = (char **)malloc(*table_count * sizeof(char *));
  714. for (int i = 0; i < *table_count; i++) {
  715. int len = table_vec[i].length();
  716. tables[i] = (char *)malloc(len + 1);
  717. strcpy(tables[i], table_vec[i].c_str());
  718. }
  719. }
  720. catch (CppSQLite3Exception& e)
  721. {
  722. aos_error_log((LB, "db %s get table names error %s", manager->file_name.c_str(), e.errorMessage()));
  723. return false;
  724. }
  725. return true;
  726. }
  727. int db_vacuum(log_db_manager* manager){
  728. int CTRet;
  729. try {
  730. CTRet = manager->db->execDML("VACUUM");
  731. aos_debug_log((LB, "db %s exec VACUUM result %d", manager->file_name.c_str(), CTRet));
  732. }
  733. catch (CppSQLite3Exception& e)
  734. {
  735. aos_error_log((LB, "db %s exec VACUUM error %s", manager->file_name.c_str(), e.errorMessage()));
  736. return false;
  737. }
  738. return true;
  739. }
  740. int db_transaction_begin(log_db_manager* manager) {
  741. int CTRet;
  742. try {
  743. CTRet = manager->db->execDML("begin;");
  744. //aos_debug_log((LB, "db %s exec begin result %d", manager->file_name.c_str(), CTRet));
  745. }
  746. catch (CppSQLite3Exception& e)
  747. {
  748. aos_error_log((LB, "db %s exec begin error %s", manager->file_name.c_str(), e.errorMessage()));
  749. return false;
  750. }
  751. return true;
  752. }
  753. int db_transaction_commit(log_db_manager* manager) {
  754. int CTRet;
  755. try {
  756. CTRet = manager->db->execDML("commit;");
  757. //aos_debug_log((LB, "db %s exec commit result %d", manager->file_name.c_str(), CTRet));
  758. }
  759. catch (CppSQLite3Exception& e)
  760. {
  761. aos_error_log((LB, "db %s exec commit error %s", manager->file_name.c_str(), e.errorMessage()));
  762. return false;
  763. }
  764. return true;
  765. }