mirror of
				https://github.com/InsanusMokrassar/MicroUtils.git
				synced 2025-10-31 12:10:29 +00:00 
			
		
		
		
	Compare commits
	
		
			19 Commits
		
	
	
		
			0.26.1
			...
			renovate/s
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 08752c70d8 | ||
| 9dad353957 | |||
| 89e16b7bdb | |||
| c2965da341 | |||
| ffb072dc5f | |||
| a247dbcb02 | |||
| 1dd71175f4 | |||
| bbe62c0e7b | |||
| 9822ff321b | |||
| b485d485ef | |||
| 0b3d445109 | |||
| d7e48940bc | |||
| 1049eb0fe7 | |||
| c871ef5635 | |||
| 7edfcb20c4 | |||
| 7a1438a2c0 | |||
| 2af8cba8cd | |||
| 27d74c0a62 | |||
| f86d1bfe06 | 
							
								
								
									
										37
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,5 +1,42 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## 0.26.6 | ||||
|  | ||||
| * `Versions`: | ||||
|     * `Ktor`: `3.3.0` -> `3.3.1` | ||||
|     * `Okio`: `3.16.0` -> `3.16.2` | ||||
|  | ||||
| ## 0.26.5 | ||||
|  | ||||
| * `Versions`: | ||||
|     * `Kotlin`: `2.2.10` -> `2.2.20` | ||||
|     * `KSLog`: `1.5.0` -> `1.5.1` | ||||
|     * `Ktor`: `3.2.3` -> `3.3.0` | ||||
|     * `KotlinX Browser`: `0.3` -> `0.5.0` | ||||
|     * `Koin`: `4.1.0` -> `4.1.1` | ||||
|  | ||||
| ## 0.26.4 | ||||
|  | ||||
| * `Common`: | ||||
|   * Add expect/actual `MPPFilePathSeparator` | ||||
|   * Fix `FileName` realization to take care about system file path separator | ||||
|  | ||||
| ## 0.26.3 | ||||
|  | ||||
| * `Versions`: | ||||
|   * `Kotlin`: `2.2.0` -> `2.2.10` | ||||
|   * `KSP`: `2.2.0-2.0.2` -> `2.2.10-2.0.2` | ||||
|   * `Android CoreKTX`: `1.16.0` -> `1.17.0` | ||||
|   * `Android Fragment`: `1.8.8` -> `1.8.9` | ||||
|  | ||||
| ## 0.26.2 | ||||
|  | ||||
| * `Versions`: | ||||
|   * `Ktor`: `3.2.2` -> `3.2.3` | ||||
|   * `Okio`: `3.15.0` -> `3.16.0` | ||||
| * `Coroutines`: | ||||
|   * Rename `SpecialMutableStateFlow` to `MutableRedeliverStateFlow` | ||||
|  | ||||
| ## 0.26.1 | ||||
|  | ||||
| * `Versions`: | ||||
|   | ||||
| @@ -2,11 +2,9 @@ import androidx.compose.runtime.remember | ||||
| import androidx.compose.ui.test.ExperimentalTestApi | ||||
| import androidx.compose.ui.test.runComposeUiTest | ||||
| import dev.inmo.micro_utils.common.compose.LoadableComponent | ||||
| import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow | ||||
| import kotlinx.coroutines.flow.MutableSharedFlow | ||||
| import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow | ||||
| import kotlinx.coroutines.flow.filter | ||||
| import kotlinx.coroutines.flow.first | ||||
| import kotlinx.coroutines.flow.firstOrNull | ||||
| import org.jetbrains.annotations.TestOnly | ||||
| import kotlin.test.Test | ||||
| import kotlin.test.assertTrue | ||||
| @@ -16,8 +14,8 @@ class LoadableComponentTests { | ||||
|     @Test | ||||
|     @TestOnly | ||||
|     fun testSimpleLoad() = runComposeUiTest { | ||||
|         val loadingFlow = SpecialMutableStateFlow<Int>(0) | ||||
|         val loadedFlow = SpecialMutableStateFlow<Int>(0) | ||||
|         val loadingFlow = MutableRedeliverStateFlow<Int>(0) | ||||
|         val loadedFlow = MutableRedeliverStateFlow<Int>(0) | ||||
|         setContent { | ||||
|             LoadableComponent<Int>({ | ||||
|                 loadingFlow.filter { it == 1 }.first() | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import kotlin.jvm.JvmInline | ||||
| @JvmInline | ||||
| value class FileName(val string: String) { | ||||
|     val name: String | ||||
|         get() = withoutSlashAtTheEnd.takeLastWhile { it != '/' } | ||||
|         get() = withoutSlashAtTheEnd.takeLastWhile { it != MPPFilePathSeparator } | ||||
|     val extension: String | ||||
|         get() = name.takeLastWhile { it != '.' } | ||||
|     val nameWithoutExtension: String | ||||
| @@ -18,7 +18,7 @@ value class FileName(val string: String) { | ||||
|             } ?: filename | ||||
|         } | ||||
|     val withoutSlashAtTheEnd: String | ||||
|         get() = string.dropLastWhile { it == '/' } | ||||
|         get() = string.dropLastWhile { it == MPPFilePathSeparator } | ||||
|     override fun toString(): String = string | ||||
| } | ||||
|  | ||||
| @@ -26,6 +26,7 @@ value class FileName(val string: String) { | ||||
| expect class MPPFile | ||||
|  | ||||
| expect val MPPFile.filename: FileName | ||||
| expect val MPPFilePathSeparator: Char | ||||
| expect val MPPFile.filesize: Long | ||||
| expect val MPPFile.bytesAllocatorSync: ByteArrayAllocator | ||||
| expect val MPPFile.bytesAllocator: SuspendByteArrayAllocator | ||||
|   | ||||
| @@ -35,6 +35,10 @@ private suspend fun MPPFile.dirtyReadBytes(): ByteArray = readBytesPromise().awa | ||||
|  */ | ||||
| actual val MPPFile.filename: FileName | ||||
|     get() = FileName(name) | ||||
|  | ||||
| actual val MPPFilePathSeparator: Char | ||||
|     get() = '/' | ||||
|  | ||||
| /** | ||||
|  * @suppress | ||||
|  */ | ||||
|   | ||||
| @@ -14,6 +14,10 @@ actual typealias MPPFile = File | ||||
|  */ | ||||
| actual val MPPFile.filename: FileName | ||||
|     get() = FileName(name) | ||||
|  | ||||
| actual val MPPFilePathSeparator: Char | ||||
|     get() = File.separatorChar | ||||
|  | ||||
| /** | ||||
|  * @suppress | ||||
|  */ | ||||
|   | ||||
| @@ -11,6 +11,10 @@ actual typealias MPPFile = Path | ||||
|  */ | ||||
| actual val MPPFile.filename: FileName | ||||
|     get() = FileName(toString()) | ||||
|  | ||||
|  | ||||
| actual val MPPFilePathSeparator: Char = Path.DIRECTORY_SEPARATOR.first() | ||||
|  | ||||
| /** | ||||
|  * @suppress | ||||
|  */ | ||||
|   | ||||
| @@ -37,6 +37,10 @@ private suspend fun MPPFile.dirtyReadBytes(): ByteArray = readBytesPromise().awa | ||||
|  */ | ||||
| actual val MPPFile.filename: FileName | ||||
|     get() = FileName(name) | ||||
|  | ||||
| actual val MPPFilePathSeparator: Char | ||||
|     get() = '/' | ||||
|  | ||||
| /** | ||||
|  * @suppress | ||||
|  */ | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package dev.inmo.micro_utils.coroutines.compose | ||||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.runtime.collectAsState | ||||
| import androidx.compose.runtime.remember | ||||
| import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow | ||||
| import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow | ||||
| import kotlinx.coroutines.flow.StateFlow | ||||
| import kotlinx.coroutines.flow.asStateFlow | ||||
| import kotlinx.coroutines.flow.debounce | ||||
| @@ -16,7 +16,7 @@ import org.jetbrains.compose.web.css.StyleSheet | ||||
|  * to add `Style(stylesheet)` on every compose function call | ||||
|  */ | ||||
| object StyleSheetsAggregator { | ||||
|     private val _stylesFlow = SpecialMutableStateFlow<Set<CSSRulesHolder>>(emptySet()) | ||||
|     private val _stylesFlow = MutableRedeliverStateFlow<Set<CSSRulesHolder>>(emptySet()) | ||||
|     val stylesFlow: StateFlow<Set<CSSRulesHolder>> = _stylesFlow.asStateFlow() | ||||
|  | ||||
|     @Composable | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import androidx.compose.material.Button | ||||
| import androidx.compose.material.Text | ||||
| import androidx.compose.runtime.collectAsState | ||||
| import androidx.compose.ui.test.* | ||||
| import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow | ||||
| import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow | ||||
| import org.jetbrains.annotations.TestOnly | ||||
| import kotlin.test.Test | ||||
|  | ||||
| @@ -11,7 +11,7 @@ class FlowStateTests { | ||||
|     @Test | ||||
|     @TestOnly | ||||
|     fun simpleTest() = runComposeUiTest { | ||||
|         val flowState = SpecialMutableStateFlow(0) | ||||
|         val flowState = MutableRedeliverStateFlow(0) | ||||
|         setContent { | ||||
|             Button({ flowState.value++ }) { Text("Click") } | ||||
|             Text(flowState.collectAsState().value.toString()) | ||||
|   | ||||
| @@ -1,7 +1,5 @@ | ||||
| package dev.inmo.micro_utils.coroutines | ||||
| 
 | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
| import kotlinx.coroutines.ExperimentalCoroutinesApi | ||||
| import kotlinx.coroutines.InternalCoroutinesApi | ||||
| import kotlinx.coroutines.channels.BufferOverflow | ||||
| @@ -11,13 +9,12 @@ import kotlinx.coroutines.flow.MutableStateFlow | ||||
| import kotlinx.coroutines.flow.StateFlow | ||||
| import kotlinx.coroutines.internal.SynchronizedObject | ||||
| import kotlinx.coroutines.internal.synchronized | ||||
| import kotlin.coroutines.CoroutineContext | ||||
| 
 | ||||
| /** | ||||
|  * Works like [StateFlow], but guarantee that latest value update will always be delivered to | ||||
|  * each active subscriber | ||||
|  */ | ||||
| open class SpecialMutableStateFlow<T>( | ||||
| open class MutableRedeliverStateFlow<T>( | ||||
|     initialValue: T | ||||
| ) : MutableStateFlow<T>, FlowCollector<T>, MutableSharedFlow<T> { | ||||
|     @OptIn(InternalCoroutinesApi::class) | ||||
| @@ -68,3 +65,6 @@ open class SpecialMutableStateFlow<T>( | ||||
| 
 | ||||
|     override suspend fun collect(collector: FlowCollector<T>) = sharingFlow.collect(collector) | ||||
| } | ||||
| 
 | ||||
| @Deprecated("Renamed to MutableRedeliverStateFlow", ReplaceWith("MutableRedeliverStateFlow<T>")) | ||||
| typealias SpecialMutableStateFlow<T> = MutableRedeliverStateFlow<T> | ||||
| @@ -1,7 +1,6 @@ | ||||
| package dev.inmo.micro_utils.coroutines | ||||
|  | ||||
| import kotlinx.coroutines.currentCoroutineContext | ||||
| import kotlinx.coroutines.flow.MutableStateFlow | ||||
| import kotlinx.coroutines.flow.StateFlow | ||||
| import kotlinx.coroutines.flow.asStateFlow | ||||
| import kotlinx.coroutines.flow.first | ||||
| @@ -44,7 +43,7 @@ sealed interface SmartMutex { | ||||
|      * @param locked Preset state of [isLocked] and its internal [_lockStateFlow] | ||||
|      */ | ||||
|     class Mutable(locked: Boolean = false) : SmartMutex { | ||||
|         private val _lockStateFlow = SpecialMutableStateFlow<Boolean>(locked) | ||||
|         private val _lockStateFlow = MutableRedeliverStateFlow<Boolean>(locked) | ||||
|         override val lockStateFlow: StateFlow<Boolean> = _lockStateFlow.asStateFlow() | ||||
|  | ||||
|         private val internalChangesMutex = Mutex() | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| package dev.inmo.micro_utils.coroutines | ||||
|  | ||||
| import kotlinx.coroutines.currentCoroutineContext | ||||
| import kotlinx.coroutines.flow.MutableStateFlow | ||||
| import kotlinx.coroutines.flow.StateFlow | ||||
| import kotlinx.coroutines.flow.asStateFlow | ||||
| import kotlinx.coroutines.flow.first | ||||
| @@ -47,7 +46,7 @@ sealed interface SmartSemaphore { | ||||
|      */ | ||||
|     class Mutable(permits: Int, acquiredPermits: Int = 0) : SmartSemaphore { | ||||
|         override val maxPermits: Int = permits | ||||
|         private val _freePermitsStateFlow = SpecialMutableStateFlow<Int>(permits - acquiredPermits) | ||||
|         private val _freePermitsStateFlow = MutableRedeliverStateFlow<Int>(permits - acquiredPermits) | ||||
|         override val permitsStateFlow: StateFlow<Int> = _freePermitsStateFlow.asStateFlow() | ||||
|  | ||||
|         private val internalChangesMutex = Mutex(false) | ||||
|   | ||||
| @@ -1,33 +1,31 @@ | ||||
| import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow | ||||
| import dev.inmo.micro_utils.coroutines.asDeferred | ||||
| import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow | ||||
| import dev.inmo.micro_utils.coroutines.subscribe | ||||
| import kotlinx.coroutines.Job | ||||
| import kotlinx.coroutines.flow.first | ||||
| import kotlinx.coroutines.test.runTest | ||||
| import kotlin.test.Test | ||||
| import kotlin.test.assertEquals | ||||
| import kotlin.test.assertTrue | ||||
|  | ||||
| class SpecialMutableStateFlowTests { | ||||
|     @Test | ||||
|     fun simpleTest() = runTest { | ||||
|         val specialMutableStateFlow = SpecialMutableStateFlow(0) | ||||
|         specialMutableStateFlow.value = 1 | ||||
|         specialMutableStateFlow.first { it == 1 } | ||||
|         assertEquals(1, specialMutableStateFlow.value) | ||||
|         val mutableRedeliverStateFlow = MutableRedeliverStateFlow(0) | ||||
|         mutableRedeliverStateFlow.value = 1 | ||||
|         mutableRedeliverStateFlow.first { it == 1 } | ||||
|         assertEquals(1, mutableRedeliverStateFlow.value) | ||||
|     } | ||||
|     @Test | ||||
|     fun specialTest() = runTest { | ||||
|         val specialMutableStateFlow = SpecialMutableStateFlow(0) | ||||
|         val mutableRedeliverStateFlow = MutableRedeliverStateFlow(0) | ||||
|         lateinit var subscriberJob: Job | ||||
|         subscriberJob = specialMutableStateFlow.subscribe(this) { | ||||
|         subscriberJob = mutableRedeliverStateFlow.subscribe(this) { | ||||
|             when (it) { | ||||
|                 1 -> specialMutableStateFlow.value = 2 | ||||
|                 1 -> mutableRedeliverStateFlow.value = 2 | ||||
|                 2 -> subscriberJob.cancel() | ||||
|             } | ||||
|         } | ||||
|         specialMutableStateFlow.value = 1 | ||||
|         mutableRedeliverStateFlow.value = 1 | ||||
|         subscriberJob.join() | ||||
|         assertEquals(2, specialMutableStateFlow.value) | ||||
|         assertEquals(2, mutableRedeliverStateFlow.value) | ||||
|     } | ||||
| } | ||||
| @@ -18,5 +18,5 @@ crypto_js_version=4.1.1 | ||||
| # Project data | ||||
|  | ||||
| group=dev.inmo | ||||
| version=0.26.1 | ||||
| android_code_version=300 | ||||
| version=0.26.6 | ||||
| android_code_version=305 | ||||
|   | ||||
| @@ -1,45 +1,46 @@ | ||||
| [versions] | ||||
|  | ||||
| kt = "2.2.0" | ||||
| kt = "2.2.20" | ||||
| kt-serialization = "1.9.0" | ||||
| kt-coroutines = "1.10.2" | ||||
|  | ||||
| kotlinx-browser = "0.3" | ||||
| kotlinx-browser = "0.5.0" | ||||
|  | ||||
| kslog = "1.5.0" | ||||
| kslog = "1.5.1" | ||||
|  | ||||
| jb-compose = "1.8.2" | ||||
| jb-exposed = "0.61.0" | ||||
| jb-dokka = "2.0.0" | ||||
| jb-dokka = "2.1.0" | ||||
|  | ||||
| sqlite = "3.50.1.0" | ||||
| # 3.50.3.0 contains bug https://github.com/InsanusMokrassar/MicroUtils/actions/runs/18138301958/job/51629588088 | ||||
| sqlite = "3.50.3.0" | ||||
|  | ||||
| korlibs = "5.4.0" | ||||
| uuid = "0.8.4" | ||||
|  | ||||
| ktor = "3.2.2" | ||||
| ktor = "3.3.1" | ||||
|  | ||||
| gh-release = "2.5.2" | ||||
|  | ||||
| koin = "4.1.0" | ||||
| koin = "4.1.1" | ||||
|  | ||||
| okio = "3.15.0" | ||||
| okio = "3.16.2" | ||||
|  | ||||
| ksp = "2.2.0-2.0.2" | ||||
| ksp = "2.2.20-2.0.3" | ||||
| kotlin-poet = "2.2.0" | ||||
|  | ||||
| versions = "0.52.0" | ||||
| nmcp = "1.0.1" | ||||
| nmcp = "1.1.0" | ||||
|  | ||||
| android-gradle = "8.9.+" | ||||
| android-gradle = "8.10.+" | ||||
| dexcount = "4.0.0" | ||||
|  | ||||
| android-coreKtx = "1.16.0" | ||||
| android-coreKtx = "1.17.0" | ||||
| android-recyclerView = "1.4.0" | ||||
| android-appCompat = "1.7.1" | ||||
| android-fragment = "1.8.8" | ||||
| android-espresso = "3.6.1" | ||||
| android-test = "1.2.1" | ||||
| android-fragment = "1.8.9" | ||||
| android-espresso = "3.7.0" | ||||
| android-test = "1.3.0" | ||||
|  | ||||
| android-props-minSdk = "21" | ||||
| android-props-compileSdk = "36" | ||||
|   | ||||
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
|   | ||||
| @@ -1,9 +1,8 @@ | ||||
| package dev.inmo.micro_utils.pagination.compose | ||||
|  | ||||
| import androidx.compose.runtime.* | ||||
| import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow | ||||
| import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow | ||||
| import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions | ||||
| import dev.inmo.micro_utils.coroutines.runCatchingLogging | ||||
| import dev.inmo.micro_utils.pagination.* | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Job | ||||
| @@ -27,8 +26,8 @@ class InfinityPagedComponentContext<T> internal constructor( | ||||
|     private val loader: suspend InfinityPagedComponentContext<T>.(Pagination) -> PaginationResult<T> | ||||
| ) { | ||||
|     internal val startPage = SimplePagination(page, size) | ||||
|     internal val latestLoadedPage = SpecialMutableStateFlow<PaginationResult<T>?>(null) | ||||
|     internal val dataState = SpecialMutableStateFlow<List<T>?>(null) | ||||
|     internal val latestLoadedPage = MutableRedeliverStateFlow<PaginationResult<T>?>(null) | ||||
|     internal val dataState = MutableRedeliverStateFlow<List<T>?>(null) | ||||
|     internal var loadingJob: Job? = null | ||||
|     internal val loadingMutex = Mutex() | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package dev.inmo.micro_utils.pagination.compose | ||||
|  | ||||
| import androidx.compose.runtime.* | ||||
| import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow | ||||
| import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow | ||||
| import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions | ||||
| import dev.inmo.micro_utils.pagination.* | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| @@ -28,8 +28,8 @@ class PagedComponentContext<T> internal constructor( | ||||
|     private val loader: suspend PagedComponentContext<T>.(Pagination) -> PaginationResult<T> | ||||
| ) { | ||||
|     internal val startPage = SimplePagination(initialPage, size) | ||||
|     internal val latestLoadedPage = SpecialMutableStateFlow<PaginationResult<T>?>(null) | ||||
|     internal val dataState = SpecialMutableStateFlow<PaginationResult<T>?>(null) | ||||
|     internal val latestLoadedPage = MutableRedeliverStateFlow<PaginationResult<T>?>(null) | ||||
|     internal val dataState = MutableRedeliverStateFlow<PaginationResult<T>?>(null) | ||||
|     internal var loadingJob: Job? = null | ||||
|     internal val loadingMutex = Mutex() | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,81 @@ | ||||
| package dev.inmo.micro_utils.repos.exposed | ||||
|  | ||||
| import org.jetbrains.exposed.sql.* | ||||
| import org.jetbrains.exposed.sql.SchemaUtils.addMissingColumnsStatements | ||||
| import org.jetbrains.exposed.sql.SchemaUtils.checkMappingConsistence | ||||
| import org.jetbrains.exposed.sql.SchemaUtils.createStatements | ||||
| import org.jetbrains.exposed.sql.transactions.TransactionManager | ||||
| import org.jetbrains.exposed.sql.transactions.transaction | ||||
|  | ||||
| /** | ||||
|  * Code in this function mostly duplicates Exposed [SchemaUtils.createMissingTablesAndColumns]. It made due to deprecation | ||||
|  * status of the last one and potential lost of it in future updates. | ||||
|  * | ||||
|  * Code doing: | ||||
|  * | ||||
|  * * Creating missed tables | ||||
|  * * Altering missed tables (where possible) | ||||
|  * * Calculate problems with [checkMappingConsistence] and add them in execution too | ||||
|  * | ||||
|  * All changes made in [transaction] with [database] as its `db` argument | ||||
|  */ | ||||
| fun initTablesInTransaction(vararg tables: Table, database: Database, inBatch: Boolean = false, withLogs: Boolean = true) { | ||||
|     transaction(database) { | ||||
|         fun <R> logTimeSpent(message: String, withLogs: Boolean, block: () -> R): R { | ||||
|             return if (withLogs) { | ||||
|                 val start = System.currentTimeMillis() | ||||
|                 val answer = block() | ||||
|                 exposedLogger.info(message + " took " + (System.currentTimeMillis() - start) + "ms") | ||||
|                 answer | ||||
|             } else { | ||||
|                 block() | ||||
|             } | ||||
|         } | ||||
|         fun Transaction.execStatements(inBatch: Boolean, statements: List<String>) { | ||||
|             if (inBatch) { | ||||
|                 execInBatch(statements) | ||||
|             } else { | ||||
|                 for (statement in statements) { | ||||
|                     exec(statement) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         with(TransactionManager.current()) { | ||||
|             db.dialect.resetCaches() | ||||
|             val createStatements = logTimeSpent("Preparing create tables statements", withLogs) { | ||||
|                 createStatements(*tables) | ||||
|             } | ||||
|             logTimeSpent("Executing create tables statements", withLogs) { | ||||
|                 execStatements(inBatch, createStatements) | ||||
|                 commit() | ||||
|             } | ||||
|  | ||||
|             val alterStatements = logTimeSpent("Preparing alter table statements", withLogs) { | ||||
|                 addMissingColumnsStatements(tables = tables, withLogs) | ||||
|             } | ||||
|             logTimeSpent("Executing alter table statements", withLogs) { | ||||
|                 execStatements(inBatch, alterStatements) | ||||
|                 commit() | ||||
|             } | ||||
|             val executedStatements = createStatements + alterStatements | ||||
|             logTimeSpent("Checking mapping consistence", withLogs) { | ||||
|                 val modifyTablesStatements = checkMappingConsistence( | ||||
|                     tables = tables, | ||||
|                     withLogs | ||||
|                 ).filter { it !in executedStatements } | ||||
|                 execStatements(inBatch, modifyTablesStatements) | ||||
|                 commit() | ||||
|             } | ||||
|             db.dialect.resetCaches() | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fun Table.initTable(database: Database, inBatch: Boolean, withLogs: Boolean) { | ||||
|     initTablesInTransaction(this, database = database, inBatch = inBatch, withLogs = withLogs) | ||||
| } | ||||
| fun Table.initTable(database: Database) { | ||||
|     transaction(database) { SchemaUtils.createMissingTablesAndColumns(this@initTable) } | ||||
|     initTable(database = database, inBatch = false, withLogs = true) | ||||
| } | ||||
|  | ||||
| fun <T> T.initTable() where T: ExposedRepo, T: Table = initTable(database) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user