refactor: Migrate even more stuff to use SQLDelight

This commit is contained in:
Ahmad Ansori Palembani 2024-08-23 17:14:12 +07:00
parent 4af54a906a
commit 0934e7518b
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
3 changed files with 37 additions and 42 deletions

View file

@ -6,9 +6,6 @@ import com.pushtorefresh.storio.sqlite.queries.Query
import com.pushtorefresh.storio.sqlite.queries.RawQuery
import eu.kanade.tachiyomi.data.database.DbProvider
import eu.kanade.tachiyomi.data.database.models.SourceIdMangaCount
import eu.kanade.tachiyomi.data.database.resolvers.MangaDateAddedPutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaFavoritePutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaTitlePutResolver
import eu.kanade.tachiyomi.data.database.resolvers.SourceIdMangaCountGetResolver
import eu.kanade.tachiyomi.data.database.tables.ChapterTable
import eu.kanade.tachiyomi.data.database.tables.MangaTable
@ -78,24 +75,6 @@ interface MangaQueries : DbProvider {
fun insertManga(manga: Manga) = db.put().`object`(manga).prepare()
// FIXME: Migrate to SQLDelight, on halt: used by StorIO's inTransaction
fun updateMangaFavorite(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaFavoritePutResolver())
.prepare()
// FIXME: Migrate to SQLDelight, on halt: used by StorIO's inTransaction
fun updateMangaAdded(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaDateAddedPutResolver())
.prepare()
// FIXME: Migrate to SQLDelight, on halt: used by StorIO's inTransaction
fun updateMangaTitle(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaTitlePutResolver())
.prepare()
fun deleteMangasNotInLibraryBySourceIds(sourceIds: List<Long>) = db.delete()
.byQuery(
DeleteQuery.builder()

View file

@ -15,7 +15,6 @@ import eu.kanade.tachiyomi.domain.manga.models.Manga
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.migration.MigrationFlags
import eu.kanade.tachiyomi.util.system.launchNow
import eu.kanade.tachiyomi.util.system.launchUI
import java.util.Date
import kotlinx.coroutines.Dispatchers
@ -24,7 +23,11 @@ import kotlinx.coroutines.withContext
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
import yokai.domain.chapter.interactor.GetChapter
import yokai.domain.library.custom.model.CustomMangaInfo.Companion.getMangaInfo
import yokai.domain.manga.interactor.GetManga
import yokai.domain.manga.interactor.UpdateManga
import yokai.domain.manga.models.MangaUpdate
import yokai.domain.ui.UiPreferences
class MigrationProcessAdapter(
@ -32,12 +35,15 @@ class MigrationProcessAdapter(
) : FlexibleAdapter<MigrationProcessItem>(null, controller, true) {
private val db: DatabaseHelper by injectLazy()
private val getManga: GetManga by injectLazy()
var items: List<MigrationProcessItem> = emptyList()
val preferences: PreferencesHelper by injectLazy()
val uiPreferences: UiPreferences by injectLazy()
val sourceManager: SourceManager by injectLazy()
val coverCache: CoverCache by injectLazy()
val customMangaManager: CustomMangaManager by injectLazy()
private val customMangaManager: CustomMangaManager by injectLazy()
var showOutline = uiPreferences.outlineOnCovers().get()
val menuItemListener: MigrationProcessInterface = controller
@ -80,9 +86,7 @@ class MigrationProcessAdapter(
val manga = migratingManga.manga
if (manga.searchResult.initialized) {
val toMangaObj =
db.getManga(manga.searchResult.get() ?: return@forEach)
.executeAsBlocking()
?: return@forEach
getManga.awaitById(manga.searchResult.get() ?: return@forEach) ?: return@forEach
val prevManga = manga.manga() ?: return@forEach
val source = sourceManager.get(toMangaObj.source) ?: return@forEach
val prevSource = sourceManager.get(prevManga.source)
@ -103,9 +107,7 @@ class MigrationProcessAdapter(
launchUI {
val manga = getItem(position)?.manga ?: return@launchUI
db.inTransaction {
val toMangaObj =
db.getManga(manga.searchResult.get() ?: return@launchUI).executeAsBlocking()
?: return@launchUI
val toMangaObj = getManga.awaitById(manga.searchResult.get() ?: return@launchUI) ?: return@launchUI
val prevManga = manga.manga() ?: return@launchUI
val source = sourceManager.get(toMangaObj.source) ?: return@launchUI
val prevSource = sourceManager.get(prevManga.source)
@ -131,7 +133,7 @@ class MigrationProcessAdapter(
}
// FIXME: Migrate to SQLDelight, on halt: in StorIO transaction
private fun migrateMangaInternal(
private suspend fun migrateMangaInternal(
prevSource: Source?,
source: Source,
prevManga: Manga,
@ -146,7 +148,7 @@ class MigrationProcessAdapter(
companion object {
// FIXME: Migrate to SQLDelight, on halt: in StorIO transaction
fun migrateMangaInternal(
suspend fun migrateMangaInternal(
flags: Int,
db: DatabaseHelper,
enhancedServices: List<EnhancedTrackService>,
@ -157,13 +159,16 @@ class MigrationProcessAdapter(
prevManga: Manga,
manga: Manga,
replace: Boolean,
getChapter: GetChapter = Injekt.get(),
//insertChapter: InsertChapter = Injekt.get(),
updateManga: UpdateManga = Injekt.get(),
) {
// Update chapters read
if (MigrationFlags.hasChapters(flags)) {
val prevMangaChapters = db.getChapters(prevManga).executeAsBlocking()
val prevMangaChapters = getChapter.awaitAll(prevManga.id!!, false)
val maxChapterRead =
prevMangaChapters.filter { it.read }.maxOfOrNull { it.chapter_number } ?: 0f
val dbChapters = db.getChapters(manga).executeAsBlocking()
val dbChapters = getChapter.awaitAll(manga.id!!, false)
val prevHistoryList = db.getHistoryByMangaId(prevManga.id!!).executeAsBlocking()
val historyList = mutableListOf<History>()
for (chapter in dbChapters) {
@ -188,6 +193,8 @@ class MigrationProcessAdapter(
}
}
}
// FIXME: Probably gonna mess with StorIO's transaction since it's also uses transaction
//insertChapter.awaitBulk(dbChapters)
db.insertChapters(dbChapters).executeAsBlocking()
db.upsertHistoryLastRead(historyList).executeAsBlocking()
}
@ -217,7 +224,12 @@ class MigrationProcessAdapter(
// Update favorite status
if (replace) {
prevManga.favorite = false
db.updateMangaFavorite(prevManga).executeAsBlocking()
updateManga.await(
MangaUpdate(
id = manga.id!!,
favorite = manga.favorite,
)
)
}
manga.favorite = true
if (replace) {
@ -230,18 +242,21 @@ class MigrationProcessAdapter(
if (MigrationFlags.hasCustomMangaInfo(flags)) {
if (coverCache.getCustomCoverFile(prevManga).exists()) {
coverCache.setCustomCoverToCache(manga, coverCache.getCustomCoverFile(prevManga).inputStream())
launchNow { manga.updateCoverLastModified() }
manga.updateCoverLastModified()
}
customMangaManager.getManga(prevManga)?.let { customManga ->
launchNow {
customMangaManager.updateMangaInfo(prevManga.id, manga.id, customManga.getMangaInfo())
}
customMangaManager.updateMangaInfo(prevManga.id, manga.id, customManga.getMangaInfo())
}
}
db.updateMangaFavorite(manga).executeAsBlocking()
db.updateMangaAdded(manga).executeAsBlocking()
db.updateMangaTitle(manga).executeAsBlocking()
updateManga.await(
MangaUpdate(
id = manga.id!!,
favorite = manga.favorite,
dateAdded = manga.date_added,
title = manga.title,
)
)
}
}
}

View file

@ -30,6 +30,7 @@ import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationProcessAdapter
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithTrackServiceTwoWay
import eu.kanade.tachiyomi.util.lang.asButton
import eu.kanade.tachiyomi.util.system.launchIO
import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.util.system.materialAlertDialog
import eu.kanade.tachiyomi.util.system.setCustomTitleAndMessage
import eu.kanade.tachiyomi.util.system.toast
@ -329,7 +330,7 @@ private fun showAddDuplicateDialog(
val source = sourceManager.getOrStub(libraryManga.source)
val titles by lazy { MigrationFlags.titles(activity, libraryManga) }
fun migrateManga(mDialog: DialogInterface, replace: Boolean) {
fun migrateManga(mDialog: DialogInterface, replace: Boolean) = launchUI {
val listView = (mDialog as AlertDialog).listView
val enabled = titles.indices.map { listView.isItemChecked(it) }.toTypedArray()
val flags = MigrationFlags.getFlagsFromPositions(enabled, libraryManga)