diff options
author | Inkyun Kil <inkyun.kil@samsung.com> | 2017-11-03 11:37:42 +0900 |
---|---|---|
committer | Inkyun Kil <inkyun.kil@samsung.com> | 2017-11-06 16:07:54 +0900 |
commit | cffca60f8e5d2ba934dce136257c4fd495259021 (patch) | |
tree | 38974a23f3195db10052063f746c47e7522b2c33 | |
parent | 069078572eecdfaeca578081ffa5af7f544ef210 (diff) | |
download | alarm-manager-cffca60f8e5d2ba934dce136257c4fd495259021.tar.gz alarm-manager-cffca60f8e5d2ba934dce136257c4fd495259021.tar.bz2 alarm-manager-cffca60f8e5d2ba934dce136257c4fd495259021.zip |
Add DB validation check when db init
- 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>
-rw-r--r-- | alarm-manager.c | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/alarm-manager.c b/alarm-manager.c index c65a5b9..b1b29ed 100644 --- a/alarm-manager.c +++ b/alarm-manager.c @@ -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; |