diff --git a/app/src/main/java/eu/faircode/email/DB.java b/app/src/main/java/eu/faircode/email/DB.java index a5a8f62f71..642a05cb9f 100644 --- a/app/src/main/java/eu/faircode/email/DB.java +++ b/app/src/main/java/eu/faircode/email/DB.java @@ -9,7 +9,6 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabaseCorruptException; import android.net.Uri; -import android.os.Build; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -23,7 +22,6 @@ import androidx.room.RoomDatabase; import androidx.room.TypeConverter; import androidx.room.TypeConverters; import androidx.room.migration.Migration; -import androidx.sqlite.db.SimpleSQLiteQuery; import androidx.sqlite.db.SupportSQLiteDatabase; import org.json.JSONArray; @@ -144,6 +142,19 @@ public abstract class DB extends RoomDatabase { "compile_options" )); + static { + System.loadLibrary("fairemail"); + } + + public static native Cursor jni_safe_support_query( + SupportSQLiteDatabase db, String sql, Object[] args); + + public static native Cursor jni_safe_sqlite_query( + SQLiteDatabase db, String table, String[] columns, + String selection, String[] selectionArgs, + String groupBy, String having, + String orderBy, String limit); + @Override public void init(@NonNull DatabaseConfiguration configuration) { File dbfile = configuration.context.getDatabasePath(DB_NAME); @@ -483,8 +494,7 @@ public abstract class DB extends RoomDatabase { if (cache_size != null) { cache_size = -cache_size; // kibibytes Log.i("Set PRAGMA cache_size=" + cache_size); - // TODO CASA - try (Cursor cursor = db.query("PRAGMA cache_size=" + cache_size + ";")) { + try (Cursor cursor = jni_safe_support_query(db, "PRAGMA cache_size=" + cache_size + ";", new Object[0])) { cursor.moveToNext(); // required } } @@ -504,8 +514,7 @@ public abstract class DB extends RoomDatabase { // https://www.sqlite.org/pragma.html for (String pragma : DB_PRAGMAS) if (!"compile_options".equals(pragma) || BuildConfig.DEBUG) { - // TODO CASA - try (Cursor cursor = db.query("PRAGMA " + pragma + ";")) { + try (Cursor cursor = jni_safe_support_query(db, "PRAGMA " + pragma + ";", new Object[0])) { boolean has = false; while (cursor.moveToNext()) { has = true; diff --git a/app/src/main/java/eu/faircode/email/Fts4DbHelper.java b/app/src/main/java/eu/faircode/email/Fts4DbHelper.java index e4e8267f23..8bf5cd8664 100644 --- a/app/src/main/java/eu/faircode/email/Fts4DbHelper.java +++ b/app/src/main/java/eu/faircode/email/Fts4DbHelper.java @@ -240,7 +240,7 @@ public class Fts4DbHelper extends SQLiteOpenHelper { " args=" + TextUtils.join(", ", args) + " query=" + query); List result = new ArrayList<>(); - try (Cursor cursor = db.query( // TODO CASA + try (Cursor cursor = DB.jni_safe_sqlite_query(db, "message", new String[]{"rowid"}, select, args.toArray(new String[0]), diff --git a/app/src/main/java/eu/faircode/email/Fts5DbHelper.java b/app/src/main/java/eu/faircode/email/Fts5DbHelper.java index 8fddd6c566..23cb3b81f9 100644 --- a/app/src/main/java/eu/faircode/email/Fts5DbHelper.java +++ b/app/src/main/java/eu/faircode/email/Fts5DbHelper.java @@ -240,7 +240,7 @@ public class Fts5DbHelper extends SQLiteOpenHelper { " args=" + TextUtils.join(", ", args) + " query=" + criteria.query); List result = new ArrayList<>(); - try (Cursor cursor = db.query( // TODO CASA + try (Cursor cursor = DB.jni_safe_sqlite_query(db, "message", new String[]{"rowid"}, select, args.toArray(new String[0]), diff --git a/app/src/main/jni/fairemail.cc b/app/src/main/jni/fairemail.cc index c6fecf8aed..4f648e5c6a 100644 --- a/app/src/main/jni/fairemail.cc +++ b/app/src/main/jni/fairemail.cc @@ -110,6 +110,26 @@ Java_eu_faircode_email_Log_jni_1safe_1runtime_1stats(JNIEnv *env, jclass clazz) return result; } +extern "C" +JNIEXPORT jobject JNICALL +Java_eu_faircode_email_DB_jni_1safe_1support_1query(JNIEnv *env, jclass clazz, + jobject db, + jstring sql, jobjectArray args) { + jclass cls = env->FindClass("androidx/sqlite/db/SupportSQLiteDatabase"); + jmethodID mid = env->GetMethodID(cls, "query", "(Ljava/lang/String;[Ljava/lang/Object;)Landroid/database/Cursor;"); + return env->CallObjectMethod(db, mid, sql, args); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_eu_faircode_email_DB_jni_1safe_1sqlite_1query(JNIEnv *env, jclass clazz, jobject db, jstring table, jobjectArray columns, + jstring selection, jobjectArray selection_args, jstring group_by, + jstring having, jstring order_by, jstring limit) { + jclass cls = env->FindClass("android/database/sqlite/SQLiteDatabase"); + jmethodID mid = env->GetMethodID(cls, "query", + "(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"); + return env->CallObjectMethod(db, mid, table, columns, selection, selection_args, group_by, having, order_by, limit); +} extern "C" JNIEXPORT jobject JNICALL