Retry db construction if first time failed

This commit is contained in:
topjohnwu 2018-10-28 14:49:04 -04:00
parent 7fc00c446b
commit dc413e7b73

View File

@ -8,12 +8,21 @@
#include "magisk.h" #include "magisk.h"
#include "db.h" #include "db.h"
#define DB_VERSION 6
static int ver_cb(void *v, int col_num, char **data, char **col_name) { static int ver_cb(void *v, int col_num, char **data, char **col_name) {
*((int *) v) = atoi(data[0]); *((int *) v) = atoi(data[0]);
return 0; return 0;
} }
sqlite3 *get_magiskdb() { #define err_abort(err) \
if (err) { \
LOGE("sqlite3_exec: %s\n", err); \
sqlite3_free(err); \
return NULL; \
}
static sqlite3 *open_and_init_db() {
sqlite3 *db; sqlite3 *db;
int ret = sqlite3_open(MAGISKDB, &db); int ret = sqlite3_open(MAGISKDB, &db);
if (ret) { if (ret) {
@ -21,25 +30,35 @@ sqlite3 *get_magiskdb() {
return NULL; return NULL;
} }
int ver, upgrade = 0; int ver, upgrade = 0;
sqlite3_exec(db, "PRAGMA user_version", ver_cb, &ver, NULL); char *err;
sqlite3_exec(db, "PRAGMA user_version", ver_cb, &ver, &err);
err_abort(err);
if (ver > DB_VERSION) {
// Don't support downgrading database
sqlite3_close_v2(db);
return NULL;
}
if (ver < 3) { if (ver < 3) {
// Policies // Policies
sqlite3_exec(db, sqlite3_exec(db,
"CREATE TABLE IF NOT EXISTS policies " "CREATE TABLE IF NOT EXISTS policies "
"(uid INT, package_name TEXT, policy INT, until INT, " "(uid INT, package_name TEXT, policy INT, until INT, "
"logging INT, notification INT, PRIMARY KEY(uid))", "logging INT, notification INT, PRIMARY KEY(uid))",
NULL, NULL, NULL); NULL, NULL, &err);
err_abort(err);
// Logs // Logs
sqlite3_exec(db, sqlite3_exec(db,
"CREATE TABLE IF NOT EXISTS logs " "CREATE TABLE IF NOT EXISTS logs "
"(from_uid INT, package_name TEXT, app_name TEXT, from_pid INT, " "(from_uid INT, package_name TEXT, app_name TEXT, from_pid INT, "
"to_uid INT, action INT, time INT, command TEXT)", "to_uid INT, action INT, time INT, command TEXT)",
NULL, NULL, NULL); NULL, NULL, &err);
err_abort(err);
// Settings // Settings
sqlite3_exec(db, sqlite3_exec(db,
"CREATE TABLE IF NOT EXISTS settings " "CREATE TABLE IF NOT EXISTS settings "
"(key TEXT, value INT, PRIMARY KEY(key))", "(key TEXT, value INT, PRIMARY KEY(key))",
NULL, NULL, NULL); NULL, NULL, &err);
err_abort(err);
ver = 3; ver = 3;
upgrade = 1; upgrade = 1;
} }
@ -48,12 +67,14 @@ sqlite3 *get_magiskdb() {
sqlite3_exec(db, sqlite3_exec(db,
"CREATE TABLE IF NOT EXISTS strings " "CREATE TABLE IF NOT EXISTS strings "
"(key TEXT, value TEXT, PRIMARY KEY(key))", "(key TEXT, value TEXT, PRIMARY KEY(key))",
NULL, NULL, NULL); NULL, NULL, &err);
err_abort(err);
ver = 4; ver = 4;
upgrade = 1; upgrade = 1;
} }
if (ver == 4) { if (ver == 4) {
sqlite3_exec(db, "UPDATE policies SET uid=uid%100000", NULL, NULL, NULL); sqlite3_exec(db, "UPDATE policies SET uid=uid%100000", NULL, NULL, &err);
err_abort(err);
/* Skip version 5 */ /* Skip version 5 */
ver = 6; ver = 6;
upgrade = 1; upgrade = 1;
@ -63,7 +84,18 @@ sqlite3 *get_magiskdb() {
// Set version // Set version
char query[32]; char query[32];
sprintf(query, "PRAGMA user_version=%d", ver); sprintf(query, "PRAGMA user_version=%d", ver);
sqlite3_exec(db, query, NULL, NULL, NULL); sqlite3_exec(db, query, NULL, NULL, &err);
err_abort(err);
}
return db;
}
sqlite3 *get_magiskdb() {
sqlite3 *db = open_and_init_db();
if (db == NULL) {
// Open fails, remove and reconstruct
unlink(MAGISKDB);
db = open_and_init_db();
} }
return db; return db;
} }