Add DB validation check when db init 03/158303/1
authorMyungki Lee <mk5004.lee@samsung.com>
Tue, 31 Oct 2017 04:37:35 +0000 (13:37 +0900)
committerMyungki Lee <mk5004.lee@samsung.com>
Tue, 31 Oct 2017 04:37:35 +0000 (13:37 +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: Ie672c0e811a10061f51ec389371b8f62561a6810
Signed-off-by: Myungki Lee <mk5004.lee@samsung.com>
lib/src/shortcut_db.c

index 7ae8dbe..7c243a8 100755 (executable)
@@ -15,6 +15,7 @@
  *
  */
 
+#include <unistd.h>
 #include <dlog.h>
 #include <glib.h>
 #include <db-util.h>
@@ -54,16 +55,63 @@ EAPI int shortcut_db_init()
                        SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
        if (sql_ret != SQLITE_OK) {
                SHORTCUT_ERR("Failed to open db[%d]", sql_ret);
-               return SHORTCUT_ERROR_IO_ERROR;
+
+               if (sqlite3_errcode(db) == SQLITE_CORRUPT) {
+                       if (db)
+                               sqlite3_close(db);
+                       unlink(DB_PATH);
+
+                       sql_ret = sqlite3_open_v2(DB_PATH, &db,
+                               SQLITE_OPEN_CREATE |SQLITE_OPEN_READWRITE,
+                               NULL);
+                       if (sql_ret != SQLITE_OK) {
+                               SHORTCUT_ERR("Failed to open db[%d]", sql_ret);
+                               unlink(DB_PATH);
+                               ret = SHORTCUT_ERROR_IO_ERROR;
+                               goto out;
+                       }
+               } else {
+                       ret = SHORTCUT_ERROR_IO_ERROR;
+                       goto out;
+               }
        }
 
-       sql_ret = sqlite3_exec(db, QUERY_CREATE_SHORTCUT_TABLE,
-                                       NULL, NULL, &errmsg);
+       sql_ret = sqlite3_exec(db, QUERY_CREATE_SHORTCUT_TABLE, NULL, NULL,
+                                       &errmsg);
        if (sql_ret != SQLITE_OK) {
                SHORTCUT_ERR("Failed to exec query [%d][%s]", sql_ret, errmsg);
-               ret = SHORTCUT_ERROR_IO_ERROR;
+
+               if (sql_ret == SQLITE_CORRUPT || sql_ret == SQLITE_NOTADB) {
+                       sqlite3_close(db);
+                       unlink(DB_PATH);
+
+                       sql_ret = sqlite3_open_v2(DB_PATH, &db,
+                                       SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE,
+                                       NULL);
+                       if (sql_ret != SQLITE_OK) {
+                               SHORTCUT_ERR("Failed to open db[%d]", sql_ret);
+                               unlink(DB_PATH);
+                               ret = SHORTCUT_ERROR_IO_ERROR;
+                               goto out;
+                       }
+
+                       sqlite3_free(errmsg);
+                       sql_ret = sqlite3_exec(db, QUERY_CREATE_SHORTCUT_TABLE,
+                                       NULL, NULL, &errmsg);
+                       if (sql_ret != SQLITE_OK) {
+                               SHORTCUT_ERR("Failed to exec sqlite, again[%d][%s]",
+                                       sql_ret, errmsg);
+                               unlink(DB_PATH);
+                               ret = SHORTCUT_ERROR_IO_ERROR;
+                               goto out;
+                       }
+               } else {
+                       ret = SHORTCUT_ERROR_IO_ERROR;
+                       goto out;
+               }
        }
 
+out:
        if (errmsg)
                sqlite3_free(errmsg);
        if (db)