Skip to content

Commit bb59942

Browse files
committed
feat: support SQLite3MC version check on Desktop and Web platforms
- Update `CheckSqlCipherVersionUseCase` to use `SELECT sqlite3mc_version();` for Desktop and Web platforms while retaining `PRAGMA cipher_version;` for Android and iOS. - Refactor `JvmSafeRepo.execute` to use the SQLDelight driver's `executeQuery` instead of raw JDBC `DriverManager` for more consistent database access. - Ensure `SettingsViewModel` displays the SQL version result as a string in the UI.
1 parent 7d507a4 commit bb59942

3 files changed

Lines changed: 23 additions & 36 deletions

File tree

core/data/db-sqldelight/src/jvmMain/kotlin/com/softartdev/notedelight/repository/JvmSafeRepo.kt

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.softartdev.notedelight.repository
22

3-
import co.touchlab.kermit.Logger
3+
import app.cash.sqldelight.db.QueryResult
4+
import app.cash.sqldelight.db.SqlCursor
45
import com.softartdev.notedelight.db.FilePathResolver
56
import com.softartdev.notedelight.db.JdbcDatabaseHolder
67
import com.softartdev.notedelight.db.JvmCipherUtils
78
import com.softartdev.notedelight.db.NoteDAO
89
import com.softartdev.notedelight.db.SqlDelightNoteDAO
910
import com.softartdev.notedelight.model.PlatformSQLiteState
1011
import com.softartdev.notedelight.util.CoroutineDispatchers
11-
import java.sql.DriverManager
1212
import java.util.Properties
1313

1414
class JvmSafeRepo(private val coroutineDispatchers: CoroutineDispatchers) : SafeRepo() {
@@ -51,40 +51,20 @@ class JvmSafeRepo(private val coroutineDispatchers: CoroutineDispatchers) : Safe
5151
}
5252

5353
override suspend fun execute(query: String): String? {
54-
val holder = buildDbIfNeed()
55-
val url = holder.jdbcUrl
56-
val props = Properties()
57-
var connection: java.sql.Connection? = null
58-
try {
59-
connection = DriverManager.getConnection(url, props)
60-
val stmt = connection.createStatement()
61-
val hasResultSet = stmt.execute(query)
62-
val result = if (hasResultSet) {
63-
val rs = stmt.resultSet
64-
if (rs.next()) rs.getString(1) else null
65-
} else {
66-
null
67-
}
68-
stmt.close()
69-
if (result != null) return result
70-
val mcStmt = connection.createStatement()
71-
val mcHasResult = mcStmt.execute("SELECT sqlite3mc_version();")
72-
val mcResult = if (mcHasResult) {
73-
val rs = mcStmt.resultSet
74-
if (rs.next()) rs.getString(1) else null
75-
} else {
76-
null
77-
}
78-
mcStmt.close()
79-
return mcResult
80-
} catch (e: Exception) {
81-
Logger.withTag("JvmSafeRepo").e(e) { "Error executing query: $query" }
82-
throw e
83-
} finally {
84-
connection?.close()
85-
}
54+
val queryResult: QueryResult<String?> = buildDbIfNeed().driver.executeQuery(
55+
identifier = null,
56+
sql = query,
57+
parameters = 0,
58+
binders = null,
59+
mapper = this::map
60+
)
61+
return queryResult.await()
8662
}
8763

64+
private fun map(sqlCursor: SqlCursor): QueryResult<String?> = QueryResult.Value(
65+
value = if (sqlCursor.next().value) sqlCursor.getString(0) else null
66+
)
67+
8868
override suspend fun encrypt(newPass: CharSequence) {
8969
closeDatabase()
9070
JvmCipherUtils.encrypt(
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
package com.softartdev.notedelight.usecase.crypt
22

33
import com.softartdev.notedelight.repository.SafeRepo
4+
import com.softartdev.notedelight.util.Platform
5+
import com.softartdev.notedelight.util.platform
46

57
class CheckSqlCipherVersionUseCase(private val safeRepo: SafeRepo) : suspend () -> String? {
68

7-
override suspend fun invoke(): String? = safeRepo.execute(query = "PRAGMA cipher_version;")
9+
override suspend fun invoke(): String? = safeRepo.execute(
10+
query = when (platform) {
11+
Platform.Android, Platform.IOS -> "PRAGMA cipher_version;"
12+
Platform.Desktop, Platform.Web -> "SELECT sqlite3mc_version();"
13+
}
14+
)
815
}

core/presentation/src/commonMain/kotlin/com/softartdev/notedelight/presentation/settings/SettingsViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ class SettingsViewModel(
155155
mutableStateFlow.update(SettingsResult::showLoading)
156156
try {
157157
val cipherVersion: String? = checkSqlCipherVersionUseCase.invoke()
158-
cipherVersion?.let { snackbarInteractor.showMessage(SnackbarMessage.Copyable(it)) }
158+
snackbarInteractor.showMessage(SnackbarMessage.Copyable(cipherVersion.toString()))
159159
} catch (e: Throwable) {
160160
handleError(e) { "error checking sqlcipher version" }
161161
} finally {

0 commit comments

Comments
 (0)