Skip to content

Commit 1d6c1e0

Browse files
author
Ankit Gupta
committed
Add more iterator JNI bindings
1 parent eda3984 commit 1d6c1e0

File tree

4 files changed

+114
-6
lines changed

4 files changed

+114
-6
lines changed

java/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
NATIVE_JAVA_CLASSES = org.rocksdb.RocksDB org.rocksdb.Options org.rocksdb.WriteBatch org.rocksdb.WriteBatchInternal org.rocksdb.WriteBatchTest org.rocksdb.WriteOptions org.rocksdb.BackupableDB org.rocksdb.BackupableDBOptions org.rocksdb.Statistics
1+
NATIVE_JAVA_CLASSES = org.rocksdb.RocksDB org.rocksdb.Options org.rocksdb.WriteBatch org.rocksdb.WriteBatchInternal org.rocksdb.WriteBatchTest org.rocksdb.WriteOptions org.rocksdb.BackupableDB org.rocksdb.BackupableDBOptions org.rocksdb.Statistics org.rocksdb.Iterator
22
NATIVE_INCLUDE = ./include
33
ROCKSDB_JAR = rocksdbjni.jar
44

java/RocksDBSample.java

+32-5
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,39 @@ public static void main(String[] args) {
143143
}
144144

145145
Iterator iterator = db.iterator();
146+
147+
boolean seekToFirstPassed = false;
148+
for (iterator.seekToFirst(); iterator.isValid(); iterator.next()) {
149+
iterator.status();
150+
assert(iterator.key() != null);
151+
assert(iterator.value() != null);
152+
seekToFirstPassed = true;
153+
}
154+
if(seekToFirstPassed) {
155+
System.out.println("iterator seekToFirst tests passed.");
156+
}
157+
158+
boolean seekToLastPassed = false;
159+
for (iterator.seekToLast(); iterator.isValid(); iterator.prev()) {
160+
iterator.status();
161+
assert(iterator.key() != null);
162+
assert(iterator.value() != null);
163+
seekToLastPassed = true;
164+
}
165+
166+
if(seekToLastPassed) {
167+
System.out.println("iterator seekToLastPassed tests passed.");
168+
}
169+
146170
iterator.seekToFirst();
147-
assert(iterator.isValid());
148-
iterator.next();
149-
iterator.seekToLast();
150-
iterator.prev();
151-
iterator.close();
171+
iterator.seek(iterator.key());
172+
assert(iterator.key() != null);
173+
assert(iterator.value() != null);
174+
175+
System.out.println("iterator seek test passed.");
176+
177+
iterator.close();
178+
System.out.println("iterator tests passed.");
152179
} catch (RocksDBException e) {
153180
System.err.println(e);
154181
}

java/org/rocksdb/Iterator.java

+24
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,26 @@ public void prev() {
3737
prev0(nativeHandle_);
3838
}
3939

40+
public byte[] key() {
41+
assert(isInitialized());
42+
return key0(nativeHandle_);
43+
}
44+
45+
public byte[] value() {
46+
assert(isInitialized());
47+
return value0(nativeHandle_);
48+
}
49+
50+
public void seek(byte[] target) {
51+
assert(isInitialized());
52+
seek0(nativeHandle_, target, target.length);
53+
}
54+
55+
public void status(){
56+
assert(isInitialized());
57+
status0(nativeHandle_);
58+
}
59+
4060
public synchronized void close() {
4161
if(nativeHandle_ != 0) {
4262
close0(nativeHandle_);
@@ -57,4 +77,8 @@ private boolean isInitialized() {
5777
private native void seekToLast0(long handle);
5878
private native void next0(long handle);
5979
private native void prev0(long handle);
80+
private native byte[] key0(long handle);
81+
private native byte[] value0(long handle);
82+
private native void seek0(long handle, byte[] target, int targetLen);
83+
private native void status0(long handle);
6084
}

java/rocksjni/iterator.cc

+57
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,63 @@ void Java_org_rocksdb_Iterator_prev0(
5454
st->Prev();
5555
}
5656

57+
jbyteArray Java_org_rocksdb_Iterator_key0(
58+
JNIEnv* env, jobject jobj, jlong handle) {
59+
auto st = reinterpret_cast<rocksdb::Iterator*>(handle);
60+
assert(st != nullptr);
61+
62+
rocksdb::Slice key_slice = st->key();
63+
64+
jbyteArray jkey = env->NewByteArray(key_slice.size());
65+
env->SetByteArrayRegion(
66+
jkey, 0, key_slice.size(),
67+
reinterpret_cast<const jbyte*>(key_slice.data()));
68+
return jkey;
69+
}
70+
71+
jbyteArray Java_org_rocksdb_Iterator_value0(
72+
JNIEnv* env, jobject jobj, jlong handle) {
73+
auto st = reinterpret_cast<rocksdb::Iterator*>(handle);
74+
assert(st != nullptr);
75+
76+
rocksdb::Slice value_slice = st->value();
77+
78+
jbyteArray jvalue = env->NewByteArray(value_slice.size());
79+
env->SetByteArrayRegion(
80+
jvalue, 0, value_slice.size(),
81+
reinterpret_cast<const jbyte*>(value_slice.data()));
82+
return jvalue;
83+
}
84+
85+
void Java_org_rocksdb_Iterator_seek0(
86+
JNIEnv* env, jobject jobj, jlong handle,
87+
jbyteArray jtarget, jint jtarget_len) {
88+
auto st = reinterpret_cast<rocksdb::Iterator*>(handle);
89+
assert(st != nullptr);
90+
91+
jbyte* target = env->GetByteArrayElements(jtarget, 0);
92+
rocksdb::Slice target_slice(
93+
reinterpret_cast<char*>(target), jtarget_len);
94+
95+
st->Seek(target_slice);
96+
97+
env->ReleaseByteArrayElements(jtarget, target, JNI_ABORT);
98+
}
99+
100+
void Java_org_rocksdb_Iterator_status0(
101+
JNIEnv* env, jobject jobj, jlong handle) {
102+
auto st = reinterpret_cast<rocksdb::Iterator*>(handle);
103+
assert(st != nullptr);
104+
105+
rocksdb::Status s = st->status();
106+
107+
if (s.ok()) {
108+
return;
109+
}
110+
111+
rocksdb::RocksDBExceptionJni::ThrowNew(env, s);
112+
}
113+
57114
void Java_org_rocksdb_Iterator_close0(
58115
JNIEnv* env, jobject jobj, jlong handle) {
59116
auto st = reinterpret_cast<rocksdb::Iterator*>(handle);

0 commit comments

Comments
 (0)