FTS single instance

pull/172/head
M66B 6 years ago
parent b7f1be88d0
commit 04716fc06f

@ -189,10 +189,8 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
boolean fts = prefs.getBoolean("fts", false); boolean fts = prefs.getBoolean("fts", false);
if (fts && seen == null && flagged == null && snoozed == null && encrypted == null) { if (fts && seen == null && flagged == null && snoozed == null && encrypted == null) {
if (state.ids == null) { if (state.ids == null) {
FtsDbHelper ftsDb = new FtsDbHelper(context); SQLiteDatabase sdb = FtsDbHelper.getInstance(context);
try (SQLiteDatabase sdb = ftsDb.getReadableDatabase()) { state.ids = FtsDbHelper.match(sdb, folder, query);
state.ids = ftsDb.match(sdb, folder, query);
}
} }
try { try {

@ -35,13 +35,21 @@ import io.requery.android.database.sqlite.SQLiteOpenHelper;
// https://www.sqlite.org/fts5.html // https://www.sqlite.org/fts5.html
public class FtsDbHelper extends SQLiteOpenHelper { public class FtsDbHelper extends SQLiteOpenHelper {
private static FtsDbHelper instance = null;
private static final int DATABASE_VERSION = 1; private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "fts.db"; private static final String DATABASE_NAME = "fts.db";
FtsDbHelper(Context context) { private FtsDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION); super(context, DATABASE_NAME, null, DATABASE_VERSION);
} }
static SQLiteDatabase getInstance(Context context) {
if (instance == null)
instance = new FtsDbHelper(context);
return instance.getWritableDatabase();
}
@Override @Override
public void onCreate(SQLiteDatabase db) { public void onCreate(SQLiteDatabase db) {
Log.i("FTS create"); Log.i("FTS create");
@ -54,8 +62,8 @@ public class FtsDbHelper extends SQLiteOpenHelper {
// Do nothing // Do nothing
} }
void insert(SQLiteDatabase db, EntityMessage message, String text) { static void insert(SQLiteDatabase db, EntityMessage message, String text) {
Log.i("FTS insert id=" + message.id + " subject=" + message.subject + " text=" + text); Log.i("FTS insert id=" + message.id);
List<Address> address = new ArrayList<>(); List<Address> address = new ArrayList<>();
if (message.from != null) if (message.from != null)
address.addAll(Arrays.asList(message.from)); address.addAll(Arrays.asList(message.from));
@ -64,9 +72,6 @@ public class FtsDbHelper extends SQLiteOpenHelper {
if (message.cc != null) if (message.cc != null)
address.addAll(Arrays.asList(message.cc)); address.addAll(Arrays.asList(message.cc));
try {
db.beginTransaction();
delete(db, message.id); delete(db, message.id);
ContentValues cv = new ContentValues(); ContentValues cv = new ContentValues();
@ -78,20 +83,13 @@ public class FtsDbHelper extends SQLiteOpenHelper {
cv.put("keyword", TextUtils.join(", ", message.keywords)); cv.put("keyword", TextUtils.join(", ", message.keywords));
cv.put("text", text); cv.put("text", text);
db.insert("message", SQLiteDatabase.CONFLICT_FAIL, cv); db.insert("message", SQLiteDatabase.CONFLICT_FAIL, cv);
db.setTransactionSuccessful();
} catch (Throwable ex) {
Log.e(ex);
} finally {
db.endTransaction();
}
} }
void delete(SQLiteDatabase db, long id) { static void delete(SQLiteDatabase db, long id) {
db.delete("message", "rowid = ?", new Object[]{id}); db.delete("message", "rowid = ?", new Object[]{id});
} }
List<Long> match(SQLiteDatabase db, Long folder, String search) { static List<Long> match(SQLiteDatabase db, Long folder, String search) {
Log.i("FTS folder=" + folder + " search=" + search); Log.i("FTS folder=" + folder + " search=" + search);
List<Long> result = new ArrayList<>(); List<Long> result = new ArrayList<>();
try (Cursor cursor = db.query( try (Cursor cursor = db.query(
@ -106,7 +104,7 @@ public class FtsDbHelper extends SQLiteOpenHelper {
return result; return result;
} }
Cursor getIds(SQLiteDatabase db) { static Cursor getIds(SQLiteDatabase db) {
return db.query( return db.query(
"message", new String[]{"rowid"}, "message", new String[]{"rowid"},
null, null, null, null,

@ -195,20 +195,18 @@ public class WorkerCleanup extends Worker {
Log.i("Cleanup FTS"); Log.i("Cleanup FTS");
int fts = 0; int fts = 0;
FtsDbHelper ftsDb = new FtsDbHelper(context); SQLiteDatabase sdb = FtsDbHelper.getInstance(context);
try (SQLiteDatabase sdb = ftsDb.getWritableDatabase()) { try (Cursor cursor = FtsDbHelper.getIds(sdb)) {
try (Cursor cursor = ftsDb.getIds(sdb)) {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
long rowid = cursor.getLong(0); long rowid = cursor.getLong(0);
EntityMessage message = db.message().getMessage(rowid); EntityMessage message = db.message().getMessage(rowid);
if (message == null) { if (message == null) {
Log.i("Deleting rowid" + rowid); Log.i("Deleting rowid" + rowid);
ftsDb.delete(sdb, rowid); FtsDbHelper.delete(sdb, rowid);
fts++; fts++;
} }
} }
} }
}
Log.i("Cleanup FTS=" + fts); Log.i("Cleanup FTS=" + fts);
Log.i("Cleanup contacts"); Log.i("Cleanup contacts");

@ -55,9 +55,8 @@ public class WorkerFts extends Worker {
Log.i("FTS index"); Log.i("FTS index");
int indexed = 0; int indexed = 0;
FtsDbHelper ftsDb = new FtsDbHelper(getApplicationContext());
try (SQLiteDatabase sdb = ftsDb.getWritableDatabase()) {
DB db = DB.getInstance(getApplicationContext()); DB db = DB.getInstance(getApplicationContext());
SQLiteDatabase sdb = FtsDbHelper.getInstance(getApplicationContext());
try (Cursor cursor = db.message().getMessageFts()) { try (Cursor cursor = db.message().getMessageFts()) {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
EntityMessage message = db.message().getMessage(cursor.getLong(0)); EntityMessage message = db.message().getMessage(cursor.getLong(0));
@ -66,7 +65,8 @@ public class WorkerFts extends Worker {
Log.i("FTS index=" + message.id); Log.i("FTS index=" + message.id);
File file = message.getFile(getApplicationContext()); File file = message.getFile(getApplicationContext());
String html = Helper.readText(file); String html = Helper.readText(file);
ftsDb.insert(sdb, message, HtmlHelper.getText(html)); String text = HtmlHelper.getText(html);
FtsDbHelper.insert(sdb, message, text);
db.message().setMessageFts(message.id, true); db.message().setMessageFts(message.id, true);
indexed++; indexed++;
} catch (Throwable ex) { } catch (Throwable ex) {
@ -74,7 +74,6 @@ public class WorkerFts extends Worker {
} }
} }
} }
}
Log.i("FTS indexed=" + indexed); Log.i("FTS indexed=" + indexed);
return Result.success(); return Result.success();

Loading…
Cancel
Save