mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-10-03 14:19:24 +00:00
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
d69fee1732 | |||
178518db5e | |||
6fb20fb973 | |||
831bf44e34 | |||
a4c6c367e3 | |||
bc98e59709 | |||
ef287bc331 |
10
CHANGELOG.md
10
CHANGELOG.md
@@ -1,5 +1,15 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.25.2
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Exposed`: `0.59.0` -> `0.60.0`
|
||||||
|
* `Repo`:
|
||||||
|
* `Cache`:
|
||||||
|
* Add extensions `alsoInvalidate`, `alsoInvalidateAsync`, `alsoInvalidateSync` and `alsoInvalidateSyncLogging`
|
||||||
|
* `Koin`:
|
||||||
|
* Add extensions `singleSuspend` and `factorySuspend` for defining of dependencies with suspendable blocks
|
||||||
|
|
||||||
## 0.25.1
|
## 0.25.1
|
||||||
|
|
||||||
* `Coroutines`:
|
* `Coroutines`:
|
||||||
|
@@ -71,7 +71,7 @@ fun <T, M> Flow<T>.subscribeAsync(
|
|||||||
it.invoke(markersMap)
|
it.invoke(markersMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
val job = subscribeSafelyWithoutExceptions(subscope) { data ->
|
val job = subscribeLoggingDropExceptions(subscope) { data ->
|
||||||
val dataCommand = AsyncSubscriptionCommandData(data, subscope, markerFactory, block) { marker ->
|
val dataCommand = AsyncSubscriptionCommandData(data, subscope, markerFactory, block) { marker ->
|
||||||
actor.send(
|
actor.send(
|
||||||
AsyncSubscriptionCommandClearReceiver(marker)
|
AsyncSubscriptionCommandClearReceiver(marker)
|
||||||
|
@@ -7,7 +7,9 @@ fun <T> CoroutineScope.launchSynchronously(block: suspend CoroutineScope.() -> T
|
|||||||
val objectToSynchronize = Object()
|
val objectToSynchronize = Object()
|
||||||
synchronized(objectToSynchronize) {
|
synchronized(objectToSynchronize) {
|
||||||
launch(start = CoroutineStart.UNDISPATCHED) {
|
launch(start = CoroutineStart.UNDISPATCHED) {
|
||||||
result = safelyWithResult(block)
|
result = runCatching {
|
||||||
|
block()
|
||||||
|
}
|
||||||
}.invokeOnCompletion {
|
}.invokeOnCompletion {
|
||||||
synchronized(objectToSynchronize) {
|
synchronized(objectToSynchronize) {
|
||||||
objectToSynchronize.notifyAll()
|
objectToSynchronize.notifyAll()
|
||||||
|
@@ -15,5 +15,5 @@ crypto_js_version=4.1.1
|
|||||||
# Project data
|
# Project data
|
||||||
|
|
||||||
group=dev.inmo
|
group=dev.inmo
|
||||||
version=0.25.1
|
version=0.25.2
|
||||||
android_code_version=291
|
android_code_version=292
|
||||||
|
@@ -7,7 +7,7 @@ kt-coroutines = "1.10.1"
|
|||||||
kslog = "1.4.1"
|
kslog = "1.4.1"
|
||||||
|
|
||||||
jb-compose = "1.7.3"
|
jb-compose = "1.7.3"
|
||||||
jb-exposed = "0.59.0"
|
jb-exposed = "0.60.0"
|
||||||
jb-dokka = "2.0.0"
|
jb-dokka = "2.0.0"
|
||||||
|
|
||||||
sqlite = "3.49.1.0"
|
sqlite = "3.49.1.0"
|
||||||
|
@@ -17,11 +17,13 @@ kotlin {
|
|||||||
jvmMain {
|
jvmMain {
|
||||||
dependencies {
|
dependencies {
|
||||||
api libs.kt.reflect
|
api libs.kt.reflect
|
||||||
|
api project(":micro_utils.coroutines")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
androidMain {
|
androidMain {
|
||||||
dependencies {
|
dependencies {
|
||||||
api libs.kt.reflect
|
api libs.kt.reflect
|
||||||
|
api project(":micro_utils.coroutines")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
koin/src/jvmMain/kotlin/FactorySuspend.kt
Normal file
32
koin/src/jvmMain/kotlin/FactorySuspend.kt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package dev.inmo.micro_utils.koin
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.coroutines.doSynchronously
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import org.koin.core.module.Module
|
||||||
|
import org.koin.core.parameter.ParametersHolder
|
||||||
|
import org.koin.core.qualifier.Qualifier
|
||||||
|
import org.koin.core.qualifier.StringQualifier
|
||||||
|
import org.koin.core.scope.Scope
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
inline fun <reified T : Any> Module.factorySuspend(
|
||||||
|
qualifier: Qualifier? = null,
|
||||||
|
coroutineScope: CoroutineScope? = null,
|
||||||
|
noinline definition: suspend Scope.(ParametersHolder) -> T
|
||||||
|
) = factory(
|
||||||
|
qualifier,
|
||||||
|
if (coroutineScope == null) {
|
||||||
|
{
|
||||||
|
doSynchronously {
|
||||||
|
definition(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
coroutineScope.doSynchronously {
|
||||||
|
definition(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
32
koin/src/jvmMain/kotlin/SingleSuspend.kt
Normal file
32
koin/src/jvmMain/kotlin/SingleSuspend.kt
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package dev.inmo.micro_utils.koin
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.coroutines.doSynchronously
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import org.koin.core.module.Module
|
||||||
|
import org.koin.core.parameter.ParametersHolder
|
||||||
|
import org.koin.core.qualifier.StringQualifier
|
||||||
|
import org.koin.core.scope.Scope
|
||||||
|
|
||||||
|
inline fun <reified T : Any> Module.singleSuspend(
|
||||||
|
qualifier: StringQualifier,
|
||||||
|
createdAtStart: Boolean = false,
|
||||||
|
coroutineScope: CoroutineScope? = null,
|
||||||
|
noinline definition: suspend Scope.(ParametersHolder) -> T
|
||||||
|
) = single(
|
||||||
|
qualifier,
|
||||||
|
createdAtStart,
|
||||||
|
if (coroutineScope == null) {
|
||||||
|
{
|
||||||
|
doSynchronously {
|
||||||
|
definition(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
coroutineScope.doSynchronously {
|
||||||
|
definition(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
@@ -0,0 +1,14 @@
|
|||||||
|
package dev.inmo.micro_utils.repos.annotations
|
||||||
|
|
||||||
|
|
||||||
|
@RequiresOptIn(
|
||||||
|
"Overriding of this invalidate message requires manual launching of invalidation on class initialization process",
|
||||||
|
RequiresOptIn.Level.WARNING
|
||||||
|
)
|
||||||
|
@Target(
|
||||||
|
AnnotationTarget.CONSTRUCTOR,
|
||||||
|
AnnotationTarget.FIELD,
|
||||||
|
AnnotationTarget.PROPERTY,
|
||||||
|
AnnotationTarget.FUNCTION,
|
||||||
|
)
|
||||||
|
annotation class OverrideRequireManualInvalidation
|
@@ -4,6 +4,7 @@ import dev.inmo.micro_utils.coroutines.SmartRWLocker
|
|||||||
import dev.inmo.micro_utils.coroutines.withReadAcquire
|
import dev.inmo.micro_utils.coroutines.withReadAcquire
|
||||||
import dev.inmo.micro_utils.coroutines.withWriteLock
|
import dev.inmo.micro_utils.coroutines.withWriteLock
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
||||||
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
@@ -39,6 +40,7 @@ open class ReadCRUDCacheRepo<ObjectType, IdType>(
|
|||||||
kvCache.contains(id)
|
kvCache.contains(id)
|
||||||
} || parentRepo.contains(id)
|
} || parentRepo.contains(id)
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() = locker.withWriteLock {
|
override suspend fun invalidate() = locker.withWriteLock {
|
||||||
kvCache.clear()
|
kvCache.clear()
|
||||||
}
|
}
|
||||||
@@ -117,6 +119,7 @@ open class WriteCRUDCacheRepo<ObjectType, IdType, InputValueType>(
|
|||||||
return created
|
return created
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() = locker.withWriteLock {
|
override suspend fun invalidate() = locker.withWriteLock {
|
||||||
kvCache.clear()
|
kvCache.clear()
|
||||||
}
|
}
|
||||||
@@ -150,6 +153,7 @@ WriteCRUDRepo<ObjectType, IdType, InputValueType> by WriteCRUDCacheRepo(
|
|||||||
idGetter
|
idGetter
|
||||||
),
|
),
|
||||||
CRUDRepo<ObjectType, IdType, InputValueType> {
|
CRUDRepo<ObjectType, IdType, InputValueType> {
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker)
|
override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
package dev.inmo.micro_utils.repos.cache
|
package dev.inmo.micro_utils.repos.cache
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
||||||
interface InvalidatableRepo {
|
interface InvalidatableRepo {
|
||||||
/**
|
/**
|
||||||
* Invalidates its internal data. It __may__ lead to autoreload of data. In case when repo makes autoreload,
|
* Invalidates its internal data. It __may__ lead to autoreload of data. In case when repo makes autoreload,
|
||||||
@@ -8,4 +11,14 @@ interface InvalidatableRepo {
|
|||||||
suspend fun invalidate()
|
suspend fun invalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun <T : InvalidatableRepo> T.alsoInvalidate() = also {
|
||||||
|
invalidate()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : InvalidatableRepo> T.alsoInvalidateAsync(scope: CoroutineScope) = also {
|
||||||
|
scope.launchLoggingDropExceptions {
|
||||||
|
invalidate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typealias CacheRepo = InvalidatableRepo
|
typealias CacheRepo = InvalidatableRepo
|
||||||
|
@@ -5,6 +5,7 @@ import dev.inmo.micro_utils.coroutines.withReadAcquire
|
|||||||
import dev.inmo.micro_utils.coroutines.withWriteLock
|
import dev.inmo.micro_utils.coroutines.withWriteLock
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -49,6 +50,7 @@ open class ReadKeyValueCacheRepo<Key,Value>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker)
|
override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,6 +6,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock
|
|||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.*
|
import dev.inmo.micro_utils.pagination.utils.*
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -48,6 +49,7 @@ open class ReadKeyValuesCacheRepo<Key,Value>(
|
|||||||
kvCache.contains(k)
|
kvCache.contains(k)
|
||||||
} || parentRepo.contains(k)
|
} || parentRepo.contains(k)
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker)
|
override suspend fun invalidate() = kvCache.actualizeAll(parentRepo, locker = locker)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,6 +6,7 @@ import dev.inmo.micro_utils.pagination.PaginationResult
|
|||||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.MapKeyValueRepo
|
import dev.inmo.micro_utils.repos.MapKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper
|
import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
||||||
@@ -90,6 +91,7 @@ open class AutoRecacheReadCRUDRepo<RegisteredObject, Id>(
|
|||||||
kvCache.set(idGetter(it), it)
|
kvCache.set(idGetter(it), it)
|
||||||
} ?: kvCache.get(id)
|
} ?: kvCache.get(id)
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ package dev.inmo.micro_utils.repos.cache.fallback.crud
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
@@ -53,6 +54,7 @@ open class AutoRecacheWriteCRUDRepo<RegisteredObject, Id, InputObject>(
|
|||||||
kvCache.set(idGetter(it), it)
|
kvCache.set(idGetter(it), it)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
kvCache.clear()
|
kvCache.clear()
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ import dev.inmo.micro_utils.pagination.PaginationResult
|
|||||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.MapKeyValueRepo
|
import dev.inmo.micro_utils.repos.MapKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper
|
import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
||||||
@@ -100,6 +101,7 @@ open class AutoRecacheReadKeyValueRepo<Id, RegisteredObject>(
|
|||||||
originalRepo.keys(v, pagination, reversed)
|
originalRepo.keys(v, pagination, reversed)
|
||||||
}.getOrElse { kvCache.keys(v, pagination, reversed) }
|
}.getOrElse { kvCache.keys(v, pagination, reversed) }
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ package dev.inmo.micro_utils.repos.cache.fallback.keyvalue
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
@@ -44,6 +45,7 @@ open class AutoRecacheWriteKeyValueRepo<Id, RegisteredObject>(
|
|||||||
kvCache.set(toSet)
|
kvCache.set(toSet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
kvCache.clear()
|
kvCache.clear()
|
||||||
}
|
}
|
||||||
|
@@ -13,6 +13,7 @@ import dev.inmo.micro_utils.pagination.utils.paginate
|
|||||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.MapKeyValueRepo
|
import dev.inmo.micro_utils.repos.MapKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper
|
import dev.inmo.micro_utils.repos.cache.fallback.ActionWrapper
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
||||||
@@ -140,6 +141,7 @@ open class AutoRecacheReadKeyValuesRepo<Id, RegisteredObject>(
|
|||||||
}) ?: (kvCache.get(k) ?.contains(v) == true)
|
}) ?: (kvCache.get(k) ?.contains(v) == true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ package dev.inmo.micro_utils.repos.cache.fallback.keyvalues
|
|||||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||||
import dev.inmo.micro_utils.pagination.utils.doForAllWithNextPaging
|
import dev.inmo.micro_utils.pagination.utils.doForAllWithNextPaging
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
import dev.inmo.micro_utils.repos.cache.FallbackCacheRepo
|
||||||
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
|
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -89,6 +90,7 @@ open class AutoRecacheWriteKeyValuesRepo<Id, RegisteredObject>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
kvCache.clear()
|
kvCache.clear()
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock
|
|||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.*
|
import dev.inmo.micro_utils.repos.cache.*
|
||||||
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
@@ -133,6 +134,7 @@ open class FullCRUDCacheRepo<ObjectType, IdType, InputValueType>(
|
|||||||
locker.unlockWrite()
|
locker.unlockWrite()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock
|
|||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -86,6 +87,7 @@ open class FullReadKeyValueCacheRepo<Key,Value>(
|
|||||||
{ if (it.results.isNotEmpty()) actualizeAll() }
|
{ if (it.results.isNotEmpty()) actualizeAll() }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
@@ -160,6 +162,7 @@ open class FullKeyValueCacheRepo<Key,Value>(
|
|||||||
locker.unlockWrite()
|
locker.unlockWrite()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
kvCache.actualizeAll(parentRepo, locker)
|
kvCache.actualizeAll(parentRepo, locker)
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock
|
|||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.*
|
import dev.inmo.micro_utils.pagination.utils.*
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
|
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
|
||||||
@@ -153,6 +154,7 @@ open class FullReadKeyValuesCacheRepo<Key,Value>(
|
|||||||
{ if (it.results.isNotEmpty()) actualizeAll() }
|
{ if (it.results.isNotEmpty()) actualizeAll() }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
@@ -235,6 +237,7 @@ open class FullKeyValuesCacheRepo<Key,Value>(
|
|||||||
locker.unlockWrite()
|
locker.unlockWrite()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
kvCache.actualizeAll(parentRepo, locker = locker)
|
kvCache.actualizeAll(parentRepo, locker = locker)
|
||||||
}
|
}
|
||||||
|
@@ -1,11 +1,13 @@
|
|||||||
package dev.inmo.micro_utils.repos.cache.full.direct
|
package dev.inmo.micro_utils.repos.cache.full.direct
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.Warning
|
||||||
import dev.inmo.micro_utils.coroutines.SmartRWLocker
|
import dev.inmo.micro_utils.coroutines.SmartRWLocker
|
||||||
import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions
|
import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions
|
||||||
import dev.inmo.micro_utils.coroutines.withReadAcquire
|
import dev.inmo.micro_utils.coroutines.withReadAcquire
|
||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.*
|
import dev.inmo.micro_utils.repos.cache.*
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -96,6 +98,8 @@ open class DirectFullCRUDCacheRepo<ObjectType, IdType, InputValueType>(
|
|||||||
locker.unlockWrite()
|
locker.unlockWrite()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock
|
|||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.full.FullKeyValueCacheRepo
|
import dev.inmo.micro_utils.repos.cache.full.FullKeyValueCacheRepo
|
||||||
import dev.inmo.micro_utils.repos.cache.full.FullReadKeyValueCacheRepo
|
import dev.inmo.micro_utils.repos.cache.full.FullReadKeyValueCacheRepo
|
||||||
import dev.inmo.micro_utils.repos.cache.full.FullWriteKeyValueCacheRepo
|
import dev.inmo.micro_utils.repos.cache.full.FullWriteKeyValueCacheRepo
|
||||||
@@ -54,6 +55,7 @@ open class DirectFullReadKeyValueCacheRepo<Key, Value>(
|
|||||||
kvCache.keys(v, pagination, reversed)
|
kvCache.keys(v, pagination, reversed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
@@ -86,6 +88,7 @@ open class DirectFullWriteKeyValueCacheRepo<Key, Value>(
|
|||||||
}
|
}
|
||||||
}.launchIn(scope)
|
}.launchIn(scope)
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
locker.withWriteLock {
|
locker.withWriteLock {
|
||||||
kvCache.clear()
|
kvCache.clear()
|
||||||
@@ -135,6 +138,7 @@ open class DirectFullKeyValueCacheRepo<Key, Value>(
|
|||||||
locker.unlockWrite()
|
locker.unlockWrite()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
kvCache.actualizeAll(parentRepo, locker)
|
kvCache.actualizeAll(parentRepo, locker)
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,7 @@ import dev.inmo.micro_utils.coroutines.withWriteLock
|
|||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.*
|
import dev.inmo.micro_utils.pagination.utils.*
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import dev.inmo.micro_utils.repos.annotations.OverrideRequireManualInvalidation
|
||||||
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
import dev.inmo.micro_utils.repos.cache.util.ActualizeAllClearMode
|
||||||
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -88,6 +89,7 @@ open class DirectFullReadKeyValuesCacheRepo<Key,Value>(
|
|||||||
return result ?: emptyPaginationResult()
|
return result ?: emptyPaginationResult()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
@@ -121,6 +123,7 @@ open class DirectFullWriteKeyValuesCacheRepo<Key,Value>(
|
|||||||
}
|
}
|
||||||
}.launchIn(scope)
|
}.launchIn(scope)
|
||||||
|
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
locker.withWriteLock {
|
locker.withWriteLock {
|
||||||
kvCache.clear()
|
kvCache.clear()
|
||||||
@@ -170,6 +173,7 @@ open class DirectFullKeyValuesCacheRepo<Key,Value>(
|
|||||||
locker.unlockWrite()
|
locker.unlockWrite()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@OverrideRequireManualInvalidation
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
kvCache.actualizeAll(parentRepo, locker = locker)
|
kvCache.actualizeAll(parentRepo, locker = locker)
|
||||||
}
|
}
|
||||||
|
54
repos/cache/src/jvmMain/kotlin/InvalidateSynchronously.kt
vendored
Normal file
54
repos/cache/src/jvmMain/kotlin/InvalidateSynchronously.kt
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package dev.inmo.micro_utils.repos.cache
|
||||||
|
|
||||||
|
import dev.inmo.kslog.common.KSLog
|
||||||
|
import dev.inmo.micro_utils.coroutines.doSynchronously
|
||||||
|
import dev.inmo.micro_utils.coroutines.runCatchingLogging
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
||||||
|
fun <T : InvalidatableRepo> T.alsoInvalidateSync(
|
||||||
|
scope: CoroutineScope,
|
||||||
|
onFailure: suspend (Throwable) -> Unit = {},
|
||||||
|
) = also {
|
||||||
|
scope.doSynchronously {
|
||||||
|
runCatching {
|
||||||
|
invalidate()
|
||||||
|
}.onFailure {
|
||||||
|
onFailure(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : InvalidatableRepo> T.alsoInvalidateSync(
|
||||||
|
onFailure: suspend (Throwable) -> Unit = {},
|
||||||
|
) = also {
|
||||||
|
doSynchronously {
|
||||||
|
runCatching {
|
||||||
|
invalidate()
|
||||||
|
}.onFailure {
|
||||||
|
onFailure(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : InvalidatableRepo> T.alsoInvalidateSyncLogging(
|
||||||
|
scope: CoroutineScope,
|
||||||
|
errorMessageBuilder: CoroutineScope.(Throwable) -> Any = { "Something web wrong" },
|
||||||
|
logger: KSLog = KSLog,
|
||||||
|
) = also {
|
||||||
|
scope.doSynchronously {
|
||||||
|
runCatchingLogging(errorMessageBuilder, logger) {
|
||||||
|
invalidate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : InvalidatableRepo> T.alsoInvalidateSyncLogging(
|
||||||
|
errorMessageBuilder: CoroutineScope.(Throwable) -> Any = { "Something web wrong" },
|
||||||
|
logger: KSLog = KSLog,
|
||||||
|
) = also {
|
||||||
|
doSynchronously {
|
||||||
|
runCatchingLogging(errorMessageBuilder, logger) {
|
||||||
|
invalidate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -73,7 +73,7 @@ class KtorCRUDRepoTests : CommonCRUDRepoTests() {
|
|||||||
}
|
}
|
||||||
val server = io.ktor.server.engine.embeddedServer(
|
val server = io.ktor.server.engine.embeddedServer(
|
||||||
CIO,
|
CIO,
|
||||||
34567,
|
34568,
|
||||||
"127.0.0.1"
|
"127.0.0.1"
|
||||||
) {
|
) {
|
||||||
install(ContentNegotiation) {
|
install(ContentNegotiation) {
|
||||||
@@ -100,7 +100,7 @@ class KtorCRUDRepoTests : CommonCRUDRepoTests() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val crudClient = KtorCRUDRepoClient<ComplexData, Int, SimpleData>(
|
val crudClient = KtorCRUDRepoClient<ComplexData, Int, SimpleData>(
|
||||||
"http://127.0.0.1:34567",
|
"http://127.0.0.1:34568",
|
||||||
client,
|
client,
|
||||||
ContentType.Application.Json
|
ContentType.Application.Json
|
||||||
) {
|
) {
|
||||||
|
@@ -63,7 +63,7 @@ class KtorKeyValueRepoTests : CommonKeyValueRepoTests() {
|
|||||||
val repo = MapKeyValueRepo<Int, ComplexData>(map)
|
val repo = MapKeyValueRepo<Int, ComplexData>(map)
|
||||||
val server = io.ktor.server.engine.embeddedServer(
|
val server = io.ktor.server.engine.embeddedServer(
|
||||||
CIO,
|
CIO,
|
||||||
34567,
|
34569,
|
||||||
"127.0.0.1"
|
"127.0.0.1"
|
||||||
) {
|
) {
|
||||||
install(ContentNegotiation) {
|
install(ContentNegotiation) {
|
||||||
@@ -91,7 +91,7 @@ class KtorKeyValueRepoTests : CommonKeyValueRepoTests() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val crudClient = KtorKeyValueRepoClient<Int, ComplexData>(
|
val crudClient = KtorKeyValueRepoClient<Int, ComplexData>(
|
||||||
"http://127.0.0.1:34567",
|
"http://127.0.0.1:34569",
|
||||||
client,
|
client,
|
||||||
ContentType.Application.Json,
|
ContentType.Application.Json,
|
||||||
Int.serializer(),
|
Int.serializer(),
|
||||||
|
Reference in New Issue
Block a user