Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
kvdb
rocksdb
提交
e96e71be
R
rocksdb
项目概览
kvdb
/
rocksdb
12 个月 前同步成功
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rocksdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e96e71be
编写于
4月 25, 2014
作者:
A
Ankit Gupta
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Multi-get impl and formatting
上级
042221ba
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
216 addition
and
2 deletion
+216
-2
Makefile
Makefile
+1
-1
java/Makefile
java/Makefile
+1
-1
java/RocksDBSample.java
java/RocksDBSample.java
+2
-0
java/org/rocksdb/RocksDB.java
java/org/rocksdb/RocksDB.java
+62
-0
java/rocksjni/portal.h
java/rocksjni/portal.h
+64
-0
java/rocksjni/rocksjni.cc
java/rocksjni/rocksjni.cc
+86
-0
未找到文件。
Makefile
浏览文件 @
e96e71be
...
...
@@ -434,7 +434,7 @@ ROCKSDBJNILIB = ./java/librocksdbjni.jnilib
JAVA_INCLUDE
=
-I
/System/Library/Frameworks/JavaVM.framework/Headers/
endif
rocksdbjava
:
clean
rocksdbjava
:
OPT
=
"-fPIC -DNDEBUG -O2"
$(MAKE)
$(LIBRARY)
-j32
cd
java
;
$(MAKE)
java
;
rm
-f
$(ROCKSDBJNILIB)
...
...
java/Makefile
浏览文件 @
e96e71be
...
...
@@ -16,7 +16,7 @@ sample: java
javac
-cp
$(ROCKSDB_JAR)
RocksDBSample.java
@
rm
-rf
/tmp/rocksdbjni
@
rm
-rf
/tmp/rocksdbjni_not_found
java
-ea
-Djava
.library.path
=
.
:../
-cp
".:./*"
-Xcheck
:jni RocksDBSample /tmp/rocksdbjni
java
-ea
-Djava
.library.path
=
.
-cp
".:./*"
-Xcheck
:jni RocksDBSample /tmp/rocksdbjni
@
rm
-rf
/tmp/rocksdbjni
@
rm
-rf
/tmp/rocksdbjni_not_found
...
...
java/RocksDBSample.java
浏览文件 @
e96e71be
...
...
@@ -4,6 +4,8 @@
// of patent rights can be found in the PATENTS file in the same directory.
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.ArrayList
;
import
org.rocksdb.*
;
import
org.rocksdb.util.SizeUnit
;
import
java.io.IOException
;
...
...
java/org/rocksdb/RocksDB.java
浏览文件 @
e96e71be
...
...
@@ -5,6 +5,9 @@
package
org.rocksdb
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.HashMap
;
import
java.io.Closeable
;
import
java.io.IOException
;
...
...
@@ -142,6 +145,7 @@ public class RocksDB {
* returned if the specified key is not found.
*
* @param key the key retrieve the value.
* @param opt Read options.
* @return a byte array storing the value associated with the input key if
* any. null if it does not find the specified key.
*
...
...
@@ -150,6 +154,60 @@ public class RocksDB {
public
byte
[]
get
(
ReadOptions
opt
,
byte
[]
key
)
throws
RocksDBException
{
return
get
(
nativeHandle_
,
opt
.
nativeHandle_
,
key
,
key
.
length
);
}
/**
* Returns a map of keys for which values were found in DB.
*
* @param keys List of keys for which values need to be retrieved.
* @return Map where key of map is the key passed by user and value for map
* entry is the corresponding value in DB.
*
* @see RocksDBException
*/
public
Map
<
byte
[],
byte
[]>
multiGet
(
List
<
byte
[]>
keys
)
throws
RocksDBException
{
List
<
byte
[]>
values
=
multiGet
(
nativeHandle_
,
keys
,
keys
.
size
());
Map
<
byte
[],
byte
[]>
keyValueMap
=
new
HashMap
<
byte
[],
byte
[]>();
for
(
int
i
=
0
;
i
<
values
.
size
();
i
++)
{
if
(
values
.
get
(
i
)
==
null
)
{
continue
;
}
keyValueMap
.
put
(
keys
.
get
(
i
),
values
.
get
(
i
));
}
return
keyValueMap
;
}
/**
* Returns a map of keys for which values were found in DB.
*
* @param List of keys for which values need to be retrieved.
* @param opt Read options.
* @return Map where key of map is the key passed by user and value for map
* entry is the corresponding value in DB.
*
* @see RocksDBException
*/
public
Map
<
byte
[],
byte
[]>
multiGet
(
ReadOptions
opt
,
List
<
byte
[]>
keys
)
throws
RocksDBException
{
List
<
byte
[]>
values
=
multiGet
(
nativeHandle_
,
opt
.
nativeHandle_
,
keys
,
keys
.
size
());
Map
<
byte
[],
byte
[]>
keyValueMap
=
new
HashMap
<
byte
[],
byte
[]>();
for
(
int
i
=
0
;
i
<
values
.
size
();
i
++)
{
if
(
values
.
get
(
i
)
==
null
)
{
continue
;
}
keyValueMap
.
put
(
keys
.
get
(
i
),
values
.
get
(
i
));
}
return
keyValueMap
;
}
/**
* Remove the database entry (if any) for "key". Returns OK on
...
...
@@ -213,6 +271,10 @@ public class RocksDB {
protected
native
int
get
(
long
handle
,
long
readOptHandle
,
byte
[]
key
,
int
keyLen
,
byte
[]
value
,
int
valueLen
)
throws
RocksDBException
;
protected
native
List
<
byte
[]>
multiGet
(
long
dbHandle
,
List
<
byte
[]>
keys
,
int
keysCount
);
protected
native
List
<
byte
[]>
multiGet
(
long
dbHandle
,
long
rOptHandle
,
List
<
byte
[]>
keys
,
int
keysCount
);
protected
native
byte
[]
get
(
long
handle
,
byte
[]
key
,
int
keyLen
)
throws
RocksDBException
;
protected
native
byte
[]
get
(
...
...
java/rocksjni/portal.h
浏览文件 @
e96e71be
...
...
@@ -315,5 +315,69 @@ class FilterJni {
reinterpret_cast
<
jlong
>
(
op
));
}
};
class
ListJni
{
public:
// Get the java class id of java.util.List.
static
jclass
getListClass
(
JNIEnv
*
env
)
{
static
jclass
jclazz
=
env
->
FindClass
(
"java/util/List"
);
assert
(
jclazz
!=
nullptr
);
return
jclazz
;
}
// Get the java class id of java.util.ArrayList.
static
jclass
getArrayListClass
(
JNIEnv
*
env
)
{
static
jclass
jclazz
=
env
->
FindClass
(
"java/util/ArrayList"
);
assert
(
jclazz
!=
nullptr
);
return
jclazz
;
}
// Get the java class id of java.util.Iterator.
static
jclass
getIteratorClass
(
JNIEnv
*
env
)
{
static
jclass
jclazz
=
env
->
FindClass
(
"java/util/Iterator"
);
assert
(
jclazz
!=
nullptr
);
return
jclazz
;
}
// Get the java method id of java.util.List.iterator().
static
jmethodID
getIteratorMethod
(
JNIEnv
*
env
)
{
static
jmethodID
mid
=
env
->
GetMethodID
(
getListClass
(
env
),
"iterator"
,
"()Ljava/util/Iterator;"
);
assert
(
mid
!=
nullptr
);
return
mid
;
}
// Get the java method id of java.util.Iterator.hasNext().
static
jmethodID
getHasNextMethod
(
JNIEnv
*
env
)
{
static
jmethodID
mid
=
env
->
GetMethodID
(
getIteratorClass
(
env
),
"hasNext"
,
"()Z"
);
assert
(
mid
!=
nullptr
);
return
mid
;
}
// Get the java method id of java.util.Iterator.next().
static
jmethodID
getNextMethod
(
JNIEnv
*
env
)
{
static
jmethodID
mid
=
env
->
GetMethodID
(
getIteratorClass
(
env
),
"next"
,
"()Ljava/lang/Object;"
);
assert
(
mid
!=
nullptr
);
return
mid
;
}
// Get the java method id of arrayList constructor.
static
jmethodID
getArrayListConstructorMethodId
(
JNIEnv
*
env
,
jclass
jclazz
)
{
static
jmethodID
mid
=
env
->
GetMethodID
(
jclazz
,
"<init>"
,
"(I)V"
);
assert
(
mid
!=
nullptr
);
return
mid
;
}
// Get the java method id of java.util.List.add().
static
jmethodID
getListAddMethodId
(
JNIEnv
*
env
)
{
static
jmethodID
mid
=
env
->
GetMethodID
(
getListClass
(
env
),
"add"
,
"(Ljava/lang/Object;)Z"
);
assert
(
mid
!=
nullptr
);
return
mid
;
}
};
}
// namespace rocksdb
#endif // JAVA_ROCKSJNI_PORTAL_H_
java/rocksjni/rocksjni.cc
浏览文件 @
e96e71be
...
...
@@ -10,6 +10,7 @@
#include <stdlib.h>
#include <jni.h>
#include <string>
#include <vector>
#include "include/org_rocksdb_RocksDB.h"
#include "rocksjni/portal.h"
...
...
@@ -244,6 +245,91 @@ jint rocksdb_get_helper(
return
cvalue_len
;
}
jobject
multi_get_helper
(
JNIEnv
*
env
,
jobject
jdb
,
rocksdb
::
DB
*
db
,
const
rocksdb
::
ReadOptions
&
rOpt
,
jobject
jkey_list
,
jint
jkeys_count
)
{
std
::
vector
<
rocksdb
::
Slice
>
keys
;
std
::
vector
<
jbyte
*>
keys_to_free
;
// get iterator
jobject
iteratorObj
=
env
->
CallObjectMethod
(
jkey_list
,
rocksdb
::
ListJni
::
getIteratorMethod
(
env
));
// iterate over keys and convert java byte array to slice
while
(
env
->
CallBooleanMethod
(
iteratorObj
,
rocksdb
::
ListJni
::
getHasNextMethod
(
env
))
==
JNI_TRUE
)
{
jbyteArray
jkey
=
(
jbyteArray
)
env
->
CallObjectMethod
(
iteratorObj
,
rocksdb
::
ListJni
::
getNextMethod
(
env
));
jint
key_length
=
env
->
GetArrayLength
(
jkey
);
jbyte
*
key
=
new
jbyte
[
key_length
];
env
->
GetByteArrayRegion
(
jkey
,
0
,
key_length
,
key
);
// store allocated jbyte to free it after multiGet call
keys_to_free
.
push_back
(
key
);
rocksdb
::
Slice
key_slice
(
reinterpret_cast
<
char
*>
(
key
),
key_length
);
keys
.
push_back
(
key_slice
);
}
std
::
vector
<
std
::
string
>
values
;
std
::
vector
<
rocksdb
::
Status
>
s
=
db
->
MultiGet
(
rOpt
,
keys
,
&
values
);
// Don't reuse class pointer
jclass
jclazz
=
env
->
FindClass
(
"java/util/ArrayList"
);
jmethodID
mid
=
rocksdb
::
ListJni
::
getArrayListConstructorMethodId
(
env
,
jclazz
);
jobject
jvalue_list
=
env
->
NewObject
(
jclazz
,
mid
,
jkeys_count
);
// insert in java list
for
(
std
::
vector
<
rocksdb
::
Status
>::
size_type
i
=
0
;
i
!=
s
.
size
();
i
++
)
{
if
(
s
[
i
].
ok
())
{
jbyteArray
jvalue
=
env
->
NewByteArray
(
values
[
i
].
size
());
env
->
SetByteArrayRegion
(
jvalue
,
0
,
values
[
i
].
size
(),
reinterpret_cast
<
const
jbyte
*>
(
values
[
i
].
c_str
()));
env
->
CallBooleanMethod
(
jvalue_list
,
rocksdb
::
ListJni
::
getListAddMethodId
(
env
),
jvalue
);
}
else
{
env
->
CallBooleanMethod
(
jvalue_list
,
rocksdb
::
ListJni
::
getListAddMethodId
(
env
),
nullptr
);
}
}
// free up allocated byte arrays
for
(
std
::
vector
<
jbyte
*>::
size_type
i
=
0
;
i
!=
keys_to_free
.
size
();
i
++
)
{
delete
[]
keys_to_free
[
i
];
}
keys_to_free
.
clear
();
return
jvalue_list
;
}
/*
* Class: org_rocksdb_RocksDB
* Method: multiGet
* Signature: (JLjava/util/List;I)Ljava/util/List;
*/
jobject
Java_org_rocksdb_RocksDB_multiGet
(
JNIEnv
*
env
,
jobject
jdb
,
jlong
jdb_handle
,
jobject
jkey_list
,
jint
jkeys_count
)
{
return
multi_get_helper
(
env
,
jdb
,
reinterpret_cast
<
rocksdb
::
DB
*>
(
jdb_handle
),
rocksdb
::
ReadOptions
(),
jkey_list
,
jkeys_count
);
}
/*
* Class: org_rocksdb_RocksDB
* Method: multiGet
* Signature: (JJLjava/util/List;I)Ljava/util/List;
*/
jobject
Java_org_rocksdb_RocksDB_multiGet
(
JNIEnv
*
env
,
jobject
jdb
,
jlong
jdb_handle
,
jlong
jropt_handle
,
jobject
jkey_list
,
jint
jkeys_count
)
{
return
multi_get_helper
(
env
,
jdb
,
reinterpret_cast
<
rocksdb
::
DB
*>
(
jdb_handle
),
*
reinterpret_cast
<
rocksdb
::
ReadOptions
*>
(
jropt_handle
),
jkey_list
,
jkeys_count
);
}
/*
* Class: org_rocksdb_RocksDB
* Method: get
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录