*
*/
+#include <unistd.h>
#include <dlog.h>
#include <glib.h>
#include <db-util.h>
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)