pull/214/head
M66B 2 years ago
parent 4e822c6fe2
commit 9b862c8097

@ -9,7 +9,6 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabaseCorruptException; import android.database.sqlite.SQLiteDatabaseCorruptException;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -23,7 +22,6 @@ import androidx.room.RoomDatabase;
import androidx.room.TypeConverter; import androidx.room.TypeConverter;
import androidx.room.TypeConverters; import androidx.room.TypeConverters;
import androidx.room.migration.Migration; import androidx.room.migration.Migration;
import androidx.sqlite.db.SimpleSQLiteQuery;
import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.sqlite.db.SupportSQLiteDatabase;
import org.json.JSONArray; import org.json.JSONArray;
@ -144,6 +142,19 @@ public abstract class DB extends RoomDatabase {
"compile_options" "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 @Override
public void init(@NonNull DatabaseConfiguration configuration) { public void init(@NonNull DatabaseConfiguration configuration) {
File dbfile = configuration.context.getDatabasePath(DB_NAME); File dbfile = configuration.context.getDatabasePath(DB_NAME);
@ -483,8 +494,7 @@ public abstract class DB extends RoomDatabase {
if (cache_size != null) { if (cache_size != null) {
cache_size = -cache_size; // kibibytes cache_size = -cache_size; // kibibytes
Log.i("Set PRAGMA cache_size=" + cache_size); Log.i("Set PRAGMA cache_size=" + cache_size);
// TODO CASA try (Cursor cursor = jni_safe_support_query(db, "PRAGMA cache_size=" + cache_size + ";", new Object[0])) {
try (Cursor cursor = db.query("PRAGMA cache_size=" + cache_size + ";")) {
cursor.moveToNext(); // required cursor.moveToNext(); // required
} }
} }
@ -504,8 +514,7 @@ public abstract class DB extends RoomDatabase {
// https://www.sqlite.org/pragma.html // https://www.sqlite.org/pragma.html
for (String pragma : DB_PRAGMAS) for (String pragma : DB_PRAGMAS)
if (!"compile_options".equals(pragma) || BuildConfig.DEBUG) { if (!"compile_options".equals(pragma) || BuildConfig.DEBUG) {
// TODO CASA try (Cursor cursor = jni_safe_support_query(db, "PRAGMA " + pragma + ";", new Object[0])) {
try (Cursor cursor = db.query("PRAGMA " + pragma + ";")) {
boolean has = false; boolean has = false;
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
has = true; has = true;

@ -240,7 +240,7 @@ public class Fts4DbHelper extends SQLiteOpenHelper {
" args=" + TextUtils.join(", ", args) + " args=" + TextUtils.join(", ", args) +
" query=" + query); " query=" + query);
List<Long> result = new ArrayList<>(); List<Long> result = new ArrayList<>();
try (Cursor cursor = db.query( // TODO CASA try (Cursor cursor = DB.jni_safe_sqlite_query(db,
"message", new String[]{"rowid"}, "message", new String[]{"rowid"},
select, select,
args.toArray(new String[0]), args.toArray(new String[0]),

@ -240,7 +240,7 @@ public class Fts5DbHelper extends SQLiteOpenHelper {
" args=" + TextUtils.join(", ", args) + " args=" + TextUtils.join(", ", args) +
" query=" + criteria.query); " query=" + criteria.query);
List<Long> result = new ArrayList<>(); List<Long> result = new ArrayList<>();
try (Cursor cursor = db.query( // TODO CASA try (Cursor cursor = DB.jni_safe_sqlite_query(db,
"message", new String[]{"rowid"}, "message", new String[]{"rowid"},
select, select,
args.toArray(new String[0]), args.toArray(new String[0]),

@ -110,6 +110,26 @@ Java_eu_faircode_email_Log_jni_1safe_1runtime_1stats(JNIEnv *env, jclass clazz)
return result; 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" extern "C"
JNIEXPORT jobject JNICALL JNIEXPORT jobject JNICALL

Loading…
Cancel
Save