From 6e8a7680118cbe62fa0e2b8403881eeac11e27db Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 29 Aug 2017 19:38:25 +0200 Subject: [PATCH] close database when cursor is closed for external provider --- .../remote/KeychainExternalProvider.java | 8 ++-- .../util/CloseDatabaseCursorFactory.java | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CloseDatabaseCursorFactory.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/KeychainExternalProvider.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/KeychainExternalProvider.java index 785ba4ace..1f165f005 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/KeychainExternalProvider.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/KeychainExternalProvider.java @@ -53,6 +53,7 @@ import org.sufficientlysecure.keychain.provider.KeychainExternalContract; import org.sufficientlysecure.keychain.provider.KeychainExternalContract.AutocryptStatus; import org.sufficientlysecure.keychain.provider.KeychainExternalContract.EmailStatus; import org.sufficientlysecure.keychain.provider.SimpleContentResolverInterface; +import org.sufficientlysecure.keychain.util.CloseDatabaseCursorFactory; import org.sufficientlysecure.keychain.util.Log; public class KeychainExternalProvider extends ContentProvider implements SimpleContentResolverInterface { @@ -107,10 +108,6 @@ public class KeychainExternalProvider extends ContentProvider implements SimpleC return true; } - public KeychainDatabase getDb() { - return new KeychainDatabase(getContext()); - } - /** * {@inheritDoc} */ @@ -146,7 +143,7 @@ public class KeychainExternalProvider extends ContentProvider implements SimpleC String groupBy = null; - SQLiteDatabase db = getDb().getReadableDatabase(); + SQLiteDatabase db = new KeychainDatabase(getContext()).getReadableDatabase(); String callingPackageName = mApiPermissionHelper.getCurrentCallingPackage(); @@ -343,6 +340,7 @@ public class KeychainExternalProvider extends ContentProvider implements SimpleC } Cursor cursor = qb.query(db, projection, selection, null, groupBy, null, orderBy); + qb.setCursorFactory(new CloseDatabaseCursorFactory()); if (cursor != null) { // Tell the cursor what uri to watch, so it knows when its source data changes cursor.setNotificationUri(getContext().getContentResolver(), uri); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CloseDatabaseCursorFactory.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CloseDatabaseCursorFactory.java new file mode 100644 index 000000000..f3243d4ce --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/CloseDatabaseCursorFactory.java @@ -0,0 +1,41 @@ +package org.sufficientlysecure.keychain.util; + + +import android.database.Cursor; +import android.database.sqlite.SQLiteCursor; +import android.database.sqlite.SQLiteCursorDriver; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.database.sqlite.SQLiteQuery; +import android.util.Log; + +import org.sufficientlysecure.keychain.Constants; + + +public class CloseDatabaseCursorFactory implements CursorFactory { + private static class CloseDatabaseCursor extends SQLiteCursor { + CloseDatabaseCursor(SQLiteDatabase db, SQLiteCursorDriver driver, String editTable, SQLiteQuery query) { + super(db, driver, editTable, query); + } + + @Override + public void close() { + final SQLiteDatabase db = getDatabase(); + super.close(); + if (db != null) { + Log.d(Constants.TAG, "Closing cursor: " + db.getPath()); + try { + db.close(); + } catch (Exception e) { + Log.e(Constants.TAG, "Error closing db", e); + } + } + } + } + + @Override + public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, + String editTable, SQLiteQuery query) { + return new CloseDatabaseCursor(db, masterQuery, editTable, query); + } +}