From d3b6b812084fce8563effef10c951902807830a5 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 4 Jan 2025 19:08:54 +0100 Subject: [PATCH] Refactoring --- app/src/main/java/eu/faircode/email/DB.java | 54 +++++++++++++++++++ .../java/eu/faircode/email/DebugHelper.java | 7 +-- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DB.java b/app/src/main/java/eu/faircode/email/DB.java index b08431fa79..de5aa3e2a6 100644 --- a/app/src/main/java/eu/faircode/email/DB.java +++ b/app/src/main/java/eu/faircode/email/DB.java @@ -121,6 +121,7 @@ public abstract class DB extends RoomDatabase { private static int sPid; private static Context sContext; private static DB sInstance; + private static Boolean hasJson = null; static final String DB_NAME = "fairemail"; static final int DEFAULT_QUERY_THREADS = 4; // AndroidX default thread count: 4 @@ -146,6 +147,57 @@ public abstract class DB extends RoomDatabase { "compile_options" )); + public static String getSqliteVersion() { + try (SQLiteDatabase db = SQLiteDatabase.create(null)) { + try (Cursor cursor = db.rawQuery( + "SELECT sqlite_version() AS sqlite_version", null)) { + if (cursor.moveToNext()) + return cursor.getString(0); + } + } catch (Throwable ex) { + Log.e(ex); + } + return null; + } + + public static boolean hasJson() { + return hasJson; + } + + private static boolean _hasJson() { + try { + // https://www.sqlite.org/json1.html + // The JSON functions and operators are built into SQLite by default, as of SQLite version 3.38.0 (2022-02-22) + String version = getSqliteVersion(); + if (version == null) + return false; + + String[] parts = version.split("\\."); + if (parts.length == 0) + return false; + + int[] numbers = new int[parts.length]; + for (int i = 0; i < parts.length; i++) + numbers[i] = Integer.parseInt(parts[i]); + + if (numbers[0] < 3) + return false; + if (numbers[0] > 3) + return true; + + if (parts.length == 1) + return false; + + if (numbers[1] < 38) + return false; + + return true; + } catch (Throwable ex) { + Log.e(ex); + return false; + } + } + @Override public void init(@NonNull DatabaseConfiguration configuration) { File dbfile = configuration.context.getDatabasePath(DB_NAME); @@ -466,6 +518,8 @@ public abstract class DB extends RoomDatabase { Log.i("DB critical section end"); } + hasJson = _hasJson(); + return sInstance; } diff --git a/app/src/main/java/eu/faircode/email/DebugHelper.java b/app/src/main/java/eu/faircode/email/DebugHelper.java index 028edbd177..fa24166127 100644 --- a/app/src/main/java/eu/faircode/email/DebugHelper.java +++ b/app/src/main/java/eu/faircode/email/DebugHelper.java @@ -1808,11 +1808,8 @@ public class DebugHelper { size += write(os, String.format("Database: %s\r\n", context.getDatabasePath(DB.DB_NAME))); - try (Cursor cursor = SQLiteDatabase.create(null).rawQuery( - "SELECT sqlite_version() AS sqlite_version", null)) { - if (cursor.moveToNext()) - size += write(os, String.format("sqlite: %s\r\n", cursor.getString(0))); - } + size += write(os, String.format("sqlite: %s json: %b\r\n", DB.getSqliteVersion(), DB.hasJson())); + try { TupleFtsStats stats = db.message().getFts(); size += write(os, String.format("fts: %d/%d %s\r\n", stats.fts, stats.total,