summaryrefslogtreecommitdiff
path: root/java/rocksjni/slice.cc
diff options
context:
space:
mode:
authorAdam Retter <adam.retter@googlemail.com>2014-08-03 21:11:44 +0100
committerAdam Retter <adam.retter@googlemail.com>2014-10-21 15:52:27 +0100
commitd6fe8dacc8c7121ab33e910c1589c1a1a449fc68 (patch)
tree5093b398999ad26043853e41b067b7175f060fa9 /java/rocksjni/slice.cc
parent700f6ec3ffd4e9c877a848fa7b05268052f9e7b3 (diff)
Feature - Implement Java API for Comparator and Slice. Allows use of
either byte[] or DirectByteBuffer for accessing underlying data.
Diffstat (limited to 'java/rocksjni/slice.cc')
-rw-r--r--java/rocksjni/slice.cc231
1 files changed, 231 insertions, 0 deletions
diff --git a/java/rocksjni/slice.cc b/java/rocksjni/slice.cc
new file mode 100644
index 000000000..a0a6f71e6
--- /dev/null
+++ b/java/rocksjni/slice.cc
@@ -0,0 +1,231 @@
+// Copyright (c) 2014, Facebook, Inc. All rights reserved.
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+// This file implements the "bridge" between Java and C++ for
+// rocksdb::Slice.
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <jni.h>
+#include <string>
+
+#include "include/org_rocksdb_AbstractSlice.h"
+#include "include/org_rocksdb_Slice.h"
+#include "include/org_rocksdb_DirectSlice.h"
+#include "rocksdb/slice.h"
+#include "rocksjni/portal.h"
+
+//<editor-fold desc="org.rocksdb.AbstractSlice>
+
+/*
+ * Class: org_rocksdb_AbstractSlice
+ * Method: createNewSliceFromString
+ * Signature: (Ljava/lang/String;)V
+ */
+void Java_org_rocksdb_AbstractSlice_createNewSliceFromString(
+ JNIEnv* env, jobject jobj, jstring str) {
+ const std::string s = rocksdb::JniUtil::copyString(env, str);
+ const rocksdb::Slice* slice = new rocksdb::Slice(s);
+ rocksdb::AbstractSliceJni::setHandle(env, jobj, slice);
+}
+
+/*
+ * Class: org_rocksdb_AbstractSlice
+ * Method: size0
+ * Signature: (J)I
+ */
+jint Java_org_rocksdb_AbstractSlice_size0(
+ JNIEnv* env, jobject jobj, jlong handle) {
+ const rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ return slice->size();
+}
+
+/*
+ * Class: org_rocksdb_AbstractSlice
+ * Method: empty0
+ * Signature: (J)Z
+ */
+jboolean Java_org_rocksdb_AbstractSlice_empty0(
+ JNIEnv* env, jobject jobj, jlong handle) {
+ const rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ return slice->empty();
+}
+
+/*
+ * Class: org_rocksdb_AbstractSlice
+ * Method: toString0
+ * Signature: (JZ)Ljava/lang/String;
+ */
+jstring Java_org_rocksdb_AbstractSlice_toString0(
+ JNIEnv* env, jobject jobj, jlong handle, jboolean hex) {
+ const rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ const std::string s = slice->ToString(hex);
+ return env->NewStringUTF(s.c_str());
+}
+
+/*
+ * Class: org_rocksdb_AbstractSlice
+ * Method: compare0
+ * Signature: (JJ)I;
+ */
+jint Java_org_rocksdb_AbstractSlice_compare0(
+ JNIEnv* env, jobject jobj, jlong handle, jlong otherHandle) {
+ const rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ const rocksdb::Slice* otherSlice = reinterpret_cast<rocksdb::Slice*>(otherHandle);
+ return slice->compare(*otherSlice);
+}
+
+/*
+ * Class: org_rocksdb_AbstractSlice
+ * Method: startsWith0
+ * Signature: (JJ)Z;
+ */
+jboolean Java_org_rocksdb_AbstractSlice_startsWith0(
+ JNIEnv* env, jobject jobj, jlong handle, jlong otherHandle) {
+ const rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ const rocksdb::Slice* otherSlice = reinterpret_cast<rocksdb::Slice*>(otherHandle);
+ return slice->starts_with(*otherSlice);
+}
+
+/*
+ * Class: org_rocksdb_AbstractSlice
+ * Method: disposeInternal
+ * Signature: (J)V
+ */
+void Java_org_rocksdb_AbstractSlice_disposeInternal(
+ JNIEnv* env, jobject jobj, jlong handle) {
+ delete reinterpret_cast<rocksdb::Slice*>(handle);
+}
+
+//</editor-fold>
+
+//<editor-fold desc="org.rocksdb.Slice>
+
+/*
+ * Class: org_rocksdb_Slice
+ * Method: createNewSlice0
+ * Signature: ([BI)V
+ */
+void Java_org_rocksdb_Slice_createNewSlice0(
+ JNIEnv * env, jobject jobj, jbyteArray data, jint offset) {
+
+ const jsize dataSize = env->GetArrayLength(data);
+ const int len = dataSize - offset;
+ //jbyte ptrData[len];
+ jbyte* ptrData = new jbyte[len];
+ env->GetByteArrayRegion(data, offset, len, ptrData);
+
+ const rocksdb::Slice* slice = new rocksdb::Slice((const char*)ptrData, len);
+ rocksdb::AbstractSliceJni::setHandle(env, jobj, slice);
+
+}
+
+/*
+ * Class: org_rocksdb_Slice
+ * Method: createNewSlice1
+ * Signature: ([B)V
+ */
+void Java_org_rocksdb_Slice_createNewSlice1(
+ JNIEnv * env, jobject jobj, jbyteArray data) {
+
+ jboolean isCopy;
+ jbyte* ptrData = env->GetByteArrayElements(data, &isCopy);
+
+ const rocksdb::Slice* slice = new rocksdb::Slice((const char*)ptrData, env->GetArrayLength(data));
+ rocksdb::AbstractSliceJni::setHandle(env, jobj, slice);
+
+ env->ReleaseByteArrayElements(data, ptrData, JNI_COMMIT);
+
+ //TODO where do we free ptrData later?
+ //do we need to call env->ReleaseByteArrayElements(data, ptrData, JNI_ABORT) in the org.rocksdb.Slice#dispose() method?
+}
+
+/*
+ * Class: org_rocksdb_Slice
+ * Method: data0
+ * Signature: (J)[B
+ */
+jbyteArray Java_org_rocksdb_Slice_data0(
+ JNIEnv* env, jobject jobj, jlong handle) {
+ const rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ const int len = slice->size();
+ const jbyteArray data = env->NewByteArray(len);
+ env->SetByteArrayRegion(data, 0, len, (jbyte*)slice->data());
+ return data;
+}
+
+//</editor-fold>
+
+//<editor-fold desc="org.rocksdb.DirectSlice>
+
+/*
+ * Class: org_rocksdb_DirectSlice
+ * Method: createNewDirectSlice0
+ * Signature: (Ljava/nio/ByteBuffer;I)V
+ */
+void Java_org_rocksdb_DirectSlice_createNewDirectSlice0(
+ JNIEnv* env, jobject jobj, jobject data, jint length) {
+ const char* ptrData = (char*)env->GetDirectBufferAddress(data);
+ const rocksdb::Slice* slice = new rocksdb::Slice(ptrData, length);
+ rocksdb::AbstractSliceJni::setHandle(env, jobj, slice);
+}
+
+/*
+ * Class: org_rocksdb_DirectSlice
+ * Method: createNewDirectSlice1
+ * Signature: (Ljava/nio/ByteBuffer;)V
+ */
+void Java_org_rocksdb_DirectSlice_createNewDirectSlice1(
+ JNIEnv* env, jobject jobj, jobject data) {
+ const char* ptrData = (char*)env->GetDirectBufferAddress(data);
+ const rocksdb::Slice* slice = new rocksdb::Slice(ptrData);
+ rocksdb::AbstractSliceJni::setHandle(env, jobj, slice);
+}
+
+/*
+ * Class: org_rocksdb_DirectSlice
+ * Method: data0
+ * Signature: (J)Ljava/lang/Object;
+ */
+jobject Java_org_rocksdb_DirectSlice_data0(
+ JNIEnv* env, jobject jobj, jlong handle) {
+ const rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ return env->NewDirectByteBuffer((void*)slice->data(), slice->size());
+}
+
+/*
+ * Class: org_rocksdb_DirectSlice
+ * Method: get0
+ * Signature: (JI)B
+ */
+jbyte Java_org_rocksdb_DirectSlice_get0(
+ JNIEnv* env, jobject jobj, jlong handle, jint offset) {
+ rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ return (*slice)[offset];
+}
+
+/*
+ * Class: org_rocksdb_DirectSlice
+ * Method: clear0
+ * Signature: (J)V
+ */
+void Java_org_rocksdb_DirectSlice_clear0(
+ JNIEnv* env, jobject jobj, jlong handle) {
+ rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ slice->clear();
+}
+
+/*
+ * Class: org_rocksdb_DirectSlice
+ * Method: removePrefix0
+ * Signature: (JI)V
+ */
+void Java_org_rocksdb_DirectSlice_removePrefix0(
+ JNIEnv* env, jobject jobj, jlong handle, jint length) {
+ rocksdb::Slice* slice = reinterpret_cast<rocksdb::Slice*>(handle);
+ slice->remove_prefix(length);
+}
+
+//</editor-fold>