Skip to content

Commit

Permalink
Refactored bindings in "MappingSupportSQLiteStatement"
Browse files Browse the repository at this point in the history
Swapped bindings storage from lambdas to actual values
Added additional copy-operation to ByteArray-bindings to prevent downstream changes
Added utility methods

*This commit is related to issue #529 [1]*

[1] #529
  • Loading branch information
JaniruTEC committed Sep 25, 2024
1 parent 1406d5d commit c039e0a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 10 deletions.
13 changes: 13 additions & 0 deletions data/src/main/java/org/cryptomator/data/db/sqlmapping/Helpers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,17 @@ internal fun ContentValues.compatIsEmpty(): Boolean {
} else {
size() == 0
}
}

internal fun <E> MutableList<E?>.setLeniently(index: Int, element: E?): E? {
val limit = index - size
for (i in 0..limit) { //The size of the range is 0 if limit < 0, 1 if limit == 0 and limit + 1 else.
add(null)
}
return set(index, element)
}

internal inline fun <reified T> Sequence<T>.toArray(size: Int): Array<T> {
val iterator = iterator()
return Array(size) { iterator.next() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -106,29 +106,33 @@ internal class MappingSupportSQLiteDatabase(
private val sql: String
) : SupportSQLiteStatement {

private val bindings = mutableListOf<(SupportSQLiteStatement) -> Unit>()
private val bindings = mutableListOf<Any?>()

private fun saveBinding(index: Int, value: Any?): Any? {
return bindings.setLeniently(index - 1, value)
}

override fun bindBlob(index: Int, value: ByteArray) {
bindings.add { statement -> statement.bindBlob(index, value.copyOf()) }
saveBinding(index, value.copyOf())
}

override fun bindDouble(index: Int, value: Double) {
bindings.add { statement -> statement.bindDouble(index, value) }
saveBinding(index, value)
}

override fun bindLong(index: Int, value: Long) {
bindings.add { statement -> statement.bindLong(index, value) }
saveBinding(index, value)
}

override fun bindNull(index: Int) {
bindings.add { statement -> statement.bindNull(index) }
saveBinding(index, null)
}

override fun bindString(index: Int, value: String) {
bindings.add { statement -> statement.bindString(index, value) }
saveBinding(index, value)
}

override fun clearBindings() {
override fun clearBindings(): Unit {
bindings.clear()
}

Expand Down Expand Up @@ -159,9 +163,18 @@ internal class MappingSupportSQLiteDatabase(
@VisibleForTesting
internal fun newBoundStatement(): SupportSQLiteStatement {
return delegate.compileStatement(map(sql)).also { statement ->
for (binding: (SupportSQLiteStatement) -> Unit in bindings) {
binding(statement)
}
SimpleSQLiteQuery.bind(statement, prepareBindArgs())
}
}

private fun prepareBindArgs(): Array<Any?> {
return bindings.asSequence().map { binding -> prepareSingleBindArg(binding) }.toArray(bindings.size)
}

private fun prepareSingleBindArg(binding: Any?): Any? {
return when (binding) {
is ByteArray -> binding.copyOf()
else -> binding
}
}
}
Expand Down

0 comments on commit c039e0a

Please sign in to comment.