mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
chore: More storio to sqldelight migration
- insert manga - update manga
This commit is contained in:
parent
28e551de36
commit
5ed2934b73
15 changed files with 204 additions and 17 deletions
|
@ -70,7 +70,7 @@ class MangaPutResolver : DefaultPutResolver<Manga>() {
|
||||||
put(COL_CHAPTER_FLAGS, obj.chapter_flags)
|
put(COL_CHAPTER_FLAGS, obj.chapter_flags)
|
||||||
put(COL_DATE_ADDED, obj.date_added)
|
put(COL_DATE_ADDED, obj.date_added)
|
||||||
put(COL_FILTERED_SCANLATORS, obj.filtered_scanlators)
|
put(COL_FILTERED_SCANLATORS, obj.filtered_scanlators)
|
||||||
put(COL_UPDATE_STRATEGY, obj.update_strategy.let(updateStrategyAdapter::encode))
|
put(COL_UPDATE_STRATEGY, obj.update_strategy.let(updateStrategyAdapter::encode).toInt())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,9 +94,9 @@ interface BaseMangaGetResolver {
|
||||||
hide_title = cursor.getInt(cursor.getColumnIndex(COL_HIDE_TITLE)) == 1
|
hide_title = cursor.getInt(cursor.getColumnIndex(COL_HIDE_TITLE)) == 1
|
||||||
date_added = cursor.getLong(cursor.getColumnIndex(COL_DATE_ADDED))
|
date_added = cursor.getLong(cursor.getColumnIndex(COL_DATE_ADDED))
|
||||||
filtered_scanlators = cursor.getString(cursor.getColumnIndex(COL_FILTERED_SCANLATORS))
|
filtered_scanlators = cursor.getString(cursor.getColumnIndex(COL_FILTERED_SCANLATORS))
|
||||||
update_strategy = cursor.getInt(cursor.getColumnIndex(COL_UPDATE_STRATEGY)).let(
|
update_strategy = cursor.getInt(cursor.getColumnIndex(COL_UPDATE_STRATEGY)).let {
|
||||||
updateStrategyAdapter::decode,
|
updateStrategyAdapter.decode(it.toLong())
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ data class LibraryManga(
|
||||||
this.chapter_flags = chapterFlags.toInt()
|
this.chapter_flags = chapterFlags.toInt()
|
||||||
this.date_added = dateAdded ?: 0L
|
this.date_added = dateAdded ?: 0L
|
||||||
this.filtered_scanlators = filteredScanlators
|
this.filtered_scanlators = filteredScanlators
|
||||||
this.update_strategy = updateStrategy.toInt().let(updateStrategyAdapter::decode)
|
this.update_strategy = updateStrategy.let(updateStrategyAdapter::decode)
|
||||||
this.read = readCount.roundToInt()
|
this.read = readCount.roundToInt()
|
||||||
this.unread = maxOf((total - readCount).roundToInt(), 0)
|
this.unread = maxOf((total - readCount).roundToInt(), 0)
|
||||||
this.totalChapters = readCount.roundToInt()
|
this.totalChapters = readCount.roundToInt()
|
||||||
|
|
|
@ -419,7 +419,7 @@ interface Manga : SManga {
|
||||||
this.hide_title = hideTitle > 0
|
this.hide_title = hideTitle > 0
|
||||||
this.date_added = dateAdded ?: 0L
|
this.date_added = dateAdded ?: 0L
|
||||||
this.filtered_scanlators = filteredScanlators
|
this.filtered_scanlators = filteredScanlators
|
||||||
this.update_strategy = updateStrategy.toInt().let(updateStrategyAdapter::decode)
|
this.update_strategy = updateStrategy.let(updateStrategyAdapter::decode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,8 +91,6 @@ interface MangaQueries : DbProvider {
|
||||||
|
|
||||||
fun insertManga(manga: Manga) = db.put().`object`(manga).prepare()
|
fun insertManga(manga: Manga) = db.put().`object`(manga).prepare()
|
||||||
|
|
||||||
fun insertMangas(mangas: List<Manga>) = db.put().objects(mangas).prepare()
|
|
||||||
|
|
||||||
fun updateChapterFlags(manga: Manga) = db.put()
|
fun updateChapterFlags(manga: Manga) = db.put()
|
||||||
.`object`(manga)
|
.`object`(manga)
|
||||||
.withPutResolver(MangaFlagsPutResolver(MangaTable.COL_CHAPTER_FLAGS, Manga::chapter_flags))
|
.withPutResolver(MangaFlagsPutResolver(MangaTable.COL_CHAPTER_FLAGS, Manga::chapter_flags))
|
||||||
|
|
|
@ -60,6 +60,8 @@ import uy.kohesive.injekt.injectLazy
|
||||||
import yokai.domain.category.interactor.GetCategories
|
import yokai.domain.category.interactor.GetCategories
|
||||||
import yokai.domain.chapter.interactor.GetChapters
|
import yokai.domain.chapter.interactor.GetChapters
|
||||||
import yokai.domain.manga.interactor.GetLibraryManga
|
import yokai.domain.manga.interactor.GetLibraryManga
|
||||||
|
import yokai.domain.manga.interactor.UpdateManga
|
||||||
|
import yokai.domain.manga.models.MangaUpdate
|
||||||
import yokai.util.isLewd
|
import yokai.util.isLewd
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.*
|
import java.util.concurrent.*
|
||||||
|
@ -86,6 +88,7 @@ class LibraryPresenter(
|
||||||
private val getCategories: GetCategories by injectLazy()
|
private val getCategories: GetCategories by injectLazy()
|
||||||
private val getLibraryManga: GetLibraryManga by injectLazy()
|
private val getLibraryManga: GetLibraryManga by injectLazy()
|
||||||
private val getChapters: GetChapters by injectLazy()
|
private val getChapters: GetChapters by injectLazy()
|
||||||
|
private val updateManga: UpdateManga by injectLazy()
|
||||||
|
|
||||||
private val libraryManga: List<LibraryManga> = emptyList()
|
private val libraryManga: List<LibraryManga> = emptyList()
|
||||||
|
|
||||||
|
@ -1131,9 +1134,9 @@ class LibraryPresenter(
|
||||||
presenterScope.launch {
|
presenterScope.launch {
|
||||||
// Create a set of the list
|
// Create a set of the list
|
||||||
val mangaToDelete = mangas.distinctBy { it.id }
|
val mangaToDelete = mangas.distinctBy { it.id }
|
||||||
mangaToDelete.forEach { it.favorite = false }
|
.mapNotNull { if (it.id != null) MangaUpdate(it.id!!, favorite = false) else null }
|
||||||
|
|
||||||
db.insertMangas(mangaToDelete).executeOnIO()
|
withIOContext { updateManga.updateAll(mangaToDelete) }
|
||||||
getLibrary()
|
getLibrary()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1168,11 +1171,11 @@ class LibraryPresenter(
|
||||||
fun reAddMangas(mangas: List<Manga>) {
|
fun reAddMangas(mangas: List<Manga>) {
|
||||||
presenterScope.launch {
|
presenterScope.launch {
|
||||||
val mangaToAdd = mangas.distinctBy { it.id }
|
val mangaToAdd = mangas.distinctBy { it.id }
|
||||||
mangaToAdd.forEach { it.favorite = true }
|
.mapNotNull { if (it.id != null) MangaUpdate(it.id!!, favorite = true) else null }
|
||||||
db.insertMangas(mangaToAdd).executeOnIO()
|
|
||||||
|
withIOContext { updateManga.updateAll(mangaToAdd) }
|
||||||
(view as? FilteredLibraryController)?.updateStatsPage()
|
(view as? FilteredLibraryController)?.updateStatsPage()
|
||||||
getLibrary()
|
getLibrary()
|
||||||
mangaToAdd.forEach { db.insertManga(it).executeAsBlocking() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,8 @@ import yokai.domain.library.custom.interactor.GetCustomManga
|
||||||
import yokai.domain.library.custom.interactor.RelinkCustomManga
|
import yokai.domain.library.custom.interactor.RelinkCustomManga
|
||||||
import yokai.domain.manga.MangaRepository
|
import yokai.domain.manga.MangaRepository
|
||||||
import yokai.domain.manga.interactor.GetLibraryManga
|
import yokai.domain.manga.interactor.GetLibraryManga
|
||||||
|
import yokai.domain.manga.interactor.InsertManga
|
||||||
|
import yokai.domain.manga.interactor.UpdateManga
|
||||||
|
|
||||||
class DomainModule : InjektModule {
|
class DomainModule : InjektModule {
|
||||||
override fun InjektRegistrar.registerInjectables() {
|
override fun InjektRegistrar.registerInjectables() {
|
||||||
|
@ -51,6 +53,8 @@ class DomainModule : InjektModule {
|
||||||
|
|
||||||
addSingletonFactory<MangaRepository> { MangaRepositoryImpl(get()) }
|
addSingletonFactory<MangaRepository> { MangaRepositoryImpl(get()) }
|
||||||
addFactory { GetLibraryManga(get()) }
|
addFactory { GetLibraryManga(get()) }
|
||||||
|
addFactory { InsertManga(get()) }
|
||||||
|
addFactory { UpdateManga(get()) }
|
||||||
|
|
||||||
addSingletonFactory<ChapterRepository> { ChapterRepositoryImpl(get()) }
|
addSingletonFactory<ChapterRepository> { ChapterRepositoryImpl(get()) }
|
||||||
addFactory { GetAvailableScanlators(get()) }
|
addFactory { GetAvailableScanlators(get()) }
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
package yokai.data.manga
|
package yokai.data.manga
|
||||||
|
|
||||||
|
import co.touchlab.kermit.Logger
|
||||||
import eu.kanade.tachiyomi.data.database.models.LibraryManga
|
import eu.kanade.tachiyomi.data.database.models.LibraryManga
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
|
import eu.kanade.tachiyomi.util.system.toInt
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import yokai.data.DatabaseHandler
|
import yokai.data.DatabaseHandler
|
||||||
|
import yokai.data.updateStrategyAdapter
|
||||||
import yokai.domain.manga.MangaRepository
|
import yokai.domain.manga.MangaRepository
|
||||||
|
import yokai.domain.manga.models.MangaUpdate
|
||||||
|
|
||||||
class MangaRepositoryImpl(private val handler: DatabaseHandler) : MangaRepository {
|
class MangaRepositoryImpl(private val handler: DatabaseHandler) : MangaRepository {
|
||||||
override suspend fun getManga(): List<Manga> =
|
override suspend fun getManga(): List<Manga> =
|
||||||
|
@ -18,4 +22,77 @@ class MangaRepositoryImpl(private val handler: DatabaseHandler) : MangaRepositor
|
||||||
|
|
||||||
override fun getLibraryMangaAsFlow(): Flow<List<LibraryManga>> =
|
override fun getLibraryMangaAsFlow(): Flow<List<LibraryManga>> =
|
||||||
handler.subscribeToList { library_viewQueries.findAll(LibraryManga::mapper) }
|
handler.subscribeToList { library_viewQueries.findAll(LibraryManga::mapper) }
|
||||||
|
|
||||||
|
override suspend fun update(update: MangaUpdate): Boolean {
|
||||||
|
return try {
|
||||||
|
partialUpdate(update)
|
||||||
|
true
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Logger.e { "Failed to update manga with id '${update.id}'" }
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun updateAll(updates: List<MangaUpdate>): Boolean {
|
||||||
|
return try {
|
||||||
|
partialUpdate(*updates.toTypedArray())
|
||||||
|
true
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Logger.e(e) { "Failed to bulk update manga" }
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun partialUpdate(vararg updates: MangaUpdate) {
|
||||||
|
handler.await(inTransaction = true) {
|
||||||
|
updates.forEach { update ->
|
||||||
|
mangasQueries.update(
|
||||||
|
source = update.source,
|
||||||
|
url = update.url,
|
||||||
|
artist = update.artist,
|
||||||
|
author = update.author,
|
||||||
|
description = update.description,
|
||||||
|
genre = update.genres?.joinToString(),
|
||||||
|
title = update.title,
|
||||||
|
status = update.status?.toLong(),
|
||||||
|
thumbnailUrl = update.thumbnailUrl,
|
||||||
|
favorite = update.favorite?.toInt()?.toLong(),
|
||||||
|
lastUpdate = update.lastUpdate,
|
||||||
|
initialized = update.initialized,
|
||||||
|
viewer = update.viewerFlags?.toLong(),
|
||||||
|
hideTitle = update.hideTitle?.toInt()?.toLong(),
|
||||||
|
chapterFlags = update.chapterFlags?.toLong(),
|
||||||
|
dateAdded = update.dateAdded,
|
||||||
|
filteredScanlators = update.filteredScanlators,
|
||||||
|
updateStrategy = update.updateStrategy?.let(updateStrategyAdapter::encode),
|
||||||
|
mangaId = update.id,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun insert(manga: Manga) =
|
||||||
|
handler.awaitOneOrNullExecutable(inTransaction = true) {
|
||||||
|
mangasQueries.insert(
|
||||||
|
source = manga.source,
|
||||||
|
url = manga.url,
|
||||||
|
artist = manga.artist,
|
||||||
|
author = manga.author,
|
||||||
|
description = manga.description,
|
||||||
|
genre = manga.genre,
|
||||||
|
title = manga.title,
|
||||||
|
status = manga.status.toLong(),
|
||||||
|
thumbnailUrl = manga.thumbnail_url,
|
||||||
|
favorite = manga.favorite.toInt().toLong(),
|
||||||
|
lastUpdate = manga.last_update,
|
||||||
|
initialized = manga.initialized,
|
||||||
|
viewer = manga.viewer_flags.toLong(),
|
||||||
|
hideTitle = manga.hide_title.toInt().toLong(),
|
||||||
|
chapterFlags = manga.chapter_flags.toLong(),
|
||||||
|
dateAdded = manga.date_added,
|
||||||
|
filteredScanlators = manga.filtered_scanlators,
|
||||||
|
updateStrategy = manga.update_strategy.let(updateStrategyAdapter::encode),
|
||||||
|
)
|
||||||
|
mangasQueries.selectLastInsertedRowId()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,14 @@ package yokai.domain.manga
|
||||||
import eu.kanade.tachiyomi.data.database.models.LibraryManga
|
import eu.kanade.tachiyomi.data.database.models.LibraryManga
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import yokai.domain.manga.models.MangaUpdate
|
||||||
|
|
||||||
interface MangaRepository {
|
interface MangaRepository {
|
||||||
suspend fun getManga(): List<Manga>
|
suspend fun getManga(): List<Manga>
|
||||||
fun getMangaAsFlow(): Flow<List<Manga>>
|
fun getMangaAsFlow(): Flow<List<Manga>>
|
||||||
suspend fun getLibraryManga(): List<LibraryManga>
|
suspend fun getLibraryManga(): List<LibraryManga>
|
||||||
fun getLibraryMangaAsFlow(): Flow<List<LibraryManga>>
|
fun getLibraryMangaAsFlow(): Flow<List<LibraryManga>>
|
||||||
|
suspend fun update(update: MangaUpdate): Boolean
|
||||||
|
suspend fun updateAll(updates: List<MangaUpdate>): Boolean
|
||||||
|
suspend fun insert(manga: Manga): Long?
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
package yokai.domain.manga.interactor
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
|
import yokai.domain.manga.MangaRepository
|
||||||
|
|
||||||
|
class InsertManga (
|
||||||
|
private val mangaRepository: MangaRepository,
|
||||||
|
) {
|
||||||
|
suspend fun await(manga: Manga) = mangaRepository.insert(manga)
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package yokai.domain.manga.interactor
|
||||||
|
|
||||||
|
import yokai.domain.manga.MangaRepository
|
||||||
|
import yokai.domain.manga.models.MangaUpdate
|
||||||
|
|
||||||
|
class UpdateManga (
|
||||||
|
private val mangaRepository: MangaRepository,
|
||||||
|
) {
|
||||||
|
suspend fun update(update: MangaUpdate) = mangaRepository.update(update)
|
||||||
|
suspend fun updateAll(updates: List<MangaUpdate>) = mangaRepository.updateAll(updates)
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package yokai.data
|
package yokai.data
|
||||||
|
|
||||||
|
import app.cash.sqldelight.ExecutableQuery
|
||||||
import app.cash.sqldelight.Query
|
import app.cash.sqldelight.Query
|
||||||
import app.cash.sqldelight.coroutines.asFlow
|
import app.cash.sqldelight.coroutines.asFlow
|
||||||
import app.cash.sqldelight.coroutines.mapToList
|
import app.cash.sqldelight.coroutines.mapToList
|
||||||
|
@ -38,6 +39,13 @@ class AndroidDatabaseHandler(
|
||||||
return dispatch(inTransaction) { block(db).executeAsOne() }
|
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(
|
override suspend fun <T : Any> awaitOneOrNull(
|
||||||
inTransaction: Boolean,
|
inTransaction: Boolean,
|
||||||
block: suspend Database.() -> Query<T>
|
block: suspend Database.() -> Query<T>
|
||||||
|
@ -45,6 +53,13 @@ class AndroidDatabaseHandler(
|
||||||
return dispatch(inTransaction) { block(db).executeAsOneOrNull() }
|
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>> {
|
override fun <T : Any> subscribeToList(block: Database.() -> Query<T>): Flow<List<T>> {
|
||||||
return block(db).asFlow().mapToList(queryDispatcher)
|
return block(db).asFlow().mapToList(queryDispatcher)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,13 +6,13 @@ import java.util.*
|
||||||
|
|
||||||
// TODO: Move to yokai.data.DatabaseAdapter
|
// TODO: Move to yokai.data.DatabaseAdapter
|
||||||
|
|
||||||
val updateStrategyAdapter = object : ColumnAdapter<UpdateStrategy, Int> {
|
val updateStrategyAdapter = object : ColumnAdapter<UpdateStrategy, Long> {
|
||||||
private val enumValues by lazy { UpdateStrategy.entries }
|
private val enumValues by lazy { UpdateStrategy.entries }
|
||||||
|
|
||||||
override fun decode(databaseValue: Int): UpdateStrategy =
|
override fun decode(databaseValue: Long): UpdateStrategy =
|
||||||
enumValues.getOrElse(databaseValue) { UpdateStrategy.ALWAYS_UPDATE }
|
enumValues.getOrElse(databaseValue.toInt()) { UpdateStrategy.ALWAYS_UPDATE }
|
||||||
|
|
||||||
override fun encode(value: UpdateStrategy): Int = value.ordinal
|
override fun encode(value: UpdateStrategy): Long = value.ordinal.toLong()
|
||||||
}
|
}
|
||||||
|
|
||||||
val dateAdapter = object : ColumnAdapter<Date, Long> {
|
val dateAdapter = object : ColumnAdapter<Date, Long> {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package yokai.data
|
package yokai.data
|
||||||
|
|
||||||
|
import app.cash.sqldelight.ExecutableQuery
|
||||||
import app.cash.sqldelight.Query
|
import app.cash.sqldelight.Query
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
|
@ -16,11 +17,21 @@ interface DatabaseHandler {
|
||||||
block: suspend Database.() -> Query<T>
|
block: suspend Database.() -> Query<T>
|
||||||
): T
|
): T
|
||||||
|
|
||||||
|
suspend fun <T : Any> awaitOneExecutable(
|
||||||
|
inTransaction: Boolean = false,
|
||||||
|
block: suspend Database.() -> ExecutableQuery<T>,
|
||||||
|
): T
|
||||||
|
|
||||||
suspend fun <T : Any> awaitOneOrNull(
|
suspend fun <T : Any> awaitOneOrNull(
|
||||||
inTransaction: Boolean = false,
|
inTransaction: Boolean = false,
|
||||||
block: suspend Database.() -> Query<T>
|
block: suspend Database.() -> Query<T>
|
||||||
): 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> subscribeToList(block: Database.() -> Query<T>): Flow<List<T>>
|
||||||
|
|
||||||
fun <T : Any> subscribeToOne(block: Database.() -> Query<T>): Flow<T>
|
fun <T : Any> subscribeToOne(block: Database.() -> Query<T>): Flow<T>
|
||||||
|
|
|
@ -29,3 +29,32 @@ CREATE INDEX library_favorite_index ON mangas(favorite) WHERE favorite = 1;
|
||||||
findAll:
|
findAll:
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM mangas;
|
FROM mangas;
|
||||||
|
|
||||||
|
insert:
|
||||||
|
INSERT INTO mangas (source, url, artist, author, description, genre, title, status, thumbnail_url, favorite, last_update, initialized, viewer, hide_title, chapter_flags, date_added, filtered_scanlators, update_strategy)
|
||||||
|
VALUES (:source, :url, :artist, :author, :description, :genre, :title, :status, :thumbnailUrl, :favorite, :lastUpdate, :initialized, :viewer, :hideTitle, :chapterFlags, :dateAdded, :filteredScanlators, :updateStrategy);
|
||||||
|
|
||||||
|
update:
|
||||||
|
UPDATE mangas SET
|
||||||
|
source = coalesce(:source, source),
|
||||||
|
url = coalesce(:url, url),
|
||||||
|
artist = coalesce(:artist, artist),
|
||||||
|
author = coalesce(:author, author),
|
||||||
|
description = coalesce(:description, description),
|
||||||
|
genre = coalesce(:genre, genre),
|
||||||
|
title = coalesce(:title, title),
|
||||||
|
status = coalesce(:status, status),
|
||||||
|
thumbnail_url = coalesce(:thumbnailUrl, thumbnail_url),
|
||||||
|
favorite = coalesce(:favorite, favorite),
|
||||||
|
last_update = coalesce(:lastUpdate, last_update),
|
||||||
|
initialized = coalesce(:initialized, initialized),
|
||||||
|
viewer = coalesce(:viewer, viewer),
|
||||||
|
hide_title = coalesce(:hideTitle, hide_title),
|
||||||
|
chapter_flags = coalesce(:chapterFlags, chapter_flags),
|
||||||
|
date_added = coalesce(:dateAdded, date_added),
|
||||||
|
filtered_scanlators = coalesce(:filteredScanlators, filtered_scanlators),
|
||||||
|
update_strategy = coalesce(:updateStrategy, update_strategy)
|
||||||
|
WHERE _id = :mangaId;
|
||||||
|
|
||||||
|
selectLastInsertedRowId:
|
||||||
|
SELECT last_insert_rowid();
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package yokai.domain.manga.models
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
||||||
|
|
||||||
|
data class MangaUpdate(
|
||||||
|
val id: Long,
|
||||||
|
val url: String? = null,
|
||||||
|
val title: String? = null,
|
||||||
|
val artist: String? = null,
|
||||||
|
val author: String? = null,
|
||||||
|
val description: String? = null,
|
||||||
|
val genres: List<String>? = null,
|
||||||
|
val status: Int? = null,
|
||||||
|
val thumbnailUrl: String? = null,
|
||||||
|
val updateStrategy: UpdateStrategy? = null,
|
||||||
|
val initialized: Boolean? = null,
|
||||||
|
var source: Long? = null,
|
||||||
|
var favorite: Boolean? = null,
|
||||||
|
var lastUpdate: Long? = null,
|
||||||
|
var dateAdded: Long? = null,
|
||||||
|
var viewerFlags: Int? = null,
|
||||||
|
var chapterFlags: Int? = null,
|
||||||
|
var hideTitle: Boolean? = null,
|
||||||
|
var filteredScanlators: String? = null,
|
||||||
|
)
|
Loading…
Add table
Add a link
Reference in a new issue