summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInkyun Kil <inkyun.kil@samsung.com>2017-11-03 11:37:42 +0900
committerInkyun Kil <inkyun.kil@samsung.com>2017-11-06 16:07:54 +0900
commitcffca60f8e5d2ba934dce136257c4fd495259021 (patch)
tree38974a23f3195db10052063f746c47e7522b2c33
parent069078572eecdfaeca578081ffa5af7f544ef210 (diff)
downloadalarm-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.c57
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;