Skip to content

Commit af17db5

Browse files
committed
Added support for mapping cursors
Calling "requery" on a cursor may cause the driver to re-use queries, which is unwanted behavior. *This commit is related to issue #529 [1]* [1] #529
1 parent 6b1a9b5 commit af17db5

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

data/src/main/java/org/cryptomator/data/db/SQLiteCacheControl.kt

+15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.cryptomator.data.db
22

3+
import android.database.Cursor
34
import androidx.sqlite.db.SupportSQLiteOpenHelper
45
import org.cryptomator.data.db.sqlmapping.SQLMappingFunction
56
import org.cryptomator.data.db.sqlmapping.asMapped
@@ -19,7 +20,21 @@ object SQLiteCacheControl {
1920
override fun mapWhereClause(whereClause: String?): String {
2021
return map(whereClause ?: "1 = 1")
2122
}
23+
24+
override fun mapCursor(cursor: Cursor): Cursor {
25+
return NoRequeryCursor(cursor)
26+
}
2227
}
2328

2429
fun SupportSQLiteOpenHelper.Factory.asCacheControlled(): SupportSQLiteOpenHelper.Factory = asMapped(RandomUUIDMapping)
30+
}
31+
32+
private class NoRequeryCursor(
33+
private val delegateCursor: Cursor
34+
) : Cursor by delegateCursor {
35+
36+
@Deprecated("Deprecated in Java")
37+
override fun requery(): Boolean {
38+
throw UnsupportedOperationException()
39+
}
2540
}

data/src/main/java/org/cryptomator/data/db/sqlmapping/MappingSupportSQLiteDatabase.kt

+10-4
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@ internal class MappingSupportSQLiteDatabase(
2424
}
2525

2626
override fun query(query: SupportSQLiteQuery): Cursor {
27-
return delegate.query(map(query))
27+
return mapCursor(delegate.query(map(query)))
2828
}
2929

3030
override fun query(query: SupportSQLiteQuery, cancellationSignal: CancellationSignal?): Cursor {
31-
return delegate.query(map(query), cancellationSignal)
31+
return mapCursor(delegate.query(map(query), cancellationSignal))
3232
}
3333

3434
override fun query(query: String): Cursor {
35-
return delegate.query(map(query))
35+
return mapCursor(delegate.query(map(query)))
3636
}
3737

3838
override fun query(query: String, bindArgs: Array<out Any?>): Cursor {
39-
return delegate.query(map(query), bindArgs)
39+
return mapCursor(delegate.query(map(query), bindArgs))
4040
}
4141

4242
override fun insert(table: String, conflictAlgorithm: Int, values: ContentValues): Long {
@@ -79,6 +79,10 @@ internal class MappingSupportSQLiteDatabase(
7979
return MappingSupportSQLiteQuery(query)
8080
}
8181

82+
private fun mapCursor(cursor: Cursor): Cursor {
83+
return mappingFunction.mapCursor(cursor)
84+
}
85+
8286
private fun mapWhereClause(whereClause: String?): String? {
8387
if (whereClause != null && whereClause.isBlank()) {
8488
throw IllegalArgumentException()
@@ -202,4 +206,6 @@ interface SQLMappingFunction {
202206

203207
fun mapWhereClause(whereClause: String?): String?
204208

209+
fun mapCursor(cursor: Cursor): Cursor
210+
205211
}

data/src/test/java/org/cryptomator/data/db/sqlmapping/MappingSupportSQLiteDatabaseTest.kt

+2
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ class MappingSupportSQLiteDatabaseTest {
4242
identityMapping = MappingSupportSQLiteDatabase(delegateMock, object : SQLMappingFunction {
4343
override fun map(sql: String): String = sql
4444
override fun mapWhereClause(whereClause: String?): String? = whereClause
45+
override fun mapCursor(cursor: Cursor): Cursor = cursor
4546
})
4647
commentMapping = MappingSupportSQLiteDatabase(delegateMock, object : SQLMappingFunction {
4748
override fun map(sql: String): String = "$sql -- Comment!"
4849
override fun mapWhereClause(whereClause: String?): String = map(whereClause ?: "1 = 1")
50+
override fun mapCursor(cursor: Cursor): Cursor = cursor //TODO
4951
})
5052
}
5153

0 commit comments

Comments
 (0)