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;