diff --git a/app/src/main/java/yokai/data/chapter/ChapterRepositoryImpl.kt b/app/src/main/java/yokai/data/chapter/ChapterRepositoryImpl.kt index 6128154908..feabecc904 100644 --- a/app/src/main/java/yokai/data/chapter/ChapterRepositoryImpl.kt +++ b/app/src/main/java/yokai/data/chapter/ChapterRepositoryImpl.kt @@ -23,7 +23,7 @@ class ChapterRepositoryImpl(private val handler: DatabaseHandler) : ChapterRepos handler.awaitList { chaptersQueries.getChaptersByUrl(url, filterScanlators.toInt().toLong(), Chapter::mapper) } override suspend fun getChapterByUrl(url: String, filterScanlators: Boolean): Chapter? = - handler.awaitOneOrNull { chaptersQueries.getChaptersByUrl(url, filterScanlators.toInt().toLong(), Chapter::mapper) } + handler.awaitFirstOrNull { chaptersQueries.getChaptersByUrl(url, filterScanlators.toInt().toLong(), Chapter::mapper) } override suspend fun getChaptersByUrlAndMangaId( url: String, @@ -39,7 +39,7 @@ class ChapterRepositoryImpl(private val handler: DatabaseHandler) : ChapterRepos mangaId: Long, filterScanlators: Boolean ): Chapter? = - handler.awaitOneOrNull { + handler.awaitFirstOrNull { chaptersQueries.getChaptersByUrlAndMangaId(url, mangaId, filterScanlators.toInt().toLong(), Chapter::mapper) } diff --git a/app/src/main/java/yokai/data/manga/MangaRepositoryImpl.kt b/app/src/main/java/yokai/data/manga/MangaRepositoryImpl.kt index 41ea95a04a..c67790ff55 100644 --- a/app/src/main/java/yokai/data/manga/MangaRepositoryImpl.kt +++ b/app/src/main/java/yokai/data/manga/MangaRepositoryImpl.kt @@ -16,7 +16,7 @@ class MangaRepositoryImpl(private val handler: DatabaseHandler) : MangaRepositor handler.awaitList { mangasQueries.findAll(Manga::mapper) } override suspend fun getMangaByUrlAndSource(url: String, source: Long): Manga? = - handler.awaitOneOrNull { mangasQueries.findByUrlAndSource(url, source, Manga::mapper) } + handler.awaitFirstOrNull { mangasQueries.findByUrlAndSource(url, source, Manga::mapper) } override suspend fun getMangaById(id: Long): Manga? = handler.awaitOneOrNull { mangasQueries.findById(id, Manga::mapper) } @@ -37,7 +37,7 @@ class MangaRepositoryImpl(private val handler: DatabaseHandler) : MangaRepositor handler.subscribeToList { library_viewQueries.findAll(LibraryManga::mapper) } override suspend fun getDuplicateFavorite(title: String, source: Long): Manga? = - handler.awaitOneOrNull { mangasQueries.findDuplicateFavorite(title.lowercase(), source, Manga::mapper) } + handler.awaitFirstOrNull { mangasQueries.findDuplicateFavorite(title.lowercase(), source, Manga::mapper) } override suspend fun update(update: MangaUpdate): Boolean { return try { diff --git a/data/src/androidMain/kotlin/yokai/data/AndroidDatabaseHandler.kt b/data/src/androidMain/kotlin/yokai/data/AndroidDatabaseHandler.kt index 977a065c66..b0d578fa36 100644 --- a/data/src/androidMain/kotlin/yokai/data/AndroidDatabaseHandler.kt +++ b/data/src/androidMain/kotlin/yokai/data/AndroidDatabaseHandler.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.withContext +import yokai.data.util.executeAsFirstOrNull class AndroidDatabaseHandler( val db: Database, @@ -53,6 +54,13 @@ class AndroidDatabaseHandler( return dispatch(inTransaction) { block(db).executeAsOneOrNull() } } + override suspend fun awaitFirstOrNull( + inTransaction: Boolean, + block: suspend Database.() -> Query + ): T? { + return dispatch(inTransaction) { block(db).executeAsFirstOrNull() } + } + override suspend fun awaitOneOrNullExecutable( inTransaction: Boolean, block: suspend Database.() -> ExecutableQuery, diff --git a/data/src/commonMain/kotlin/yokai/data/DatabaseHandler.kt b/data/src/commonMain/kotlin/yokai/data/DatabaseHandler.kt index bc7c145d98..a73171dc29 100644 --- a/data/src/commonMain/kotlin/yokai/data/DatabaseHandler.kt +++ b/data/src/commonMain/kotlin/yokai/data/DatabaseHandler.kt @@ -27,6 +27,11 @@ interface DatabaseHandler { block: suspend Database.() -> Query ): T? + suspend fun awaitFirstOrNull( + inTransaction: Boolean = false, + block: suspend Database.() -> Query + ): T? + suspend fun awaitOneOrNullExecutable( inTransaction: Boolean = false, block: suspend Database.() -> ExecutableQuery, diff --git a/data/src/commonMain/kotlin/yokai/data/util/SqlDelightUtil.kt b/data/src/commonMain/kotlin/yokai/data/util/SqlDelightUtil.kt new file mode 100644 index 0000000000..d469d7402e --- /dev/null +++ b/data/src/commonMain/kotlin/yokai/data/util/SqlDelightUtil.kt @@ -0,0 +1,13 @@ +package yokai.data.util + +import app.cash.sqldelight.ExecutableQuery +import app.cash.sqldelight.db.QueryResult + +fun ExecutableQuery.executeAsFirst(): T { + return executeAsFirstOrNull() ?: throw NullPointerException("ResultSet returned null for $this") +} + +fun ExecutableQuery.executeAsFirstOrNull(): T? = execute { cursor -> + if (!cursor.next().value) return@execute QueryResult.Value(null) + QueryResult.Value(mapper(cursor)) +}.value