Add DB validation check when db init 70/158770/3
authorInkyun Kil <inkyun.kil@samsung.com>
Fri, 3 Nov 2017 02:37:42 +0000 (11:37 +0900)
committerInkyun Kil <inkyun.kil@samsung.com>
Mon, 6 Nov 2017 07:07:54 +0000 (16:07 +0900)
- Added integrity check related logic to db init process to check
  if db integrity is broken due to file system error and initialize db

Change-Id: Ide8efaba21f8bb63952046028879bdba5b6899c2
Signed-off-by: Inkyun Kil <inkyun.kil@samsung.com>
alarm-manager.c

index c65a5b9..b1b29ed 100644 (file)
@@ -3998,21 +3998,66 @@ static int __db_busyhandler(void *pData, int count)
 static bool __initialize_db()
 {
        char *error_message = NULL;
+       int ret;
 
        /* Create or Open the DB file */
-       if (sqlite3_open(ALARMMGR_DB_FILE, &alarmmgr_db) != SQLITE_OK) {
+       ret = sqlite3_open(ALARMMGR_DB_FILE, &alarmmgr_db);
+       if (ret != SQLITE_OK) {
                ALARM_MGR_EXCEPTION_PRINT("Failed to open [%s]. error: %s", ALARMMGR_DB_FILE, sqlite3_errmsg(alarmmgr_db));
-               return false;
+               if (ret == SQLITE_CORRUPT)
+                       goto recover;
+               else
+                       return false;
        }
        /* Register busy handler */
-       if (sqlite3_busy_handler(alarmmgr_db, __db_busyhandler, NULL) != SQLITE_OK) {
+       ret = sqlite3_busy_handler(alarmmgr_db, __db_busyhandler, NULL);
+       if (ret != SQLITE_OK) {
                ALARM_MGR_EXCEPTION_PRINT("Failed to register the busy handler");
-               sqlite3_close(alarmmgr_db);
-               return false;
+               if (ret == SQLITE_CORRUPT) {
+                       goto recover;
+               } else {
+                       sqlite3_close(alarmmgr_db);
+                       return false;
+               }
        }
        /* Create alarmmgr table */
-       if (sqlite3_exec(alarmmgr_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message) != SQLITE_OK) {
+       ret = sqlite3_exec(alarmmgr_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message);
+       if (ret != SQLITE_OK) {
                ALARM_MGR_EXCEPTION_PRINT("Don't execute query = %s, error message = %s", QUERY_CREATE_TABLE_ALARMMGR, error_message);
+               if (ret == SQLITE_CORRUPT || ret == SQLITE_NOTADB) {
+                       goto recover;
+               } else {
+                       sqlite3_close(alarmmgr_db);
+                       sqlite3_free(error_message);
+                       return false;
+               }
+       }
+
+       return true;
+
+recover:
+       if (alarmmgr_db)
+               sqlite3_close(alarmmgr_db);
+       if (error_message)
+               sqlite3_free(error_message);
+       unlink(ALARMMGR_DB_FILE);
+
+       ret = sqlite3_open(ALARMMGR_DB_FILE, &alarmmgr_db);
+       if (ret != SQLITE_OK) {
+               ALARM_MGR_EXCEPTION_PRINT("[recover] Failed to open [%s]. error: %s", ALARMMGR_DB_FILE, sqlite3_errmsg(alarmmgr_db));
+               return false;
+       }
+
+       ret = sqlite3_busy_handler(alarmmgr_db, __db_busyhandler, NULL);
+       if (ret != SQLITE_OK) {
+               ALARM_MGR_EXCEPTION_PRINT("[recover] Failed to register the busy handler");
+               sqlite3_close(alarmmgr_db);
+               return false;
+       }
+
+       ret = sqlite3_exec(alarmmgr_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message);
+       if (ret != SQLITE_OK) {
+               ALARM_MGR_EXCEPTION_PRINT("[recover] Don't execute query = %s, error message = %s", QUERY_CREATE_TABLE_ALARMMGR, error_message);
                sqlite3_close(alarmmgr_db);
                sqlite3_free(error_message);
                return false;