refactor: make dslRO transaction aware

This commit is contained in:
Gauthier Roebroeck 2025-09-09 12:32:07 +08:00
parent e850cdcd2f
commit 69ba569b04
33 changed files with 180 additions and 87 deletions

View file

@ -13,6 +13,7 @@ import org.gotson.komga.infrastructure.image.MosaicGenerator
import org.gotson.komga.infrastructure.metadata.comicrack.ReadListProvider
import org.springframework.context.ApplicationEventPublisher
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import org.springframework.transaction.support.TransactionTemplate
private val logger = KotlinLogging.logger {}
@ -31,6 +32,7 @@ class ReadListLifecycle(
@Throws(
DuplicateNameException::class,
)
@Transactional
fun addReadList(readList: ReadList): ReadList {
logger.info { "Adding new read list: $readList" }
@ -44,6 +46,7 @@ class ReadListLifecycle(
return readListRepository.findByIdOrNull(readList.id)!!
}
@Transactional
fun updateReadList(toUpdate: ReadList) {
logger.info { "Update read list: $toUpdate" }
val existing =
@ -71,6 +74,7 @@ class ReadListLifecycle(
* Add book to read list by name.
* Read list will be created if it doesn't exist.
*/
@Transactional
fun addBookToReadList(
readListName: String,
book: Book,

View file

@ -11,6 +11,7 @@ import org.gotson.komga.domain.persistence.ThumbnailSeriesCollectionRepository
import org.gotson.komga.infrastructure.image.MosaicGenerator
import org.springframework.context.ApplicationEventPublisher
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import org.springframework.transaction.support.TransactionTemplate
private val logger = KotlinLogging.logger {}
@ -27,6 +28,7 @@ class SeriesCollectionLifecycle(
@Throws(
DuplicateNameException::class,
)
@Transactional
fun addCollection(collection: SeriesCollection): SeriesCollection {
logger.info { "Adding new collection: $collection" }
@ -40,6 +42,7 @@ class SeriesCollectionLifecycle(
return collectionRepository.findByIdOrNull(collection.id)!!
}
@Transactional
fun updateCollection(toUpdate: SeriesCollection) {
logger.info { "Update collection: $toUpdate" }
@ -67,6 +70,7 @@ class SeriesCollectionLifecycle(
* Add series to collection by name.
* Collection will be created if it doesn't exist.
*/
@Transactional
fun addSeriesToCollection(
collectionName: String,
series: Series,

View file

@ -0,0 +1,21 @@
package org.gotson.komga.infrastructure.jooq
import org.jooq.DSLContext
import org.springframework.transaction.support.TransactionSynchronizationManager
abstract class SplitDslDaoBase {
val dslRW: DSLContext
private val _dslRO: DSLContext
constructor(dslRW: DSLContext, dslRO: DSLContext) {
this.dslRW = dslRW
this._dslRO = dslRO
}
val dslRO: DSLContext
get() =
if (TransactionSynchronizationManager.isActualTransactionActive() && !TransactionSynchronizationManager.isCurrentTransactionReadOnly())
dslRW
else
_dslRO
}

View file

@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.AuthenticationActivity
import org.gotson.komga.domain.model.KomgaUser
import org.gotson.komga.domain.persistence.AuthenticationActivityRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.toOrderBy
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.AuthenticationActivityRecord
@ -21,9 +22,10 @@ import java.time.LocalDateTime
@Component
class AuthenticationActivityDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : AuthenticationActivityRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
AuthenticationActivityRepository {
private val aa = Tables.AUTHENTICATION_ACTIVITY
private val sorts =

View file

@ -1,6 +1,7 @@
package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.ContentRestrictions
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.toCondition
import org.gotson.komga.jooq.main.Tables
import org.jooq.DSLContext
@ -19,8 +20,9 @@ import java.time.LocalDateTime
@Component
class BookCommonDao(
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO) {
private val b = Tables.BOOK
private val m = Tables.MEDIA
private val d = Tables.BOOK_METADATA

View file

@ -6,6 +6,7 @@ import org.gotson.komga.domain.model.SearchContext
import org.gotson.komga.domain.persistence.BookRepository
import org.gotson.komga.infrastructure.jooq.BookSearchHelper
import org.gotson.komga.infrastructure.jooq.RequiredJoin
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.infrastructure.jooq.rlbAlias
import org.gotson.komga.infrastructure.jooq.toOrderBy
@ -30,10 +31,11 @@ import java.time.ZoneId
@Component
class BookDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : BookRepository {
) : SplitDslDaoBase(dslRW, dslRO),
BookRepository {
private val b = Tables.BOOK
private val m = Tables.MEDIA
private val d = Tables.BOOK_METADATA

View file

@ -7,6 +7,7 @@ import org.gotson.komga.domain.model.SearchContext
import org.gotson.komga.infrastructure.datasource.SqliteUdfDataSource
import org.gotson.komga.infrastructure.jooq.BookSearchHelper
import org.gotson.komga.infrastructure.jooq.RequiredJoin
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.infrastructure.jooq.noCase
@ -51,11 +52,13 @@ import java.net.URL
@Component
class BookDtoDao(
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
private val luceneHelper: LuceneHelper,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
private val bookCommonDao: BookCommonDao,
) : BookDtoRepository {
) : SplitDslDaoBase(dslRW, dslRO),
BookDtoRepository {
private val b = Tables.BOOK
private val m = Tables.MEDIA
private val d = Tables.BOOK_METADATA

View file

@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.Author
import org.gotson.komga.domain.model.BookMetadataAggregation
import org.gotson.komga.domain.persistence.BookMetadataAggregationRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.BookMetadataAggregationAuthorRecord
@ -18,10 +19,11 @@ import java.time.ZoneId
@Component
class BookMetadataAggregationDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : BookMetadataAggregationRepository {
) : SplitDslDaoBase(dslRW, dslRO),
BookMetadataAggregationRepository {
private val d = Tables.BOOK_METADATA_AGGREGATION
private val a = Tables.BOOK_METADATA_AGGREGATION_AUTHOR
private val t = Tables.BOOK_METADATA_AGGREGATION_TAG

View file

@ -4,6 +4,7 @@ import org.gotson.komga.domain.model.Author
import org.gotson.komga.domain.model.BookMetadata
import org.gotson.komga.domain.model.WebLink
import org.gotson.komga.domain.persistence.BookMetadataRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.BookMetadataAuthorRecord
@ -20,10 +21,11 @@ import java.time.ZoneId
@Component
class BookMetadataDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : BookMetadataRepository {
) : SplitDslDaoBase(dslRW, dslRO),
BookMetadataRepository {
private val d = Tables.BOOK_METADATA
private val a = Tables.BOOK_METADATA_AUTHOR
private val bt = Tables.BOOK_METADATA_TAG

View file

@ -1,5 +1,6 @@
package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.interfaces.api.rest.dto.ClientSettingDto
import org.gotson.komga.jooq.main.Tables
import org.jooq.DSLContext
@ -8,9 +9,9 @@ import org.springframework.stereotype.Component
@Component
class ClientSettingsDtoDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO) {
private val g = Tables.CLIENT_SETTINGS_GLOBAL
private val u = Tables.CLIENT_SETTINGS_USER

View file

@ -1,5 +1,6 @@
package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.toOrderBy
import org.gotson.komga.interfaces.api.persistence.HistoricalEventDtoRepository
import org.gotson.komga.interfaces.api.rest.dto.HistoricalEventDto
@ -15,8 +16,10 @@ import org.springframework.stereotype.Component
@Component
class HistoricalEventDtoDao(
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : HistoricalEventDtoRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
HistoricalEventDtoRepository {
private val e = Tables.HISTORICAL_EVENT
private val ep = Tables.HISTORICAL_EVENT_PROPERTIES

View file

@ -2,6 +2,7 @@ package org.gotson.komga.infrastructure.jooq.main
import com.fasterxml.jackson.databind.ObjectMapper
import org.gotson.komga.domain.model.MediaExtensionEpub
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.deserializeMediaExtension
import org.gotson.komga.interfaces.api.kobo.dto.ContributorDto
import org.gotson.komga.interfaces.api.kobo.dto.KoboBookMetadataDto
@ -16,9 +17,11 @@ import java.time.ZoneId
@Component
class KoboDtoDao(
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
private val mapper: ObjectMapper,
) : KoboDtoRepository {
) : SplitDslDaoBase(dslRW, dslRO),
KoboDtoRepository {
private val b = Tables.BOOK
private val m = Tables.MEDIA
private val d = Tables.BOOK_METADATA

View file

@ -7,6 +7,7 @@ import org.gotson.komga.domain.model.ContentRestrictions
import org.gotson.komga.domain.model.KomgaUser
import org.gotson.komga.domain.model.UserRoles
import org.gotson.komga.domain.persistence.KomgaUserRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.UserApiKeyRecord
import org.gotson.komga.language.toCurrentTimeZone
@ -21,9 +22,10 @@ import java.time.ZoneId
@Component
class KomgaUserDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : KomgaUserRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
KomgaUserRepository {
private val u = Tables.USER
private val ur = Tables.USER_ROLE
private val ul = Tables.USER_LIBRARY_SHARING

View file

@ -2,6 +2,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.Library
import org.gotson.komga.domain.persistence.LibraryRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.LibraryRecord
import org.gotson.komga.language.toCurrentTimeZone
@ -17,9 +18,10 @@ import java.time.ZoneId
@Component
class LibraryDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : LibraryRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
LibraryRepository {
private val l = Tables.LIBRARY
private val ul = Tables.USER_LIBRARY_SHARING
private val le = Tables.LIBRARY_EXCLUSIONS

View file

@ -8,6 +8,7 @@ import org.gotson.komga.domain.model.MediaExtension
import org.gotson.komga.domain.model.MediaFile
import org.gotson.komga.domain.model.ProxyExtension
import org.gotson.komga.domain.persistence.MediaRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.infrastructure.jooq.deserializeMediaExtension
import org.gotson.komga.infrastructure.jooq.serializeJsonGz
@ -27,11 +28,12 @@ import java.time.ZoneId
@Component
class MediaDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
private val mapper: ObjectMapper,
) : MediaRepository {
) : SplitDslDaoBase(dslRW, dslRO),
MediaRepository {
private val m = Tables.MEDIA
private val p = Tables.MEDIA_PAGE
private val f = Tables.MEDIA_FILE

View file

@ -5,6 +5,7 @@ import org.gotson.komga.domain.model.PageHashKnown
import org.gotson.komga.domain.model.PageHashMatch
import org.gotson.komga.domain.model.PageHashUnknown
import org.gotson.komga.domain.persistence.PageHashRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.toOrderBy
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.PageHashRecord
@ -25,9 +26,10 @@ import java.time.ZoneId
@Component
class PageHashDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : PageHashRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
PageHashRepository {
private val p = Tables.MEDIA_PAGE
private val b = Tables.BOOK
private val ph = Tables.PAGE_HASH

View file

@ -4,6 +4,7 @@ import org.gotson.komga.domain.model.ContentRestrictions
import org.gotson.komga.domain.model.ReadList
import org.gotson.komga.domain.persistence.ReadListRepository
import org.gotson.komga.infrastructure.datasource.SqliteUdfDataSource
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.infrastructure.jooq.inOrNoCondition
import org.gotson.komga.infrastructure.jooq.sortByValues
@ -32,11 +33,12 @@ import java.util.SortedMap
@Component
class ReadListDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
private val luceneHelper: LuceneHelper,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : ReadListRepository {
) : SplitDslDaoBase(dslRW, dslRO),
ReadListRepository {
private val rl = Tables.READLIST
private val rlb = Tables.READLIST_BOOK
private val b = Tables.BOOK

View file

@ -5,6 +5,7 @@ import org.gotson.komga.domain.model.ReadListRequestBookMatchBook
import org.gotson.komga.domain.model.ReadListRequestBookMatchSeries
import org.gotson.komga.domain.model.ReadListRequestBookMatches
import org.gotson.komga.domain.persistence.ReadListRequestRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.noCase
import org.gotson.komga.jooq.main.Tables
import org.jooq.DSLContext
@ -18,8 +19,10 @@ import java.time.LocalDate
@Component
class ReadListRequestDao(
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : ReadListRequestRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
ReadListRequestRepository {
private val sd = Tables.SERIES_METADATA
private val b = Tables.BOOK
private val bd = Tables.BOOK_METADATA

View file

@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
import org.gotson.komga.domain.model.R2Locator
import org.gotson.komga.domain.model.ReadProgress
import org.gotson.komga.domain.persistence.ReadProgressRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.infrastructure.jooq.deserializeJsonGz
@ -24,11 +25,12 @@ import java.time.ZoneId
@Component
class ReadProgressDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
private val mapper: ObjectMapper,
) : ReadProgressRepository {
) : SplitDslDaoBase(dslRW, dslRO),
ReadProgressRepository {
private val r = Tables.READ_PROGRESS
private val rs = Tables.READ_PROGRESS_SERIES
private val b = Tables.BOOK

View file

@ -1,5 +1,6 @@
package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.interfaces.api.persistence.ReadProgressDtoRepository
import org.gotson.komga.interfaces.api.rest.dto.TachiyomiReadProgressDto
import org.gotson.komga.interfaces.api.rest.dto.TachiyomiReadProgressV2Dto
@ -16,8 +17,10 @@ import java.math.BigDecimal
@Component
class ReadProgressDtoDao(
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : ReadProgressDtoRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
ReadProgressDtoRepository {
private val rlb = Tables.READLIST_BOOK
private val b = Tables.BOOK
private val d = Tables.BOOK_METADATA

View file

@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.Author
import org.gotson.komga.domain.persistence.ReferentialRepository
import org.gotson.komga.infrastructure.datasource.SqliteUdfDataSource
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.udfStripAccents
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.BookMetadataAggregationAuthorRecord
@ -22,8 +23,10 @@ import java.time.LocalDate
@Component
class ReferentialDao(
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : ReferentialRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
ReferentialRepository {
private val a = Tables.BOOK_METADATA_AUTHOR
private val sd = Tables.SERIES_METADATA
private val bma = Tables.BOOK_METADATA_AGGREGATION

View file

@ -4,6 +4,7 @@ import org.gotson.komga.domain.model.ContentRestrictions
import org.gotson.komga.domain.model.SeriesCollection
import org.gotson.komga.domain.persistence.SeriesCollectionRepository
import org.gotson.komga.infrastructure.datasource.SqliteUdfDataSource
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.infrastructure.jooq.inOrNoCondition
import org.gotson.komga.infrastructure.jooq.sortByValues
@ -31,11 +32,12 @@ import java.time.ZoneId
@Component
class SeriesCollectionDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
private val luceneHelper: LuceneHelper,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : SeriesCollectionRepository {
) : SplitDslDaoBase(dslRW, dslRO),
SeriesCollectionRepository {
private val c = Tables.COLLECTION
private val cs = Tables.COLLECTION_SERIES
private val s = Tables.SERIES

View file

@ -6,6 +6,7 @@ import org.gotson.komga.domain.model.Series
import org.gotson.komga.domain.persistence.SeriesRepository
import org.gotson.komga.infrastructure.jooq.RequiredJoin
import org.gotson.komga.infrastructure.jooq.SeriesSearchHelper
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.infrastructure.jooq.csAlias
import org.gotson.komga.jooq.main.Tables
@ -28,10 +29,11 @@ import java.time.ZoneId
@Component
class SeriesDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : SeriesRepository {
) : SplitDslDaoBase(dslRW, dslRO),
SeriesRepository {
private val s = Tables.SERIES
private val d = Tables.SERIES_METADATA
private val rs = Tables.READ_PROGRESS_SERIES

View file

@ -6,6 +6,7 @@ import org.gotson.komga.domain.model.SeriesSearch
import org.gotson.komga.infrastructure.datasource.SqliteUdfDataSource
import org.gotson.komga.infrastructure.jooq.RequiredJoin
import org.gotson.komga.infrastructure.jooq.SeriesSearchHelper
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.infrastructure.jooq.csAlias
import org.gotson.komga.infrastructure.jooq.inOrNoCondition
@ -52,10 +53,12 @@ const val BOOKS_READ_COUNT = "booksReadCount"
@Component
class SeriesDtoDao(
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
private val luceneHelper: LuceneHelper,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : SeriesDtoRepository {
) : SplitDslDaoBase(dslRW, dslRO),
SeriesDtoRepository {
private val s = Tables.SERIES
private val d = Tables.SERIES_METADATA
private val rs = Tables.READ_PROGRESS_SERIES

View file

@ -4,6 +4,7 @@ import org.gotson.komga.domain.model.AlternateTitle
import org.gotson.komga.domain.model.SeriesMetadata
import org.gotson.komga.domain.model.WebLink
import org.gotson.komga.domain.persistence.SeriesMetadataRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.SeriesMetadataRecord
@ -19,10 +20,11 @@ import java.time.ZoneId
@Component
class SeriesMetadataDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : SeriesMetadataRepository {
) : SplitDslDaoBase(dslRW, dslRO),
SeriesMetadataRepository {
private val d = Tables.SERIES_METADATA
private val g = Tables.SERIES_METADATA_GENRE
private val st = Tables.SERIES_METADATA_TAG

View file

@ -1,5 +1,6 @@
package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.jooq.main.Tables
import org.jooq.DSLContext
import org.springframework.beans.factory.annotation.Qualifier
@ -7,9 +8,9 @@ import org.springframework.stereotype.Component
@Component
class ServerSettingsDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO) {
private val s = Tables.SERVER_SETTINGS
fun <T> getSettingByKey(

View file

@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.Sidecar
import org.gotson.komga.domain.model.SidecarStored
import org.gotson.komga.domain.persistence.SidecarRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.SidecarRecord
@ -16,10 +17,11 @@ import java.net.URL
@Component
class SidecarDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : SidecarRepository {
) : SplitDslDaoBase(dslRW, dslRO),
SidecarRepository {
private val sc = Tables.SIDECAR
override fun findAll(): Collection<SidecarStored> = dslRO.selectFrom(sc).fetch().map { it.toDomain() }

View file

@ -8,6 +8,7 @@ import org.gotson.komga.domain.model.SyncPoint.ReadList.Companion.ON_DECK_ID
import org.gotson.komga.domain.persistence.SyncPointRepository
import org.gotson.komga.infrastructure.jooq.BookSearchHelper
import org.gotson.komga.infrastructure.jooq.RequiredJoin
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.language.toZonedDateTime
import org.jooq.DSLContext
@ -28,10 +29,11 @@ import java.time.ZoneId
@Component
class SyncPointDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
private val bookCommonDao: BookCommonDao,
) : SyncPointRepository {
) : SplitDslDaoBase(dslRW, dslRO),
SyncPointRepository {
private val b = Tables.BOOK
private val m = Tables.MEDIA
private val d = Tables.BOOK_METADATA
@ -128,7 +130,7 @@ class SyncPointDao(
.where(condition),
).execute()
return dslRW.findByIdOrNull(syncPointId)!!
return findByIdOrNull(syncPointId)!!
}
@Transactional
@ -172,10 +174,9 @@ class SyncPointDao(
}
}
override fun findByIdOrNull(syncPointId: String): SyncPoint? = dslRO.findByIdOrNull(syncPointId)
private fun DSLContext.findByIdOrNull(syncPointId: String): SyncPoint? =
selectFrom(sp)
override fun findByIdOrNull(syncPointId: String): SyncPoint? =
dslRO
.selectFrom(sp)
.where(sp.ID.eq(syncPointId))
.fetchInto(sp)
.map {

View file

@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.Dimension
import org.gotson.komga.domain.model.ThumbnailBook
import org.gotson.komga.domain.persistence.ThumbnailBookRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.ThumbnailBookRecord
@ -15,10 +16,11 @@ import java.net.URL
@Component
class ThumbnailBookDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : ThumbnailBookRepository {
) : SplitDslDaoBase(dslRW, dslRO),
ThumbnailBookRepository {
private val tb = Tables.THUMBNAIL_BOOK
override fun findAllByBookId(bookId: String): Collection<ThumbnailBook> =

View file

@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.Dimension
import org.gotson.komga.domain.model.ThumbnailReadList
import org.gotson.komga.domain.persistence.ThumbnailReadListRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.ThumbnailReadlistRecord
import org.jooq.DSLContext
@ -12,9 +13,10 @@ import org.springframework.transaction.annotation.Transactional
@Component
class ThumbnailReadListDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : ThumbnailReadListRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
ThumbnailReadListRepository {
private val tr = Tables.THUMBNAIL_READLIST
override fun findAllByReadListId(readListId: String): Collection<ThumbnailReadList> =

View file

@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.Dimension
import org.gotson.komga.domain.model.ThumbnailSeriesCollection
import org.gotson.komga.domain.persistence.ThumbnailSeriesCollectionRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.ThumbnailCollectionRecord
import org.jooq.DSLContext
@ -12,9 +13,10 @@ import org.springframework.transaction.annotation.Transactional
@Component
class ThumbnailSeriesCollectionDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
) : ThumbnailSeriesCollectionRepository {
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
) : SplitDslDaoBase(dslRW, dslRO),
ThumbnailSeriesCollectionRepository {
private val tc = Tables.THUMBNAIL_COLLECTION
override fun findByIdOrNull(thumbnailId: String): ThumbnailSeriesCollection? =

View file

@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq.main
import org.gotson.komga.domain.model.Dimension
import org.gotson.komga.domain.model.ThumbnailSeries
import org.gotson.komga.domain.persistence.ThumbnailSeriesRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.infrastructure.jooq.TempTable.Companion.withTempTable
import org.gotson.komga.jooq.main.Tables
import org.gotson.komga.jooq.main.tables.records.ThumbnailSeriesRecord
@ -15,10 +16,11 @@ import java.net.URL
@Component
class ThumbnailSeriesDao(
private val dslRW: DSLContext,
@Qualifier("dslContextRO") private val dslRO: DSLContext,
dslRW: DSLContext,
@Qualifier("dslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.database.batchChunkSize}") private val batchSize: Int,
) : ThumbnailSeriesRepository {
) : SplitDslDaoBase(dslRW, dslRO),
ThumbnailSeriesRepository {
private val ts = Tables.THUMBNAIL_SERIES
override fun findByIdOrNull(thumbnailId: String): ThumbnailSeries? =

View file

@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper
import io.github.oshai.kotlinlogging.KotlinLogging
import org.gotson.komga.application.tasks.Task
import org.gotson.komga.application.tasks.TasksRepository
import org.gotson.komga.infrastructure.jooq.SplitDslDaoBase
import org.gotson.komga.jooq.tasks.Tables
import org.jooq.DSLContext
import org.jooq.Query
@ -22,11 +23,12 @@ private val logger = KotlinLogging.logger {}
@Component
@DependsOn("flywaySecondaryMigrationInitializer")
class TasksDao(
@Qualifier("tasksDslContextRW") private val dslRW: DSLContext,
@Qualifier("tasksDslContextRO") private val dslRO: DSLContext,
@Qualifier("tasksDslContextRW") dslRW: DSLContext,
@Qualifier("tasksDslContextRO") dslRO: DSLContext,
@param:Value("#{@komgaProperties.tasksDb.batchChunkSize}") private val batchSize: Int,
private val objectMapper: ObjectMapper,
) : TasksRepository {
) : SplitDslDaoBase(dslRW, dslRO),
TasksRepository {
private val t = Tables.TASK
private val tasksAvailableCondition =