https://github.com/shyiko/levelkt
LevelDB client for Kotlin and/or Java 8+
https://github.com/shyiko/levelkt
Last synced: 25 days ago
JSON representation
LevelDB client for Kotlin and/or Java 8+
- Host: GitHub
- URL: https://github.com/shyiko/levelkt
- Owner: shyiko
- Created: 2017-06-11T06:32:26.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2019-02-25T09:20:26.000Z (over 6 years ago)
- Last Synced: 2025-04-21T09:06:47.606Z (about 2 months ago)
- Language: Kotlin
- Size: 61.5 KB
- Stars: 15
- Watchers: 4
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
levelkt
LevelDB client for Kotlin and/or Java 8+.Initially project aimed to provide an alternative API for [fusesource/leveldbjni](https://github.com/fusesource/leveldbjni)'s JNI layer fixing some of the issues around thread-safety, inefficient backward traversal, absent key-only iteration, Java 8 support. Later on, leveldbjni was replaced
with [protonail/leveldb-jna](https://github.com/protonail/leveldb-jna).Compared to pure leveldb-jna, levelkt
- **hides the complexity** associated with managing LevelDB Read/Write options
(while **optimizing number of JNA calls**),
- provides convenient **API for range/prefix queries, existence checks** and
- makes it easier **not to leak resources** (you only need to close LevelDB, LevelDBSnapshot and LevelDBCursor instances (it will also warn you if you don't)).## Usage
```xml
com.github.shyiko.levelkt
levelkt
0.1.0
kalvanized```
#### (example) Kotlin
```kotlin
import com.github.shyiko.levelkt.jna.JNALevelDBJNALevelDB("/tmp/0.leveldb").use { levelDB ->
levelDB.put("key1".toByteArray(), "value1".toByteArray())
levelDB.put("key2.1".toByteArray(), "value2.1".toByteArray())
levelDB.put("key2.2".toByteArray(), "value2.2".toByteArray())
levelDB.put("key3".toByteArray(), "value3".toByteArray())assert(levelDB.get("key1".toByteArray())?.let { String(it) } == "value1")
assert(levelDB.keySlice("key".toByteArray(), offset = 1, limit = 2).map { String(it) } ==
listOf("key2.1", "key2.2"))
assert(levelDB.keySlice("key2".toByteArray(), "key3".toByteArray()).map { String(it) } ==
listOf("key2.1", "key2.2"))
assert(levelDB.keySliceByPrefix("key2".toByteArray()).map { String(it) } ==
listOf("key2.1", "key2.2"))levelDB.keyCursor().use { cursor ->
assert(cursor.seek("key2".toByteArray())?.let { String(it) } == "key2.1")
assert(cursor.next()?.let { String(it) } == "key2.2")
}// slice/sliceByPrefix/cursor look exactly the same as keySlice/keySliceByPrefix/keyCursor
// the only difference - they operate with LevelDBRecord instead of ByteArraylevelDB.batch {
put("key1".toByteArray(), "value1.updated".toByteArray())
del("key3".toByteArray())
}levelDB.del("key1".toByteArray())
}
```#### (example) Java 8+
```java
import com.github.shyiko.levelkt.LevelDB;
import com.github.shyiko.levelkt.jna.JNALevelDB;try (LevelDB levelDB = new JNALevelDB("/tmp/0.levedb")) {
levelDB.batch(batch -> batch
.put("key1".getBytes(), "value1".getBytes())
.put("key2.1".getBytes(), "value2.1".getBytes())
.put("key2.2".getBytes(), "value2.2".getBytes())
.put("key3".getBytes(), "value3".getBytes())
);assert levelDB
.sliceByPrefix("key2".getBytes())
.stream()
.map(record -> new String(record.getKey()) + "=" + new String(record.getValue()))
.collect(Collectors.toList())
.equals(Arrays.asList("key2.1=value2.1", "key2.2=value2.2"));}
```## Development
```sh
git clone https://github.com/shyiko/levelkt && cd levelkt
./mvnw # shows how to build, test, etc. project
```## Legal
All code, unless specified otherwise, is licensed under the [MIT](https://opensource.org/licenses/MIT) license.
Copyright (c) 2017 Stanley Shyiko.