Upgrade to SQLDelight 2

(cherry picked from commit 6a558ad119ff35336c2141deefc5da4b49cf4553)

# Conflicts:
#	app/build.gradle.kts
#	app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
#	data/src/main/java/tachiyomi/data/manga/MangaMapper.kt
#	data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt
#	data/src/main/sqldelight/tachiyomi/data/mangas.sq
This commit is contained in:
arkon
2023-06-24 22:49:36 -04:00
committed by Jobobby04
parent bc898118b8
commit af41e65b3d
31 changed files with 169 additions and 91 deletions
@@ -1,12 +1,13 @@
package tachiyomi.data
import androidx.paging.PagingSource
import com.squareup.sqldelight.Query
import com.squareup.sqldelight.db.SqlDriver
import com.squareup.sqldelight.runtime.coroutines.asFlow
import com.squareup.sqldelight.runtime.coroutines.mapToList
import com.squareup.sqldelight.runtime.coroutines.mapToOne
import com.squareup.sqldelight.runtime.coroutines.mapToOneOrNull
import app.cash.sqldelight.ExecutableQuery
import app.cash.sqldelight.Query
import app.cash.sqldelight.coroutines.asFlow
import app.cash.sqldelight.coroutines.mapToList
import app.cash.sqldelight.coroutines.mapToOne
import app.cash.sqldelight.coroutines.mapToOneOrNull
import app.cash.sqldelight.db.SqlDriver
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
@@ -32,6 +33,15 @@ class AndroidDatabaseHandler(
return dispatch(inTransaction) { block(db).executeAsList() }
}
// SY -->
override suspend fun <T : Any> awaitListExecutable(
inTransaction: Boolean,
block: suspend Database.() -> ExecutableQuery<T>,
): List<T> {
return dispatch(inTransaction) { block(db).executeAsList() }
}
// SY <--
override suspend fun <T : Any> awaitOne(
inTransaction: Boolean,
block: suspend Database.() -> Query<T>,
@@ -39,6 +49,13 @@ class AndroidDatabaseHandler(
return dispatch(inTransaction) { block(db).executeAsOne() }
}
override suspend fun <T : Any> awaitOneExecutable(
inTransaction: Boolean,
block: suspend Database.() -> ExecutableQuery<T>,
): T {
return dispatch(inTransaction) { block(db).executeAsOne() }
}
override suspend fun <T : Any> awaitOneOrNull(
inTransaction: Boolean,
block: suspend Database.() -> Query<T>,
@@ -46,6 +63,13 @@ class AndroidDatabaseHandler(
return dispatch(inTransaction) { block(db).executeAsOneOrNull() }
}
override suspend fun <T : Any> awaitOneOrNullExecutable(
inTransaction: Boolean,
block: suspend Database.() -> ExecutableQuery<T>,
): T? {
return dispatch(inTransaction) { block(db).executeAsOneOrNull() }
}
override fun <T : Any> subscribeToList(block: Database.() -> Query<T>): Flow<List<T>> {
return block(db).asFlow().mapToList(queryDispatcher)
}
@@ -1,6 +1,6 @@
package tachiyomi.data
import com.squareup.sqldelight.ColumnAdapter
import app.cash.sqldelight.ColumnAdapter
import eu.kanade.tachiyomi.source.model.UpdateStrategy
import java.util.Date
@@ -1,7 +1,8 @@
package tachiyomi.data
import androidx.paging.PagingSource
import com.squareup.sqldelight.Query
import app.cash.sqldelight.ExecutableQuery
import app.cash.sqldelight.Query
import kotlinx.coroutines.flow.Flow
interface DatabaseHandler {
@@ -13,16 +14,33 @@ interface DatabaseHandler {
block: suspend Database.() -> Query<T>,
): List<T>
// SY -->
suspend fun <T : Any> awaitListExecutable(
inTransaction: Boolean = false,
block: suspend Database.() -> ExecutableQuery<T>,
): List<T>
// SY <--
suspend fun <T : Any> awaitOne(
inTransaction: Boolean = false,
block: suspend Database.() -> Query<T>,
): T
suspend fun <T : Any> awaitOneExecutable(
inTransaction: Boolean = false,
block: suspend Database.() -> ExecutableQuery<T>,
): T
suspend fun <T : Any> awaitOneOrNull(
inTransaction: Boolean = false,
block: suspend Database.() -> Query<T>,
): T?
suspend fun <T : Any> awaitOneOrNullExecutable(
inTransaction: Boolean = false,
block: suspend Database.() -> ExecutableQuery<T>,
): T?
fun <T : Any> subscribeToList(block: Database.() -> Query<T>): Flow<List<T>>
fun <T : Any> subscribeToOne(block: Database.() -> Query<T>): Flow<T>
@@ -1,9 +1,9 @@
package tachiyomi.data
import com.squareup.sqldelight.Query
import com.squareup.sqldelight.db.SqlCursor
import com.squareup.sqldelight.db.SqlDriver
import com.squareup.sqldelight.internal.copyOnWriteList
import app.cash.sqldelight.ExecutableQuery
import app.cash.sqldelight.db.QueryResult
import app.cash.sqldelight.db.SqlCursor
import app.cash.sqldelight.db.SqlDriver
import exh.source.MERGED_SOURCE_ID
import tachiyomi.view.LibraryView
@@ -33,11 +33,11 @@ private val mapper = { cursor: SqlCursor ->
last_modified_at = cursor.getLong(21)!!,
favorite_modified_at = cursor.getLong(22),
totalCount = cursor.getLong(23)!!,
readCount = cursor.getLong(24)!!,
readCount = cursor.getDouble(24)!!,
latestUpload = cursor.getLong(25)!!,
chapterFetchedAt = cursor.getLong(26)!!,
lastRead = cursor.getLong(27)!!,
bookmarkCount = cursor.getLong(28)!!,
bookmarkCount = cursor.getDouble(28)!!,
category = cursor.getLong(29)!!,
)
}
@@ -45,8 +45,9 @@ private val mapper = { cursor: SqlCursor ->
class LibraryQuery(
val driver: SqlDriver,
val condition: String = "M.favorite = 1",
) : Query<LibraryView>(copyOnWriteList(), mapper) {
override fun execute(): SqlCursor {
) : ExecutableQuery<LibraryView>(mapper) {
override fun <R> execute(mapper: (SqlCursor) -> QueryResult<R>): QueryResult<R> {
return driver.executeQuery(
null,
"""
@@ -116,7 +117,8 @@ class LibraryQuery(
ON MC.manga_id = M._id
WHERE $condition AND M.source = $MERGED_SOURCE_ID;
""".trimIndent(),
1,
mapper,
parameters = 0,
)
}
@@ -2,7 +2,7 @@ package tachiyomi.data
import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.squareup.sqldelight.Query
import app.cash.sqldelight.Query
import kotlin.properties.Delegates
class QueryPagingSource<RowType : Any>(
@@ -1,9 +1,9 @@
package tachiyomi.data
import com.squareup.sqldelight.Query
import com.squareup.sqldelight.db.SqlCursor
import com.squareup.sqldelight.db.SqlDriver
import com.squareup.sqldelight.internal.copyOnWriteList
import app.cash.sqldelight.ExecutableQuery
import app.cash.sqldelight.db.QueryResult
import app.cash.sqldelight.db.SqlCursor
import app.cash.sqldelight.db.SqlDriver
import exh.source.MERGED_SOURCE_ID
import tachiyomi.view.UpdatesView
@@ -26,8 +26,8 @@ private val mapper = { cursor: SqlCursor ->
)
}
class UpdatesQuery(val driver: SqlDriver, val after: Long, val limit: Long) : Query<UpdatesView>(copyOnWriteList(), mapper) {
override fun execute(): SqlCursor {
class UpdatesQuery(val driver: SqlDriver, val after: Long, val limit: Long) : ExecutableQuery<UpdatesView>(mapper) {
override fun <R> execute(mapper: (SqlCursor) -> QueryResult<R>): QueryResult<R> {
return driver.executeQuery(
null,
"""
@@ -82,6 +82,7 @@ class UpdatesQuery(val driver: SqlDriver, val after: Long, val limit: Long) : Qu
ORDER BY datefetch DESC
LIMIT :limit;
""".trimIndent(),
mapper,
2,
binders = {
bindLong(1, after)
@@ -37,7 +37,7 @@ class CategoryRepositoryImpl(
// SY -->
override suspend fun insert(category: Category): Long {
return handler.awaitOne(true) {
return handler.awaitOneExecutable(true) {
categoriesQueries.insert(
name = category.name,
order = category.order,
@@ -2,7 +2,6 @@ package tachiyomi.data.chapter
import kotlinx.coroutines.flow.Flow
import logcat.LogPriority
import tachiyomi.core.util.lang.toLong
import tachiyomi.core.util.system.logcat
import tachiyomi.data.DatabaseHandler
import tachiyomi.domain.chapter.model.Chapter
@@ -56,8 +55,8 @@ class ChapterRepositoryImpl(
url = chapterUpdate.url,
name = chapterUpdate.name,
scanlator = chapterUpdate.scanlator,
read = chapterUpdate.read?.toLong(),
bookmark = chapterUpdate.bookmark?.toLong(),
read = chapterUpdate.read,
bookmark = chapterUpdate.bookmark,
lastPageRead = chapterUpdate.lastPageRead,
chapterNumber = chapterUpdate.chapterNumber?.toDouble(),
sourceOrder = chapterUpdate.sourceOrder,
@@ -38,7 +38,7 @@ val mangaMapper: (Long, Long, String, String?, String?, String?, List<String>?,
)
}
val libraryManga: (Long, Long, String, String?, String?, String?, List<String>?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, List<String>?, UpdateStrategy, Long, Long, Long?, Long, Long, Long, Long, Long, Long, Long) -> LibraryManga =
val libraryManga: (Long, Long, String, String?, String?, String?, List<String>?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, List<String>?, UpdateStrategy, Long, Long, Long?, Long, Double, Long, Long, Long, Double, Long) -> LibraryManga =
{ id, source, url, artist, author, description, genre, title, status, thumbnailUrl, favorite, lastUpdate, nextUpdate, initialized, viewerFlags, chapterFlags, coverLastModified, dateAdded, filteredScanlators, updateStrategy, calculateInterval, lastModifiedAt, favoriteModifiedAt, totalCount, readCount, latestUpload, chapterFetchedAt, lastRead, bookmarkCount, category ->
LibraryManga(
manga = mangaMapper(
@@ -70,8 +70,8 @@ val libraryManga: (Long, Long, String, String?, String?, String?, List<String>?,
),
category = category,
totalChapters = totalCount,
readCount = readCount,
bookmarkCount = bookmarkCount,
readCount = readCount.toLong(),
bookmarkCount = bookmarkCount.toLong(),
latestUpload = latestUpload,
chapterFetchedAt = chapterFetchedAt,
lastRead = lastRead,
@@ -101,14 +101,14 @@ val libraryViewMapper: (LibraryView) -> LibraryManga = {
updateStrategy = it.update_strategy,
initialized = it.initialized,
filteredScanlators = it.filtered_scanlators,
calculateInterval = it.calculate_interval.toInt(),
fetchInterval = it.calculate_interval.toInt(),
lastModifiedAt = it.last_modified_at,
favoriteModifiedAt = it.favorite_modified_at,
),
category = it.category,
totalChapters = it.totalCount,
readCount = it.readCount,
bookmarkCount = it.bookmarkCount,
readCount = it.readCount.toLong(),
bookmarkCount = it.bookmarkCount.toLong(),
latestUpload = it.latestUpload,
chapterFetchedAt = it.chapterFetchedAt,
lastRead = it.lastRead,
@@ -2,7 +2,6 @@ package tachiyomi.data.manga
import kotlinx.coroutines.flow.Flow
import logcat.LogPriority
import tachiyomi.core.util.lang.toLong
import tachiyomi.core.util.system.logcat
import tachiyomi.data.DatabaseHandler
import tachiyomi.domain.manga.model.Manga
@@ -63,9 +62,9 @@ class MangaMergeRepositoryImpl(
values.forEach { value ->
mergedQueries.updateSettingsById(
id = value.id,
getChapterUpdates = value.getChapterUpdates?.toLong(),
downloadChapters = value.downloadChapters?.toLong(),
infoManga = value.isInfoManga?.toLong(),
getChapterUpdates = value.getChapterUpdates,
downloadChapters = value.downloadChapters,
infoManga = value.isInfoManga,
chapterPriority = value.chapterPriority?.toLong(),
chapterSortMode = value.chapterSortMode?.toLong(),
)
@@ -74,7 +73,7 @@ class MangaMergeRepositoryImpl(
}
override suspend fun insert(reference: MergedMangaReference): Long? {
return handler.awaitOneOrNull {
return handler.awaitOneOrNullExecutable {
mergedQueries.insert(
infoManga = reference.isInfoManga,
getChapterUpdates = reference.getChapterUpdates,
@@ -3,7 +3,6 @@ package tachiyomi.data.manga
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import logcat.LogPriority
import tachiyomi.core.util.lang.toLong
import tachiyomi.core.util.system.logcat
import tachiyomi.data.AndroidDatabaseHandler
import tachiyomi.data.DatabaseHandler
@@ -40,7 +39,7 @@ class MangaRepositoryImpl(
}
override suspend fun getLibraryManga(): List<LibraryManga> {
return handler.awaitList { (handler as AndroidDatabaseHandler).getLibraryQuery() }.map(libraryViewMapper)
return handler.awaitListExecutable { (handler as AndroidDatabaseHandler).getLibraryQuery() }.map(libraryViewMapper)
// return handler.awaitList { libraryViewQueries.library(libraryManga) }
}
@@ -81,10 +80,10 @@ class MangaRepositoryImpl(
}
override suspend fun insert(manga: Manga): Long? {
return handler.awaitOneOrNull(inTransaction = true) {
return handler.awaitOneOrNullExecutable(inTransaction = true) {
// SY -->
if (mangasQueries.getIdByUrlAndSource(manga.url, manga.source).executeAsOneOrNull() != null) {
return@awaitOneOrNull mangasQueries.getIdByUrlAndSource(manga.url, manga.source)
return@awaitOneOrNullExecutable mangasQueries.getIdByUrlAndSource(manga.url, manga.source)
}
// SY <--
mangasQueries.insert(
@@ -148,11 +147,11 @@ class MangaRepositoryImpl(
title = value.title,
status = value.status,
thumbnailUrl = value.thumbnailUrl,
favorite = value.favorite?.toLong(),
favorite = value.favorite,
lastUpdate = value.lastUpdate,
nextUpdate = value.nextUpdate,
calculateInterval = value.fetchInterval?.toLong(),
initialized = value.initialized?.toLong(),
initialized = value.initialized,
viewer = value.viewerFlags,
chapterFlags = value.chapterFlags,
coverLastModified = value.coverLastModified,
@@ -181,7 +180,7 @@ class MangaRepositoryImpl(
}
override suspend fun getReadMangaNotInLibrary(): List<LibraryManga> {
return handler.awaitList {
return handler.awaitListExecutable {
(handler as AndroidDatabaseHandler).getLibraryQuery("M.favorite = 0 AND C.readCount != 0")
}.map(libraryViewMapper)
}
@@ -47,7 +47,7 @@ class FeedSavedSearchRepositoryImpl(
}
override suspend fun insert(feedSavedSearch: FeedSavedSearch): Long {
return handler.awaitOne(true) {
return handler.awaitOneExecutable(true) {
feed_saved_searchQueries.insert(
feedSavedSearch.source,
feedSavedSearch.savedSearch,
@@ -26,7 +26,7 @@ class SavedSearchRepositoryImpl(
}
override suspend fun insert(savedSearch: SavedSearch): Long {
return handler.awaitOne(true) {
return handler.awaitOneExecutable(true) {
saved_searchQueries.insert(
savedSearch.source,
savedSearch.name,
@@ -25,7 +25,7 @@ class UpdatesRepositoryImpl(
return databaseHandler.subscribeToList {
updatesViewQueries.getRecentUpdates(after, limit, updateWithRelationMapper)
}.map {
databaseHandler.awaitList { (databaseHandler as AndroidDatabaseHandler).getUpdatesQuery(after, limit) }
databaseHandler.awaitListExecutable { (databaseHandler as AndroidDatabaseHandler).getUpdatesQuery(after, limit) }
.map(updatesViewMapper)
}
}