Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
kvdb
rocksdb
提交
933973dc
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,发现更多精彩内容 >>
提交
933973dc
编写于
2月 11, 2015
作者:
Y
Yueh-Hsuan Chiang
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #495 from fyrz/RocksJava-CF-Name-Byte-Handling
[RocksJava] CF Name shall handle bytes correctly
上级
6d6305dd
5e8e453d
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
94 addition
and
55 deletion
+94
-55
java/rocksjni/rocksjni.cc
java/rocksjni/rocksjni.cc
+15
-35
java/rocksjni/ttl.cc
java/rocksjni/ttl.cc
+5
-16
java/src/test/java/org/rocksdb/ColumnFamilyTest.java
java/src/test/java/org/rocksdb/ColumnFamilyTest.java
+74
-4
未找到文件。
java/rocksjni/rocksjni.cc
浏览文件 @
933973dc
...
...
@@ -77,8 +77,6 @@ jobject
const
char
*
db_path
=
env
->
GetStringUTFChars
(
jdb_path
,
0
);
std
::
vector
<
jbyte
*>
cfnames_to_free
;
// the zero-terminated version of cfnames_to_free.
std
::
vector
<
char
*>
c_cfnames_to_free
;
std
::
vector
<
jbyteArray
>
jcfnames_for_free
;
std
::
vector
<
rocksdb
::
ColumnFamilyDescriptor
>
column_families
;
...
...
@@ -94,8 +92,8 @@ jobject
jobject
jcf_descriptor
=
env
->
CallObjectMethod
(
iteratorObj
,
rocksdb
::
ListJni
::
getNextMethod
(
env
));
// get ColumnFamilyName
jbyteArray
byteArray
=
static_cast
<
jbyteArray
>
(
env
->
CallObjectMethod
(
jcf_descriptor
,
jbyteArray
cf_name_in_byte_array
=
static_cast
<
jbyteArray
>
(
env
->
CallObjectMethod
(
jcf_descriptor
,
rocksdb
::
ColumnFamilyDescriptorJni
::
getColumnFamilyNameMethod
(
env
)));
// get CF Options
...
...
@@ -105,18 +103,14 @@ jobject
rocksdb
::
ColumnFamilyOptions
*
cfOptions
=
rocksdb
::
ColumnFamilyOptionsJni
::
getHandle
(
env
,
jcf_opt_obj
);
jbyte
*
cfname
=
env
->
GetByteArrayElements
(
byteArray
,
0
);
const
int
len
=
env
->
GetArrayLength
(
byteArray
)
+
1
;
char
*
c_cfname
=
new
char
[
len
];
memcpy
(
c_cfname
,
cfname
,
len
-
1
);
c_cfname
[
len
-
1
]
=
0
;
jbyte
*
cfname
=
env
->
GetByteArrayElements
(
cf_name_in_byte_array
,
0
);
const
int
len
=
env
->
GetArrayLength
(
cf_name_in_byte_array
);
// free allocated cfnames after call to open
cfnames_to_free
.
push_back
(
cfname
);
c_cfnames_to_free
.
push_back
(
c_cfname
);
jcfnames_for_free
.
push_back
(
byteArray
);
jcfnames_for_free
.
push_back
(
cf_name_in_byte_array
);
column_families
.
push_back
(
rocksdb
::
ColumnFamilyDescriptor
(
c_cfname
,
*
cfOptions
));
std
::
string
(
reinterpret_cast
<
char
*>
(
cfname
),
len
)
,
*
cfOptions
));
}
rocksdb
::
Status
s
=
rocksdb
::
DB
::
OpenForReadOnly
(
*
opt
,
...
...
@@ -127,8 +121,6 @@ jobject
i
!=
cfnames_to_free
.
size
();
i
++
)
{
// free cfnames
env
->
ReleaseByteArrayElements
(
jcfnames_for_free
[
i
],
cfnames_to_free
[
i
],
0
);
// free c_cfnames
delete
[]
c_cfnames_to_free
[
i
];
}
// check if open operation was successful
...
...
@@ -170,8 +162,6 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I(
const
char
*
db_path
=
env
->
GetStringUTFChars
(
jdb_path
,
0
);
std
::
vector
<
jbyte
*>
cfnames_to_free
;
// the zero-terminated version of cfnames_to_free.
std
::
vector
<
char
*>
c_cfnames_to_free
;
std
::
vector
<
jbyteArray
>
jcfnames_for_free
;
std
::
vector
<
rocksdb
::
ColumnFamilyDescriptor
>
column_families
;
...
...
@@ -187,8 +177,8 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I(
jobject
jcf_descriptor
=
env
->
CallObjectMethod
(
iteratorObj
,
rocksdb
::
ListJni
::
getNextMethod
(
env
));
// get ColumnFamilyName
jbyteArray
byteArray
=
static_cast
<
jbyteArray
>
(
env
->
CallObjectMethod
(
jcf_descriptor
,
jbyteArray
cf_name_in_byte_array
=
static_cast
<
jbyteArray
>
(
env
->
CallObjectMethod
(
jcf_descriptor
,
rocksdb
::
ColumnFamilyDescriptorJni
::
getColumnFamilyNameMethod
(
env
)));
// get CF Options
...
...
@@ -198,18 +188,14 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I(
rocksdb
::
ColumnFamilyOptions
*
cfOptions
=
rocksdb
::
ColumnFamilyOptionsJni
::
getHandle
(
env
,
jcf_opt_obj
);
jbyte
*
cfname
=
env
->
GetByteArrayElements
(
byteArray
,
0
);
const
int
len
=
env
->
GetArrayLength
(
byteArray
)
+
1
;
char
*
c_cfname
=
new
char
[
len
];
memcpy
(
c_cfname
,
cfname
,
len
-
1
);
c_cfname
[
len
-
1
]
=
0
;
jbyte
*
cfname
=
env
->
GetByteArrayElements
(
cf_name_in_byte_array
,
0
);
const
int
len
=
env
->
GetArrayLength
(
cf_name_in_byte_array
);
// free allocated cfnames after call to open
cfnames_to_free
.
push_back
(
cfname
);
c_cfnames_to_free
.
push_back
(
c_cfname
);
jcfnames_for_free
.
push_back
(
byteArray
);
jcfnames_for_free
.
push_back
(
cf_name_in_byte_array
);
column_families
.
push_back
(
rocksdb
::
ColumnFamilyDescriptor
(
c_cfname
,
*
cfOptions
));
std
::
string
(
reinterpret_cast
<
char
*>
(
cfname
),
len
)
,
*
cfOptions
));
}
rocksdb
::
Status
s
=
rocksdb
::
DB
::
Open
(
*
opt
,
db_path
,
column_families
,
...
...
@@ -220,8 +206,6 @@ jobject Java_org_rocksdb_RocksDB_open__JLjava_lang_String_2Ljava_util_List_2I(
i
!=
cfnames_to_free
.
size
();
i
++
)
{
// free cfnames
env
->
ReleaseByteArrayElements
(
jcfnames_for_free
[
i
],
cfnames_to_free
[
i
],
0
);
// free c_cfnames
delete
[]
c_cfnames_to_free
[
i
];
}
// check if open operation was successful
...
...
@@ -281,7 +265,7 @@ jobject Java_org_rocksdb_RocksDB_listColumnFamilies(
env
->
NewByteArray
(
static_cast
<
jsize
>
(
column_family_names
[
i
].
size
()));
env
->
SetByteArrayRegion
(
jcf_value
,
0
,
static_cast
<
jsize
>
(
column_family_names
[
i
].
size
()),
reinterpret_cast
<
const
jbyte
*>
(
column_family_names
[
i
].
c_str
()));
reinterpret_cast
<
const
jbyte
*>
(
column_family_names
[
i
].
data
()));
env
->
CallBooleanMethod
(
jvalue_list
,
rocksdb
::
ListJni
::
getListAddMethodId
(
env
),
jcf_value
);
}
...
...
@@ -1294,15 +1278,11 @@ jlong Java_org_rocksdb_RocksDB_createColumnFamily(
rocksdb
::
ColumnFamilyOptionsJni
::
getHandle
(
env
,
jcf_opt_obj
);
jbyte
*
cfname
=
env
->
GetByteArrayElements
(
byteArray
,
0
);
const
int
len
=
env
->
GetArrayLength
(
byteArray
)
+
1
;
char
*
c_cfname
=
new
char
[
len
];
memcpy
(
c_cfname
,
cfname
,
len
-
1
);
c_cfname
[
len
-
1
]
=
0
;
const
int
len
=
env
->
GetArrayLength
(
byteArray
);
rocksdb
::
Status
s
=
db_handle
->
CreateColumnFamily
(
*
cfOptions
,
c_cfname
,
&
handle
);
*
cfOptions
,
std
::
string
(
reinterpret_cast
<
char
*>
(
cfname
),
len
)
,
&
handle
);
env
->
ReleaseByteArrayElements
(
byteArray
,
cfname
,
0
);
delete
[]
c_cfname
;
if
(
s
.
ok
())
{
return
reinterpret_cast
<
jlong
>
(
handle
);
...
...
java/rocksjni/ttl.cc
浏览文件 @
933973dc
...
...
@@ -57,8 +57,6 @@ jobject
const
char
*
db_path
=
env
->
GetStringUTFChars
(
jdb_path
,
0
);
std
::
vector
<
jbyte
*>
cfnames_to_free
;
// the zero-terminated version of cfnames_to_free.
std
::
vector
<
char
*>
c_cfnames_to_free
;
std
::
vector
<
jbyteArray
>
jcfnames_for_free
;
std
::
vector
<
rocksdb
::
ColumnFamilyDescriptor
>
column_families
;
...
...
@@ -87,17 +85,13 @@ jobject
rocksdb
::
ColumnFamilyOptionsJni
::
getHandle
(
env
,
jcf_opt_obj
);
jbyte
*
cfname
=
env
->
GetByteArrayElements
(
byteArray
,
0
);
const
int
len
=
env
->
GetArrayLength
(
byteArray
)
+
1
;
char
*
c_cfname
=
new
char
[
len
];
memcpy
(
c_cfname
,
cfname
,
len
-
1
);
c_cfname
[
len
-
1
]
=
0
;
const
int
len
=
env
->
GetArrayLength
(
byteArray
);
// free allocated cfnames after call to open
cfnames_to_free
.
push_back
(
cfname
);
c_cfnames_to_free
.
push_back
(
c_cfname
);
jcfnames_for_free
.
push_back
(
byteArray
);
column_families
.
push_back
(
rocksdb
::
ColumnFamilyDescriptor
(
c_cfname
,
*
cfOptions
));
std
::
string
(
reinterpret_cast
<
char
*>
(
cfname
),
len
)
,
*
cfOptions
));
}
// get iterator for TTL values
iteratorObj
=
env
->
CallObjectMethod
(
...
...
@@ -122,8 +116,6 @@ jobject
i
!=
cfnames_to_free
.
size
();
i
++
)
{
// free cfnames
env
->
ReleaseByteArrayElements
(
jcfnames_for_free
[
i
],
cfnames_to_free
[
i
],
0
);
// free c_cfnames
delete
[]
c_cfnames_to_free
[
i
];
}
// check if open operation was successful
...
...
@@ -176,15 +168,12 @@ jlong Java_org_rocksdb_TtlDB_createColumnFamilyWithTtl(
rocksdb
::
ColumnFamilyOptionsJni
::
getHandle
(
env
,
jcf_opt_obj
);
jbyte
*
cfname
=
env
->
GetByteArrayElements
(
byteArray
,
0
);
const
int
len
=
env
->
GetArrayLength
(
byteArray
)
+
1
;
char
*
c_cfname
=
new
char
[
len
];
memcpy
(
c_cfname
,
cfname
,
len
-
1
);
c_cfname
[
len
-
1
]
=
0
;
const
int
len
=
env
->
GetArrayLength
(
byteArray
);
rocksdb
::
Status
s
=
db_handle
->
CreateColumnFamilyWithTtl
(
*
cfOptions
,
c_cfname
,
&
handle
,
jttl
);
*
cfOptions
,
std
::
string
(
reinterpret_cast
<
char
*>
(
cfname
),
len
),
&
handle
,
jttl
);
env
->
ReleaseByteArrayElements
(
byteArray
,
cfname
,
0
);
delete
[]
c_cfname
;
if
(
s
.
ok
())
{
return
reinterpret_cast
<
jlong
>
(
handle
);
...
...
java/src/test/java/org/rocksdb/ColumnFamilyTest.java
浏览文件 @
933973dc
...
...
@@ -5,10 +5,7 @@
package
org.rocksdb
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.ArrayList
;
import
java.util.Map
;
import
java.util.*
;
import
org.junit.ClassRule
;
import
org.junit.Rule
;
...
...
@@ -604,4 +601,77 @@ public class ColumnFamilyTest {
}
}
@Test
public
void
testByteCreateFolumnFamily
()
throws
RocksDBException
{
RocksDB
db
=
null
;
Options
options
=
null
;
try
{
options
=
new
Options
().
setCreateIfMissing
(
true
);
db
=
RocksDB
.
open
(
options
,
dbFolder
.
getRoot
().
getAbsolutePath
());
byte
[]
b0
=
new
byte
[]
{
(
byte
)
0x00
};
byte
[]
b1
=
new
byte
[]
{
(
byte
)
0x01
};
byte
[]
b2
=
new
byte
[]
{
(
byte
)
0x02
};
db
.
createColumnFamily
(
new
ColumnFamilyDescriptor
(
b0
));
db
.
createColumnFamily
(
new
ColumnFamilyDescriptor
(
b1
));
List
<
byte
[]>
families
=
RocksDB
.
listColumnFamilies
(
options
,
dbFolder
.
getRoot
().
getAbsolutePath
());
assertThat
(
families
).
contains
(
"default"
.
getBytes
(),
b0
,
b1
);
db
.
createColumnFamily
(
new
ColumnFamilyDescriptor
(
b2
));
}
finally
{
if
(
db
!=
null
)
{
db
.
close
();
}
if
(
options
!=
null
)
{
options
.
dispose
();
}
}
}
@Test
public
void
testCFNamesWithZeroBytes
()
throws
RocksDBException
{
RocksDB
db
=
null
;
Options
options
=
null
;
try
{
options
=
new
Options
().
setCreateIfMissing
(
true
);
db
=
RocksDB
.
open
(
options
,
dbFolder
.
getRoot
().
getAbsolutePath
());
byte
[]
b0
=
new
byte
[]
{
0
,
0
};
byte
[]
b1
=
new
byte
[]
{
0
,
1
};
db
.
createColumnFamily
(
new
ColumnFamilyDescriptor
(
b0
));
db
.
createColumnFamily
(
new
ColumnFamilyDescriptor
(
b1
));
List
<
byte
[]>
families
=
RocksDB
.
listColumnFamilies
(
options
,
dbFolder
.
getRoot
().
getAbsolutePath
());
assertThat
(
families
).
contains
(
"default"
.
getBytes
(),
b0
,
b1
);
}
finally
{
if
(
db
!=
null
)
{
db
.
close
();
}
if
(
options
!=
null
)
{
options
.
dispose
();
}
}
}
@Test
public
void
testCFNameSimplifiedChinese
()
throws
RocksDBException
{
RocksDB
db
=
null
;
Options
options
=
null
;
try
{
options
=
new
Options
().
setCreateIfMissing
(
true
);
db
=
RocksDB
.
open
(
options
,
dbFolder
.
getRoot
().
getAbsolutePath
());
final
String
simplifiedChinese
=
"简体字"
;
db
.
createColumnFamily
(
new
ColumnFamilyDescriptor
(
simplifiedChinese
.
getBytes
()));
List
<
byte
[]>
families
=
RocksDB
.
listColumnFamilies
(
options
,
dbFolder
.
getRoot
().
getAbsolutePath
());
assertThat
(
families
).
contains
(
"default"
.
getBytes
(),
simplifiedChinese
.
getBytes
());
}
finally
{
if
(
db
!=
null
)
{
db
.
close
();
}
if
(
options
!=
null
)
{
options
.
dispose
();
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录