log_persistent_manager.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. #include "log_persistent_manager.h"
  2. #include "log_producer_manager.h"
  3. #include "inner_log.h"
  4. #include "log_builder.h"
  5. #include "sds.h"
  6. #include "baseFun.h"
  7. #ifndef _WIN32
  8. #include <sys/types.h>
  9. #include <dirent.h>
  10. #include <sys/stat.h>
  11. #endif //NOT _WIN32
  12. #define DB_TABLE_NAME "RvcLogTable"
  13. #if defined(_MSC_VER)
  14. #define DB_PATH "RVC.LogSdk\\"
  15. #else
  16. #define DB_PATH "RVC.LogSdk/"
  17. #endif //_MSC_VER
  18. #define SLASH '/'
  19. #define BACK_SLASH '\\'
  20. #define MB_SLASH_STR "/"
  21. #define MB_BACK_SLASH_STR "\\"
  22. #define W_SLASH_STR L"/"
  23. #define W_BACK_SLASH_STR L"\\"
  24. #if defined(UNICODE) || defined(_UNICODE)
  25. #define SLASH_STR W_SLASH_STR
  26. #define BACK_SLASH_STR W_BACK_SLASH_STR
  27. #else
  28. #define SLASH_STR MB_SLASH_STR
  29. #define BACK_SLASH_STR MB_BACK_SLASH_STR
  30. #endif
  31. #ifdef _WIN32
  32. #define SPLIT_SLASH BACK_SLASH
  33. #define SPLIT_SLASH_STR BACK_SLASH_STR
  34. #define MB_SPLIT_SLASH_STR MB_BACK_SLASH_STR
  35. #define W_SPLIT_SLASH_STR W_BACK_SLASH_STR
  36. #define LINE_BREAK_STR "\r\n"
  37. #else
  38. #define SPLIT_SLASH SLASH
  39. #define SPLIT_SLASH_STR SLASH_STR
  40. #define MB_SPLIT_SLASH_STR MB_SLASH_STR
  41. #define W_SPLIT_SLASH_STR W_SLASH_STR
  42. #define LINE_BREAK_STR "\n"
  43. #endif
  44. static void _copy_config_string(const char* value, sds* src_value)
  45. {
  46. int strLen;
  47. if (value == NULL || src_value == NULL)
  48. {
  49. return;
  50. }
  51. strLen = strlen(value);
  52. if (*src_value == NULL)
  53. {
  54. *src_value = sdsnewEmpty(strLen);
  55. }
  56. else {
  57. sdsfree(*src_value);
  58. }
  59. *src_value = sdscpylen(*src_value, value, strLen);
  60. }
  61. static log_db_manager* create_db_manager(log_persistent_manager* manager, char * modular) {
  62. int ret = 0;
  63. log_db_manager* guard_db_manager = NULL;
  64. char tmpFilePath[MAX_PATH] = { 0 };
  65. int len = strlen(manager->config->persistentFilePath);
  66. strcpy(tmpFilePath, manager->config->persistentFilePath);
  67. if (manager->config->persistentFilePath[len - 1] == '\\' || manager->config->persistentFilePath[len - 1] == '/') {
  68. strcat(tmpFilePath, DB_PATH);
  69. }
  70. else {
  71. strcat(tmpFilePath, SPLIT_SLASH_STR);
  72. strcat(tmpFilePath, DB_PATH);
  73. }
  74. guard_db_manager = create_log_db(manager->config, tmpFilePath, modular, DB_TABLE_NAME);
  75. if (guard_db_manager != NULL) {
  76. ret = open_db(guard_db_manager);
  77. if (ret <= 0) {
  78. destroy_log_db(guard_db_manager);
  79. guard_db_manager = NULL;
  80. }
  81. }
  82. return guard_db_manager;
  83. }
  84. static int log_persistent_manager_update_guard_log_status(log_persistent_manager* manager,
  85. char* modular, int send_count, char uuid[MAX_LOG_COUNT][MAX_UUID_LEN], log_db_status_e status) {
  86. log_db_manager* guard_db_manager = NULL;
  87. int i, op_count = 0;
  88. guard_db_manager = create_db_manager(manager, modular);
  89. if (guard_db_manager != NULL) {
  90. db_transaction_begin(guard_db_manager);
  91. for (i = 0; i < send_count; i++) {
  92. op_count += db_update_status(guard_db_manager, uuid[i], status);
  93. }
  94. db_transaction_commit(guard_db_manager);
  95. destroy_log_db(guard_db_manager);
  96. }
  97. else {
  98. return FALSE;
  99. }
  100. return op_count;
  101. }
  102. static int log_persistent_manager_delete_guard_log(log_persistent_manager* manager,
  103. char* modular, int send_count, char uuid[MAX_LOG_COUNT][MAX_UUID_LEN]) {
  104. log_db_manager* guard_db_manager = NULL;
  105. int ret, i, op_count = 0;
  106. guard_db_manager = create_db_manager(manager, modular);
  107. if (guard_db_manager != NULL) {
  108. db_transaction_begin(guard_db_manager);
  109. for (i = 0; i < send_count; i++) {
  110. op_count += db_delete_one(guard_db_manager, uuid[i]);
  111. }
  112. db_transaction_commit(guard_db_manager);
  113. destroy_log_db(guard_db_manager);
  114. }
  115. else {
  116. return FALSE;
  117. }
  118. return op_count;
  119. }
  120. void on_log_persistent_manager_send_done_uuid(
  121. log_producer_result result,
  122. int log_bytes,
  123. int compressed_bytes,
  124. const char* req_id,
  125. const char* error_message,
  126. const unsigned char* raw_buffer,
  127. void* persistent_manager,
  128. int send_count,
  129. char uuid[MAX_LOG_COUNT][MAX_UUID_LEN],
  130. char* modular)
  131. {
  132. int i;
  133. char tmpFileName[MAX_PATH] = { 0 };
  134. log_persistent_manager* manager = (log_persistent_manager*)persistent_manager;
  135. if (manager == NULL)
  136. {
  137. return;
  138. }
  139. strcat(tmpFileName, "RvcLogSdk.db"/*manager->config->skyeyeEntityName*/);
  140. /*如果异常,则将条目恢复成待发送状态*/
  141. if (result != LOG_PRODUCER_OK && result != LOG_PRODUCER_DROP_ERROR && result != LOG_PRODUCER_INVALID)
  142. {
  143. CS_ENTER(manager->lock);
  144. log_persistent_manager_updata_log_status(manager, modular, send_count, uuid, LOG_DB_STATUS_WAITING);
  145. CS_LEAVE(manager->lock);
  146. return;
  147. }
  148. CS_ENTER(manager->lock);
  149. if (strcmp(modular,tmpFileName)==0) {
  150. db_transaction_begin(manager->db_manager);
  151. for (i = 0; i < send_count; i++) {
  152. log_persistent_manager_delete_log(manager, uuid[i]);
  153. }
  154. db_transaction_commit(manager->db_manager);
  155. }
  156. else {
  157. log_persistent_manager_delete_guard_log(manager, modular, send_count, uuid);
  158. }
  159. CS_LEAVE(manager->lock);
  160. }
  161. static int log_persistent_manager_init(log_persistent_manager* manager, log_producer_config* config)
  162. {
  163. int ret;
  164. int len;
  165. char tmpFilePath[MAX_PATH] = {0};
  166. char tmpFileName[MAX_PATH] = { 0 };
  167. if (config->persistentFilePath == NULL) {
  168. return -1;
  169. }
  170. memset(manager, 0, sizeof(log_persistent_manager));
  171. manager->config = config;
  172. manager->lock = CreateCriticalSection();
  173. len = strlen(config->persistentFilePath);
  174. strcpy(tmpFilePath, config->persistentFilePath);
  175. if (config->persistentFilePath[len - 1] == '\\' || config->persistentFilePath[len - 1] == '/') {
  176. strcat(tmpFilePath, DB_PATH);
  177. }
  178. else {
  179. strcat(tmpFilePath, SPLIT_SLASH_STR);
  180. strcat(tmpFilePath, DB_PATH);
  181. }
  182. strcat(tmpFileName, "RvcLogSdk.db");//config->skyeyeEntityName);
  183. manager->db_manager = create_log_db(config, tmpFilePath, tmpFileName, DB_TABLE_NAME);
  184. _copy_config_string(tmpFileName, &manager->db_name);
  185. if (manager->db_manager == NULL) {
  186. return -1;
  187. }
  188. ret = open_db(manager->db_manager);
  189. if (ret <= 0) {
  190. return -1;
  191. }
  192. if (config->openDB == 0)
  193. close_logdb(manager->db_manager);
  194. return 0;
  195. }
  196. static void log_persistent_manager_clear(log_persistent_manager* manager)
  197. {
  198. ReleaseCriticalSection(manager->lock);
  199. close_logdb(manager->db_manager);
  200. }
  201. log_persistent_manager* create_log_persistent_manager(log_producer_config* config)
  202. {
  203. int rst;
  204. log_persistent_manager* manager;
  205. if (!log_producer_persistent_config_is_enabled(config))
  206. {
  207. return NULL;
  208. }
  209. manager = (log_persistent_manager*)malloc(sizeof(log_persistent_manager));
  210. rst = log_persistent_manager_init(manager, config);
  211. if (rst < 0) {
  212. free(manager);
  213. return NULL;
  214. }
  215. return manager;
  216. }
  217. void destroy_log_persistent_manager(log_persistent_manager* manager)
  218. {
  219. if (manager == NULL)
  220. {
  221. return;
  222. }
  223. log_persistent_manager_clear(manager);
  224. sdsfree(manager->db_name);
  225. free(manager);
  226. manager = NULL;
  227. }
  228. int log_persistent_manager_save_log_group(log_persistent_manager* manager, log_group_builder* builder)
  229. {
  230. unsigned long end_time;
  231. unsigned long start_time = GetTickCount();
  232. int rst = db_insert_group(manager->db_manager, builder);
  233. end_time = GetTickCount();
  234. //aos_debug_log((LB, "write db log cust %d", end_time - start_time));
  235. if (rst <= 0) {
  236. aos_error_log((LB, "write db log failed, rst %d",
  237. rst));
  238. return LOG_PRODUCER_PERSISTENT_ERROR;
  239. }
  240. else {
  241. return LOG_PRODUCER_OK;
  242. }
  243. }
  244. int log_persistent_manager_save_log(log_persistent_manager* manager, serialize_buf* buf)
  245. {
  246. //unsigned long end_time;
  247. //unsigned long start_time = GetTickCount();
  248. // it would not generate dirty logs
  249. int rst = db_insert_one(manager->db_manager, buf);
  250. //end_time = GetTickCount();
  251. //aos_debug_log((LB, "write db log cust %d", end_time - start_time));
  252. if (rst <= 0) {
  253. aos_error_log((LB, "write db log failed, rst %d",
  254. rst));
  255. return LOG_PRODUCER_PERSISTENT_ERROR;
  256. }
  257. else {
  258. return LOG_PRODUCER_OK;
  259. }
  260. }
  261. static log_group_builder* log_persistent_manager_get_guard_log(log_persistent_manager* manager)
  262. {
  263. #if defined(_MSC_VER)
  264. static int read_file_index = 0;
  265. char srcFilePath[MAX_PATH] = { 0 };
  266. WIN32_FIND_DATA FindFileData;
  267. HANDLE hFind;
  268. BOOL fFinished = FALSE;
  269. log_db_manager* guard_db_manager = NULL;
  270. int i;
  271. char tmpFilePath[MAX_PATH] = { 0 };
  272. int len = strlen(manager->config->persistentFilePath);
  273. strcpy(tmpFilePath, manager->config->persistentFilePath);
  274. if (manager->config->persistentFilePath[len - 1] == '\\' || manager->config->persistentFilePath[len - 1] == '/') {
  275. strcat(tmpFilePath, DB_PATH);
  276. } else {
  277. strcat(tmpFilePath, "\\");
  278. strcat(tmpFilePath, DB_PATH);
  279. }
  280. sprintf_s(srcFilePath, MAX_PATH, "%s*.db", tmpFilePath);
  281. hFind = FindFirstFile(srcFilePath, &FindFileData);
  282. if (INVALID_HANDLE_VALUE != hFind) {
  283. for (i = 0; !fFinished; i++) {
  284. if ((FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) || (i < read_file_index)) {
  285. if (!FindNextFile(hFind, &FindFileData)) {
  286. if (GetLastError() == ERROR_NO_MORE_FILES) {
  287. read_file_index = 0;
  288. fFinished = TRUE;
  289. } else {
  290. break;
  291. }
  292. }
  293. continue;
  294. }
  295. aos_debug_log((LB, "guard read log db name %s", FindFileData.cFileName));
  296. if (strcmp(manager->db_name, FindFileData.cFileName) != 0) {
  297. guard_db_manager = create_db_manager(manager, FindFileData.cFileName);
  298. if (guard_db_manager != NULL) {
  299. log_group_builder* builder = db_read_table_last_logs(guard_db_manager, manager->config->logCountPerPackage);
  300. destroy_log_db(guard_db_manager);
  301. if (builder != NULL) {
  302. read_file_index++;
  303. FindClose(hFind);
  304. return builder;
  305. }
  306. }
  307. } else {
  308. log_group_builder* builder = db_read_table_last_logs(manager->db_manager, manager->config->logCountPerPackage);
  309. if (builder != NULL) {
  310. read_file_index++;
  311. FindClose(hFind);
  312. return builder;
  313. }
  314. }
  315. if (!FindNextFile(hFind, &FindFileData)) {
  316. if (GetLastError() == ERROR_NO_MORE_FILES) {
  317. read_file_index = 0;
  318. fFinished = TRUE;
  319. } else {
  320. break;
  321. }
  322. }
  323. }
  324. FindClose(hFind);
  325. }
  326. return NULL;
  327. #else
  328. static int read_file_index = 0;
  329. DIR* d = NULL;
  330. struct dirent* dp = NULL;
  331. struct stat st;
  332. char srcFilePath[MAX_PATH] = { 0 };
  333. BOOL fFinished = FALSE;
  334. log_db_manager* guard_db_manager = NULL;
  335. int ret, i;
  336. char tmpFilePath[MAX_PATH] = { 0 };
  337. const int len = strlen(manager->config->persistentFilePath);
  338. strcpy(tmpFilePath, manager->config->persistentFilePath);
  339. if (manager->config->persistentFilePath[len - 1] == '\\' || manager->config->persistentFilePath[len - 1] == '/') {
  340. strcat(tmpFilePath, DB_PATH);
  341. tmpFilePath[strlen(tmpFilePath) - 1] = '\0';
  342. } else {
  343. strcat(tmpFilePath, SPLIT_SLASH_STR);
  344. strcat(tmpFilePath, DB_PATH);
  345. tmpFilePath[strlen(tmpFilePath) - 1] = '\0';
  346. }
  347. if (stat(tmpFilePath, &st) < 0 || !S_ISDIR(st.st_mode)) {
  348. return NULL;
  349. }
  350. if (!(d = opendir(tmpFilePath))) {
  351. return NULL;
  352. }
  353. while ((dp = readdir(d)) != NULL) {
  354. if ((!strncmp(dp->d_name, ".", 1)) || (!strncmp(dp->d_name, "..", 2))) {
  355. continue;
  356. }
  357. int isdir = 0;
  358. struct stat st1;
  359. sprintf(srcFilePath, "%s/%s", tmpFilePath, dp->d_name);
  360. if (stat(srcFilePath, &st1) < 0) {
  361. continue;
  362. }
  363. isdir = !!(S_ISDIR(st1.st_mode));
  364. if (isdir) {
  365. continue;
  366. }
  367. if (strstr(dp->d_name, ".db") == NULL) {
  368. continue;
  369. }
  370. if (i < read_file_index) {
  371. i++;
  372. continue;
  373. }
  374. aos_debug_log((LB, "guard read log db name %s", dp->d_name));
  375. if (strcmp(manager->db_name, dp->d_name) != 0) {
  376. guard_db_manager = create_db_manager(manager, dp->d_name);
  377. if (guard_db_manager != NULL) {
  378. log_group_builder* builder = db_read_table_last_logs(guard_db_manager, manager->config->logCountPerPackage);
  379. destroy_log_db(guard_db_manager);
  380. if (builder != NULL) {
  381. read_file_index++;
  382. return builder;
  383. }
  384. }
  385. } else {
  386. log_group_builder* builder = db_read_table_last_logs(manager->db_manager, manager->config->logCountPerPackage);
  387. if (builder != NULL) {
  388. read_file_index++;
  389. return builder;
  390. }
  391. }
  392. }
  393. closedir(d);
  394. read_file_index = 0;
  395. return NULL;
  396. #endif //_MSC_VER
  397. }
  398. log_group_builder* log_persistent_manager_get_log(log_persistent_manager* manager) {
  399. /*two way get log
  400. (1) get log from db
  401. (2) get log from dirty resend frame list
  402. */
  403. if (RvcLogSdkManager::getInstance().getResendFrameList().size() > 0)//already send all db logs, deal with dirty logs
  404. {
  405. log_group_builder* cur = RvcLogSdkManager::getInstance().getResendFrameList().front();
  406. RvcLogSdkManager::getInstance().getResendFrameList().pop_front();
  407. return cur;
  408. }
  409. unsigned long end_time;
  410. unsigned long start_time = GetTickCount();
  411. log_group_builder* builder = db_read_table_last_logs(manager->db_manager, manager->config->logCountPerPackage);
  412. end_time = GetTickCount();
  413. //aos_debug_log((LB, "read db log cust %d", end_time - start_time));
  414. if (builder == NULL) {
  415. aos_error_log((LB, "get db log failed"));
  416. //add for Guarder upload
  417. if (manager->config->enableGuarder) {
  418. return log_persistent_manager_get_guard_log(manager);
  419. }
  420. }
  421. return builder;
  422. }
  423. int log_persistent_manager_updata_log_status(log_persistent_manager* manager, char* modular, int count, char uuid[][MAX_UUID_LEN], log_db_status_e status) {
  424. int i = 0, op_count = 0;
  425. unsigned long end_time;
  426. unsigned long start_time = GetTickCount();
  427. if (strcmp(manager->db_name, modular) == 0) {
  428. db_transaction_begin(manager->db_manager);
  429. for (i = 0; i < count; i++) {
  430. op_count += db_update_status(manager->db_manager, uuid[i], status);
  431. }
  432. db_transaction_commit(manager->db_manager);
  433. end_time = GetTickCount();
  434. //aos_debug_log((LB, "updata db log status cust %d, op count %d", end_time - start_time, op_count));
  435. if (op_count <= 0) {
  436. aos_error_log((LB, "updata_log_status failed"));
  437. return LOG_PRODUCER_PERSISTENT_ERROR;
  438. }
  439. else {
  440. return LOG_PRODUCER_OK;
  441. }
  442. }
  443. else {
  444. op_count = log_persistent_manager_update_guard_log_status(manager, modular, count, uuid, status);
  445. if (op_count <= 0) {
  446. aos_error_log((LB, "updata_log_status failed"));
  447. return LOG_PRODUCER_PERSISTENT_ERROR;
  448. }
  449. else {
  450. return LOG_PRODUCER_OK;
  451. }
  452. }
  453. }
  454. int log_persistent_manager_delete_log(log_persistent_manager* manager, char* uuid) {
  455. unsigned long end_time;
  456. unsigned long start_time = GetTickCount();
  457. int rst = db_delete_one(manager->db_manager, uuid);
  458. end_time = GetTickCount();
  459. //aos_debug_log((LB, "delete db log cust %d", end_time - start_time));
  460. if (rst <= 0) {
  461. aos_error_log((LB, "delete_log failed, rst %d",
  462. rst));
  463. return LOG_PRODUCER_PERSISTENT_ERROR;
  464. }
  465. else {
  466. return LOG_PRODUCER_OK;
  467. }
  468. }
  469. /*将数据恢复成为待上传状态*/
  470. int log_persistent_manager_recover_inner(log_persistent_manager* manager, log_db_manager* log_db_manager) {
  471. unsigned long end_time;
  472. unsigned long start_time = GetTickCount();
  473. int rst = db_update_status(log_db_manager, NULL, LOG_DB_STATUS_WAITING);
  474. end_time = GetTickCount();
  475. aos_debug_log((LB, "recover db log cust %d", end_time - start_time));
  476. if (rst <= 0) {
  477. aos_error_log((LB, "persistent_manager recover failed, rst %d",
  478. rst));
  479. return LOG_PRODUCER_PERSISTENT_ERROR;
  480. }
  481. else {
  482. return LOG_PRODUCER_OK;
  483. }
  484. }
  485. int log_persistent_manager_recover(log_persistent_manager* manager) {
  486. #if defined(_MSC_VER)
  487. char srcFilePath[MAX_PATH] = { 0 };
  488. WIN32_FIND_DATA FindFileData;
  489. HANDLE hFind;
  490. BOOL fFinished = FALSE;
  491. log_db_manager* guard_db_manager = NULL;
  492. int i;
  493. char tmpFilePath[MAX_PATH] = { 0 };
  494. int len = strlen(manager->config->persistentFilePath);
  495. strcpy(tmpFilePath, manager->config->persistentFilePath);
  496. if (manager->config->persistentFilePath[len - 1] == '\\' || manager->config->persistentFilePath[len - 1] == '/') {
  497. strcat(tmpFilePath, DB_PATH);
  498. } else {
  499. strcat(tmpFilePath, "\\");
  500. strcat(tmpFilePath, DB_PATH);
  501. }
  502. sprintf_s(srcFilePath, MAX_PATH, "%s*.db", tmpFilePath);
  503. hFind = FindFirstFile(srcFilePath, &FindFileData);
  504. if (INVALID_HANDLE_VALUE != hFind) {
  505. for (i = 0; !fFinished; i++) {
  506. if ((FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes)) {
  507. if (!FindNextFile(hFind, &FindFileData)) {
  508. if (GetLastError() == ERROR_NO_MORE_FILES) {
  509. fFinished = TRUE;
  510. } else {
  511. break;
  512. }
  513. }
  514. continue;
  515. }
  516. aos_debug_log((LB, "recover guard log db name %s", FindFileData.cFileName));
  517. //clean
  518. //log_persistent_manager_clean(manager, FindFileData.cFileName);
  519. //recover
  520. if (strcmp(manager->db_name, FindFileData.cFileName) != 0) {
  521. guard_db_manager = create_db_manager(manager, FindFileData.cFileName);
  522. if (guard_db_manager != NULL) {
  523. log_persistent_manager_recover_inner(manager, guard_db_manager);
  524. destroy_log_db(guard_db_manager);
  525. }
  526. } else {
  527. log_persistent_manager_recover_inner(manager, manager->db_manager);
  528. }
  529. if (!FindNextFile(hFind, &FindFileData)) {
  530. if (GetLastError() == ERROR_NO_MORE_FILES) {
  531. fFinished = TRUE;
  532. } else {
  533. break;
  534. }
  535. }
  536. }
  537. FindClose(hFind);
  538. }
  539. return LOG_PRODUCER_OK;
  540. #else
  541. DIR* d = NULL;
  542. struct dirent* dp = NULL;
  543. struct stat st;
  544. char srcFilePath[MAX_PATH] = { 0 };
  545. BOOL fFinished = FALSE;
  546. log_db_manager* guard_db_manager = NULL;
  547. int ret, i;
  548. char tmpFilePath[MAX_PATH] = { 0 };
  549. int len = strlen(manager->config->persistentFilePath);
  550. strcpy(tmpFilePath, manager->config->persistentFilePath);
  551. if (manager->config->persistentFilePath[len - 1] == '\\' || manager->config->persistentFilePath[len - 1] == '/') {
  552. strcat(tmpFilePath, DB_PATH);
  553. tmpFilePath[strlen(tmpFilePath) - 1] = '\0';
  554. } else {
  555. strcat(tmpFilePath, SPLIT_SLASH_STR);
  556. strcat(tmpFilePath, DB_PATH);
  557. tmpFilePath[strlen(tmpFilePath) - 1] = '\0';
  558. }
  559. aos_debug_log((LB, "recover log db path %s", tmpFilePath));
  560. if (stat(tmpFilePath, &st) < 0 || !S_ISDIR(st.st_mode)) {
  561. aos_warn_log((LB, "stat %s failed: %d", tmpFilePath, errno));
  562. return NULL;
  563. }
  564. if (!(d = opendir(tmpFilePath))) {
  565. aos_warn_log((LB, "opendir %s failed: %d", tmpFilePath, errno));
  566. return NULL;
  567. }
  568. while ((dp = readdir(d)) != NULL) {
  569. if ((!strncmp(dp->d_name, ".", 1)) || (!strncmp(dp->d_name, "..", 2))) {
  570. continue;
  571. }
  572. int isdir = 0;
  573. struct stat st1;
  574. sprintf(srcFilePath, "%s/%s", tmpFilePath, dp->d_name);
  575. if (stat(srcFilePath, &st1) < 0) {
  576. aos_warn_log((LB, "stat %s failed: %d", srcFilePath, errno));
  577. continue;
  578. }
  579. isdir = !!(S_ISDIR(st1.st_mode));
  580. if (isdir) {
  581. continue;
  582. }
  583. if (strstr(dp->d_name, ".db") == NULL) {
  584. continue;
  585. }
  586. aos_debug_log((LB, "recover log db name %s", dp->d_name));
  587. //clean
  588. //log_persistent_manager_clean(manager, FindFileData.cFileName);
  589. //recover
  590. if (strcmp(manager->db_name, dp->d_name) != 0) {
  591. guard_db_manager = create_db_manager(manager, dp->d_name);
  592. if (guard_db_manager != NULL) {
  593. log_persistent_manager_recover_inner(manager, guard_db_manager);
  594. destroy_log_db(guard_db_manager);
  595. }
  596. } else {
  597. log_persistent_manager_recover_inner(manager, manager->db_manager);
  598. }
  599. }
  600. closedir(d);
  601. return LOG_PRODUCER_OK;
  602. #endif //_MSC_VER
  603. }
  604. int log_persistent_manager_clean(log_persistent_manager* manager, char* modular) {
  605. if (strcmp(manager->db_name, modular) == 0) {
  606. int rst = 1;
  607. unsigned long end_time;
  608. unsigned long start_time = GetTickCount();
  609. int count = db_get_count(manager->db_manager);
  610. if (count > manager->config->maxPersistentLogCount) {//超过最大值,然后清理 2*10000
  611. rst = db_delete_old_logs(manager->db_manager, count - manager->config->maxPersistentLogCount);
  612. g_discardMsgNum_since_full += count - manager->config->maxPersistentLogCount;
  613. }
  614. db_vacuum(manager->db_manager);
  615. end_time = GetTickCount();
  616. aos_debug_log((LB, "clean db log cust %d", end_time - start_time));
  617. if (rst <= 0) {
  618. aos_error_log((LB, "persistent_manager clean failed, rst %d",
  619. rst));
  620. return LOG_PRODUCER_PERSISTENT_ERROR;
  621. }
  622. else {
  623. return LOG_PRODUCER_OK;
  624. }
  625. }
  626. else {
  627. log_db_manager* guard_db_manager = create_db_manager(manager, modular);
  628. if (guard_db_manager != NULL) {
  629. int rst = 1;
  630. unsigned long end_time;
  631. unsigned long start_time = GetTickCount();
  632. int count = db_get_count(guard_db_manager);
  633. if (count > manager->config->maxPersistentLogCount) {
  634. rst = db_delete_old_logs(guard_db_manager, count - manager->config->maxPersistentLogCount);
  635. }
  636. db_vacuum(guard_db_manager);
  637. destroy_log_db(guard_db_manager);
  638. end_time = GetTickCount();
  639. aos_debug_log((LB, "clean guard db log cust %d, modular:%s", end_time - start_time, modular));
  640. if (rst <= 0) {
  641. aos_error_log((LB, "persistent_manager guard clean failed, rst %d",
  642. rst));
  643. return LOG_PRODUCER_PERSISTENT_ERROR;
  644. }
  645. else {
  646. return LOG_PRODUCER_OK;
  647. }
  648. }
  649. }
  650. return LOG_PRODUCER_OK;
  651. }
  652. int log_persistent_manager_transaction_begin(log_persistent_manager* manager) {
  653. int rst = 1;
  654. unsigned long end_time;
  655. unsigned long start_time = GetTickCount();
  656. rst = db_transaction_begin(manager->db_manager);
  657. end_time = GetTickCount();
  658. aos_debug_log((LB, "begin db log cust %d", end_time - start_time));
  659. if (rst <= 0) {
  660. aos_error_log((LB, "persistent_manager begin db failed, rst %d",
  661. rst));
  662. return LOG_PRODUCER_PERSISTENT_ERROR;
  663. }
  664. else {
  665. return LOG_PRODUCER_OK;
  666. }
  667. }
  668. int log_persistent_manager_transaction_commit(log_persistent_manager* manager) {
  669. int rst = 1;
  670. unsigned long end_time;
  671. unsigned long start_time = GetTickCount();
  672. rst = db_transaction_commit(manager->db_manager);
  673. end_time = GetTickCount();
  674. aos_debug_log((LB, "commit db log cust %d", end_time - start_time));
  675. if (rst <= 0) {
  676. aos_error_log((LB, "persistent_manager commit db failed, rst %d",
  677. rst));
  678. return LOG_PRODUCER_PERSISTENT_ERROR;
  679. }
  680. else {
  681. return LOG_PRODUCER_OK;
  682. }
  683. }