Move useReaderConnection to content provider

pull/3302/head
Alex Baker 10 months ago
parent bd550f68eb
commit e7396c39e6

@ -16,10 +16,9 @@ import kotlinx.coroutines.launch
import org.tasks.activities.FilterSettingsActivity.Companion.EXTRA_CRITERIA
import org.tasks.activities.FilterSettingsActivity.Companion.TOKEN_FILTER
import org.tasks.data.dao.FilterDao
import org.tasks.data.dao.TaskDao
import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.data.db.Database
import org.tasks.data.entity.Task
import org.tasks.data.rawQuery
import org.tasks.data.sql.Field
import org.tasks.data.sql.Query
import org.tasks.data.sql.UnaryCriterion
@ -33,8 +32,8 @@ import kotlin.math.max
class FilterSettingsViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
private val filterCriteriaProvider: FilterCriteriaProvider,
private val database: Database,
private val filterDao: FilterDao,
private val taskDao: TaskDao,
) : ViewModel() {
data class ViewState(
val filter: CustomFilter? = null,
@ -127,13 +126,11 @@ class FilterSettingsViewModel @Inject constructor(
sql.append(Task.ID).append(" IN (").append(subSql).append(")")
}
val sqlString = QueryUtils.showHiddenAndCompleted(sql.toString())
database.rawQuery(sqlString) { cursor ->
cursor.step()
instance.start = if (last == -1) cursor.getInt(0) else last
instance.end = cursor.getInt(0)
val count = taskDao.count(sqlString)
instance.start = if (last == -1) count else last
instance.end = count
last = instance.end
max = max(max, last)
}
newList.add(instance)
}
for (instance in newList) {

@ -2,6 +2,7 @@ package org.tasks.data
import android.database.Cursor
import android.database.MatrixCursor
import androidx.room.useReaderConnection
import androidx.sqlite.SQLiteStatement
import kotlinx.coroutines.runBlocking
import org.tasks.data.dao.Astrid2ContentProviderDao
@ -37,7 +38,11 @@ class ContentProviderDaoBlocking @Inject constructor(
)
}
fun rawQuery(query: String): Cursor = runBlocking { database.rawQuery(query) { it.toCursor() } }
fun rawQuery(query: String): Cursor = runBlocking {
database.useReaderConnection { transactor ->
transactor.usePrepared(query) { it.toCursor() }
}
}
}
private fun SQLiteStatement.toCursor(): Cursor {

@ -31,13 +31,7 @@ suspend fun TaskDao.fetchFiltered(queryTemplate: String): List<Task> {
return tasks.map(TaskContainer::task)
}
suspend fun TaskDao.count(filter: Filter): Int {
val query = getQuery(filter.sql!!, Field.COUNT)
val start = if (BuildConfig.DEBUG) currentTimeMillis() else 0
val count = countRaw(query)
Timber.v("%sms: %s", currentTimeMillis() - start, query)
return count
}
suspend fun TaskDao.count(filter: Filter): Int = count(getQuery(filter.sql!!, Field.COUNT))
private fun getQuery(queryTemplate: String, vararg fields: Field): String =
Query.select(*fields)

@ -3,9 +3,7 @@ package org.tasks.data
import androidx.room.RoomDatabase
import androidx.room.TransactionScope
import androidx.room.Transactor
import androidx.room.useReaderConnection
import androidx.room.useWriterConnection
import androidx.sqlite.SQLiteStatement
suspend fun <T> RoomDatabase.withTransaction(block: suspend TransactionScope<T>.() -> T): T =
useWriterConnection { transactor ->
@ -13,6 +11,3 @@ suspend fun <T> RoomDatabase.withTransaction(block: suspend TransactionScope<T>.
block()
}
}
suspend fun <T> RoomDatabase.rawQuery(query: String, block: (SQLiteStatement) -> T): T =
useReaderConnection { transactor -> transactor.usePrepared(query) { block(it) } }

@ -129,7 +129,13 @@ FROM (
@RawQuery
internal abstract suspend fun fetchRaw(query: RoomRawQuery): List<TaskContainer>
suspend fun countRaw(query: String): Int = countRaw(RoomRawQuery(query))
suspend fun count(query: String): Int {
val start = DateTimeUtils2.currentTimeMillis()
val result = countRaw(RoomRawQuery(query))
val end = DateTimeUtils2.currentTimeMillis()
Logger.v("TaskDao") { "${end - start}ms: ${query.replace(Regex("\\s+"), " ").trim()}" }
return result
}
@RawQuery
internal abstract suspend fun countRaw(query: RoomRawQuery): Int

Loading…
Cancel
Save