Skip to content

Commit

Permalink
Fix toPointer() function and added Gradle utility scripts (#22)
Browse files Browse the repository at this point in the history
toPointer() allocating one bte less, resulting in missing string termination char in native memory, leading to random issues in JVM.
  • Loading branch information
lamba92 authored Dec 27, 2024
1 parent 128bc65 commit 7488725
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 11 deletions.
11 changes: 11 additions & 0 deletions nuke-gradle.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
@echo off
for /r %%i in (.) do (
if /i "%%~nxi"==".gradle" (
echo Deleting: %%i
rd /s /q "%%i"
)
if /i "%%~nxi"=="build" (
echo Deleting: %%i
rd /s /q "%%i"
)
)
3 changes: 3 additions & 0 deletions nuke-gradle.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash

find . \( -name ".gradle" -o -name "build" \) -type d -exec rm -rf {} \;
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public class JvmLevelDB internal constructor(
val errPtr = PointerByReference()
val writeOptions = leveldb_writeoptions_create()
leveldb_writeoptions_set_sync(writeOptions, sync.toByte())
val keyPointer = key.toByteArray().toPointer()
val valuePointer = value.toByteArray().toPointer()
val keyPointer = key.toPointer()
val valuePointer = value.toPointer()
leveldb_put(
db = nativeDatabase,
options = writeOptions,
Expand Down Expand Up @@ -56,7 +56,7 @@ public class JvmLevelDB internal constructor(
val errPtr = PointerByReference()
val writeOptions = leveldb_writeoptions_create()
leveldb_writeoptions_set_sync(writeOptions, sync.toByte())
val keyPointer = key.toByteArray().toPointer()
val keyPointer = key.toPointer()
leveldb_delete(
db = nativeDatabase,
options = writeOptions,
Expand All @@ -83,8 +83,8 @@ public class JvmLevelDB internal constructor(
for (operation in operations) {
when (operation) {
is LevelDBBatchOperation.Put -> {
val keyPointer = operation.key.toByteArray().toPointer()
val valuePointer = operation.value.toByteArray().toPointer()
val keyPointer = operation.key.toPointer()
val valuePointer = operation.value.toPointer()
leveldb_writebatch_put(
batch = nativeBatch,
key = keyPointer,
Expand All @@ -97,7 +97,7 @@ public class JvmLevelDB internal constructor(
}

is LevelDBBatchOperation.Delete -> {
val keyPointer = operation.key.toByteArray().toPointer()
val keyPointer = operation.key.toPointer()
leveldb_writebatch_delete(
batch = nativeBatch,
key = keyPointer,
Expand Down Expand Up @@ -147,12 +147,10 @@ public class JvmLevelDB internal constructor(
val startPointer =
start
.takeIf { it.isNotEmpty() }
?.toByteArray()
?.toPointer()
val endPointer =
end
.takeIf { it.isNotEmpty() }
?.toByteArray()
?.toPointer()
LibLevelDB.leveldb_compact_range(
db = nativeDatabase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.sun.jna.NativeLong
import com.sun.jna.ptr.LongByReference
import com.sun.jna.ptr.PointerByReference

internal fun ByteArray.toPointer() = Memory(size.toLong()).apply { write(0, this@toPointer, 0, this@toPointer.size) }
internal fun String.toPointer() = Memory(length.toLong() + 1L).also { it.setString(0L, this) }

internal fun LibLevelDB.leveldb_t.get(
verifyChecksums: Boolean,
Expand All @@ -24,7 +24,7 @@ internal fun LibLevelDB.leveldb_t.get(
if (snapshot != null) {
leveldb_readoptions_set_snapshot(nativeReadOptions, snapshot)
}
val keyPointer = key.toByteArray().toPointer()
val keyPointer = key.toPointer()
val valueLengthPointer = LongByReference()
val value =
leveldb_get(
Expand Down Expand Up @@ -85,7 +85,7 @@ internal fun LibLevelDB.leveldb_t.asSequence(
when (from) {
null -> leveldb_iter_seek_to_first(iterator)
else -> {
val fromPointer = from.toByteArray().toPointer()
val fromPointer = from.toPointer()
leveldb_iter_seek(iterator, fromPointer, from.length.toNativeLong())
fromPointer.close()
}
Expand Down

0 comments on commit 7488725

Please sign in to comment.