Remove need for SQLDelight primitive adapters
(cherry picked from commit cd91ea9b7723eec378bbbefd916d3da6407d685e) # Conflicts: # app/build.gradle.kts # app/src/main/java/eu/kanade/tachiyomi/AppModule.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt # data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt # domain/src/main/java/tachiyomi/domain/history/model/HistoryWithRelations.kt
This commit is contained in:
@@ -4,23 +4,23 @@ import app.cash.sqldelight.ColumnAdapter
|
||||
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
||||
import java.util.Date
|
||||
|
||||
val dateAdapter = object : ColumnAdapter<Date, Long> {
|
||||
object DateColumnAdapter : ColumnAdapter<Date, Long> {
|
||||
override fun decode(databaseValue: Long): Date = Date(databaseValue)
|
||||
override fun encode(value: Date): Long = value.time
|
||||
}
|
||||
|
||||
private const val listOfStringsSeparator = ", "
|
||||
val listOfStringsAdapter = object : ColumnAdapter<List<String>, String> {
|
||||
private const val LIST_OF_STRINGS_SEPARATOR = ", "
|
||||
object StringListColumnAdapter : ColumnAdapter<List<String>, String> {
|
||||
override fun decode(databaseValue: String) =
|
||||
if (databaseValue.isEmpty()) {
|
||||
emptyList()
|
||||
} else {
|
||||
databaseValue.split(listOfStringsSeparator)
|
||||
databaseValue.split(LIST_OF_STRINGS_SEPARATOR)
|
||||
}
|
||||
override fun encode(value: List<String>) = value.joinToString(separator = listOfStringsSeparator)
|
||||
override fun encode(value: List<String>) = value.joinToString(separator = LIST_OF_STRINGS_SEPARATOR)
|
||||
}
|
||||
|
||||
val updateStrategyAdapter = object : ColumnAdapter<UpdateStrategy, Long> {
|
||||
object UpdateStrategyColumnAdapter : ColumnAdapter<UpdateStrategy, Long> {
|
||||
override fun decode(databaseValue: Long): UpdateStrategy =
|
||||
UpdateStrategy.entries.getOrElse(databaseValue.toInt()) { UpdateStrategy.ALWAYS_UPDATE }
|
||||
|
||||
@@ -28,25 +28,14 @@ val updateStrategyAdapter = object : ColumnAdapter<UpdateStrategy, Long> {
|
||||
}
|
||||
|
||||
// SY -->
|
||||
private const val listOfStringsAndSeparator = " & "
|
||||
val listOfStringsAndAdapter = object : ColumnAdapter<List<String>, String> {
|
||||
private const val LIST_OF_STRINGS_AND_SEPARATOR = " & "
|
||||
object StringListAndColumnAdapter : ColumnAdapter<List<String>, String> {
|
||||
override fun decode(databaseValue: String) =
|
||||
if (databaseValue.isEmpty()) {
|
||||
emptyList()
|
||||
} else {
|
||||
databaseValue.split(listOfStringsAndSeparator)
|
||||
databaseValue.split(LIST_OF_STRINGS_AND_SEPARATOR)
|
||||
}
|
||||
override fun encode(value: List<String>) = value.joinToString(separator = listOfStringsAndSeparator)
|
||||
}
|
||||
|
||||
private const val listOfLongsSeparator = "/"
|
||||
val listOfLongsAdapter = object : ColumnAdapter<List<Long>, String> {
|
||||
override fun decode(databaseValue: String) =
|
||||
if (databaseValue.isEmpty()) {
|
||||
emptyList()
|
||||
} else {
|
||||
databaseValue.split(listOfLongsSeparator).mapNotNull { it.toLongOrNull() }
|
||||
}
|
||||
override fun encode(value: List<Long>) = value.joinToString(separator = listOfLongsSeparator)
|
||||
override fun encode(value: List<String>) = value.joinToString(separator = LIST_OF_STRINGS_AND_SEPARATOR)
|
||||
}
|
||||
// SY <--
|
||||
|
||||
@@ -15,7 +15,7 @@ private val mapper = { cursor: SqlCursor ->
|
||||
artist = cursor.getString(3),
|
||||
author = cursor.getString(4),
|
||||
description = cursor.getString(5),
|
||||
genre = cursor.getString(6)?.let(listOfStringsAdapter::decode),
|
||||
genre = cursor.getString(6)?.let(StringListColumnAdapter::decode),
|
||||
title = cursor.getString(7)!!,
|
||||
status = cursor.getLong(8)!!,
|
||||
thumbnail_url = cursor.getString(9),
|
||||
@@ -27,8 +27,8 @@ private val mapper = { cursor: SqlCursor ->
|
||||
chapter_flags = cursor.getLong(15)!!,
|
||||
cover_last_modified = cursor.getLong(16)!!,
|
||||
date_added = cursor.getLong(17)!!,
|
||||
filtered_scanlators = cursor.getString(18)?.let(listOfStringsAndAdapter::decode),
|
||||
update_strategy = updateStrategyAdapter.decode(cursor.getLong(19)!!),
|
||||
filtered_scanlators = cursor.getString(18)?.let(StringListAndColumnAdapter::decode),
|
||||
update_strategy = UpdateStrategyColumnAdapter.decode(cursor.getLong(19)!!),
|
||||
calculate_interval = cursor.getLong(20)!!,
|
||||
last_modified_at = cursor.getLong(21)!!,
|
||||
favorite_modified_at = cursor.getLong(22),
|
||||
|
||||
@@ -2,7 +2,7 @@ package tachiyomi.data.chapter
|
||||
|
||||
import tachiyomi.domain.chapter.model.Chapter
|
||||
|
||||
val chapterMapper: (Long, Long, String, String, String?, Boolean, Boolean, Long, Float, Long, Long, Long, Long) -> Chapter =
|
||||
val chapterMapper: (Long, Long, String, String, String?, Boolean, Boolean, Long, Double, Long, Long, Long, Long) -> Chapter =
|
||||
{ id, mangaId, url, name, scanlator, read, bookmark, lastPageRead, chapterNumber, sourceOrder, dateFetch, dateUpload, lastModifiedAt ->
|
||||
Chapter(
|
||||
id = id,
|
||||
|
||||
@@ -14,7 +14,7 @@ val historyMapper: (Long, Long, Date?, Long) -> History = { id, chapterId, readA
|
||||
)
|
||||
}
|
||||
|
||||
val historyWithRelationsMapper: (Long, Long, Long, String, String?, Long, Boolean, Long, Float, Date?, Long) -> HistoryWithRelations = {
|
||||
val historyWithRelationsMapper: (Long, Long, Long, String, String?, Long, Boolean, Long, Double, Date?, Long) -> HistoryWithRelations = {
|
||||
historyId, mangaId, chapterId, title, thumbnailUrl, sourceId, isFavorite, coverLastModified, chapterNumber, readAt, readDuration ->
|
||||
HistoryWithRelations(
|
||||
id = historyId,
|
||||
|
||||
@@ -44,15 +44,15 @@ class MangaMetadataRepositoryImpl(
|
||||
|
||||
handler.await(true) {
|
||||
flatMetadata.metadata.run {
|
||||
search_metadataQueries.upsert(mangaId, uploader, extra, indexedExtra, extraVersion)
|
||||
search_metadataQueries.upsert(mangaId, uploader, extra, indexedExtra, extraVersion.toLong())
|
||||
}
|
||||
search_tagsQueries.deleteByManga(flatMetadata.metadata.mangaId)
|
||||
flatMetadata.tags.forEach {
|
||||
search_tagsQueries.insert(it.mangaId, it.namespace, it.name, it.type)
|
||||
search_tagsQueries.insert(it.mangaId, it.namespace, it.name, it.type.toLong())
|
||||
}
|
||||
search_titlesQueries.deleteByManga(flatMetadata.metadata.mangaId)
|
||||
flatMetadata.titles.forEach {
|
||||
search_titlesQueries.insert(it.mangaId, it.title, it.type)
|
||||
search_titlesQueries.insert(it.mangaId, it.title, it.type.toLong())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,9 +6,9 @@ import logcat.LogPriority
|
||||
import tachiyomi.core.util.system.logcat
|
||||
import tachiyomi.data.AndroidDatabaseHandler
|
||||
import tachiyomi.data.DatabaseHandler
|
||||
import tachiyomi.data.listOfStringsAdapter
|
||||
import tachiyomi.data.listOfStringsAndAdapter
|
||||
import tachiyomi.data.updateStrategyAdapter
|
||||
import tachiyomi.data.StringListAndColumnAdapter
|
||||
import tachiyomi.data.StringListColumnAdapter
|
||||
import tachiyomi.data.UpdateStrategyColumnAdapter
|
||||
import tachiyomi.domain.library.model.LibraryManga
|
||||
import tachiyomi.domain.manga.model.Manga
|
||||
import tachiyomi.domain.manga.model.MangaUpdate
|
||||
@@ -143,7 +143,7 @@ class MangaRepositoryImpl(
|
||||
artist = value.artist,
|
||||
author = value.author,
|
||||
description = value.description,
|
||||
genre = value.genre?.let(listOfStringsAdapter::encode),
|
||||
genre = value.genre?.let(StringListColumnAdapter::encode),
|
||||
title = value.title,
|
||||
status = value.status,
|
||||
thumbnailUrl = value.thumbnailUrl,
|
||||
@@ -157,10 +157,10 @@ class MangaRepositoryImpl(
|
||||
coverLastModified = value.coverLastModified,
|
||||
dateAdded = value.dateAdded,
|
||||
// SY -->
|
||||
filteredScanlators = value.filteredScanlators?.let(listOfStringsAndAdapter::encode),
|
||||
filteredScanlators = value.filteredScanlators?.let(StringListAndColumnAdapter::encode),
|
||||
// SY <--
|
||||
mangaId = value.id,
|
||||
updateStrategy = value.updateStrategy?.let(updateStrategyAdapter::encode),
|
||||
updateStrategy = value.updateStrategy?.let(UpdateStrategyColumnAdapter::encode),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,13 @@ package tachiyomi.data.manga
|
||||
|
||||
import exh.metadata.sql.models.SearchMetadata
|
||||
|
||||
val searchMetadataMapper: (Long, String?, String, String?, Int) -> SearchMetadata =
|
||||
val searchMetadataMapper: (Long, String?, String, String?, Long) -> SearchMetadata =
|
||||
{ mangaId, uploader, extra, indexedExtra, extraVersion ->
|
||||
SearchMetadata(
|
||||
mangaId = mangaId,
|
||||
uploader = uploader,
|
||||
extra = extra,
|
||||
indexedExtra = indexedExtra,
|
||||
extraVersion = extraVersion,
|
||||
extraVersion = extraVersion.toInt(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -2,13 +2,13 @@ package tachiyomi.data.manga
|
||||
|
||||
import exh.metadata.sql.models.SearchTag
|
||||
|
||||
val searchTagMapper: (Long, Long, String?, String, Int) -> SearchTag =
|
||||
val searchTagMapper: (Long, Long, String?, String, Long) -> SearchTag =
|
||||
{ id, mangaId, namespace, name, type ->
|
||||
SearchTag(
|
||||
id = id,
|
||||
mangaId = mangaId,
|
||||
namespace = namespace,
|
||||
name = name,
|
||||
type = type,
|
||||
type = type.toInt(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -2,12 +2,12 @@ package tachiyomi.data.manga
|
||||
|
||||
import exh.metadata.sql.models.SearchTitle
|
||||
|
||||
val searchTitleMapper: (Long, Long, String, Int) -> SearchTitle =
|
||||
val searchTitleMapper: (Long, Long, String, Long) -> SearchTitle =
|
||||
{ id, mangaId, title, type ->
|
||||
SearchTitle(
|
||||
id = id,
|
||||
mangaId = mangaId,
|
||||
title = title,
|
||||
type = type,
|
||||
type = type.toInt(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package tachiyomi.data.track
|
||||
|
||||
import tachiyomi.domain.track.model.Track
|
||||
|
||||
val trackMapper: (Long, Long, Long, Long, Long?, String, Double, Long, Long, Float, String, Long, Long) -> Track =
|
||||
val trackMapper: (Long, Long, Long, Long, Long?, String, Double, Long, Long, Double, String, Long, Long) -> Track =
|
||||
{ id, mangaId, syncId, remoteId, libraryId, title, lastChapterRead, totalChapters, status, score, remoteUrl, startDate, finishDate ->
|
||||
Track(
|
||||
id = id,
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import kotlin.Boolean;
|
||||
import kotlin.Float;
|
||||
|
||||
CREATE TABLE chapters(
|
||||
_id INTEGER NOT NULL PRIMARY KEY,
|
||||
@@ -10,7 +9,7 @@ CREATE TABLE chapters(
|
||||
read INTEGER AS Boolean NOT NULL,
|
||||
bookmark INTEGER AS Boolean NOT NULL,
|
||||
last_page_read INTEGER NOT NULL,
|
||||
chapter_number REAL AS Float NOT NULL,
|
||||
chapter_number REAL NOT NULL,
|
||||
source_order INTEGER NOT NULL,
|
||||
date_fetch INTEGER NOT NULL,
|
||||
date_upload INTEGER NOT NULL,
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import kotlin.Float;
|
||||
|
||||
CREATE TABLE manga_sync(
|
||||
_id INTEGER NOT NULL PRIMARY KEY,
|
||||
manga_id INTEGER NOT NULL,
|
||||
@@ -10,7 +8,7 @@ CREATE TABLE manga_sync(
|
||||
last_chapter_read REAL NOT NULL,
|
||||
total_chapters INTEGER NOT NULL,
|
||||
status INTEGER NOT NULL,
|
||||
score REAL AS Float NOT NULL,
|
||||
score REAL NOT NULL,
|
||||
remote_url TEXT NOT NULL,
|
||||
start_date INTEGER NOT NULL,
|
||||
finish_date INTEGER NOT NULL,
|
||||
|
||||
@@ -5,7 +5,7 @@ CREATE TABLE search_metadata (
|
||||
uploader TEXT,
|
||||
extra TEXT NOT NULL,
|
||||
indexed_extra TEXT,
|
||||
extra_version INTEGER AS Int NOT NULL,
|
||||
extra_version INTEGER NOT NULL,
|
||||
FOREIGN KEY(manga_id) REFERENCES mangas (_id)
|
||||
ON DELETE CASCADE
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@ CREATE TABLE search_tags (
|
||||
manga_id INTEGER NOT NULL,
|
||||
namespace TEXT,
|
||||
name TEXT NOT NULL,
|
||||
type INTEGER AS Int NOT NULL,
|
||||
type INTEGER NOT NULL,
|
||||
FOREIGN KEY(manga_id) REFERENCES mangas (_id)
|
||||
ON DELETE CASCADE
|
||||
);
|
||||
|
||||
@@ -4,7 +4,7 @@ CREATE TABLE search_titles (
|
||||
_id INTEGER NOT NULL PRIMARY KEY,
|
||||
manga_id INTEGER NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
type INTEGER AS Int NOT NULL,
|
||||
type INTEGER NOT NULL,
|
||||
FOREIGN KEY(manga_id) REFERENCES mangas (_id)
|
||||
ON DELETE CASCADE
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user