Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
R
rust-rocksdb
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fangzongwu
rust-rocksdb
Commits
4894f435
Commit
4894f435
authored
Mar 09, 2017
by
Dylan Wen
Committed by
siddontang
Mar 09, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add delete range interface (#20)
parent
968ba41e
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
153 additions
and
0 deletions
+153
-0
c.cc
librocksdb_sys/crocksdb/c.cc
+11
-0
c.h
librocksdb_sys/crocksdb/rocksdb/c.h
+7
-0
lib.rs
librocksdb_sys/src/lib.rs
+19
-0
rocksdb.rs
src/rocksdb.rs
+116
-0
No files found.
librocksdb_sys/crocksdb/c.cc
View file @
4894f435
...
...
@@ -711,6 +711,17 @@ void crocksdb_single_delete_cf(
Slice
(
key
,
keylen
)));
}
void
crocksdb_delete_range_cf
(
crocksdb_t
*
db
,
const
crocksdb_writeoptions_t
*
options
,
crocksdb_column_family_handle_t
*
column_family
,
const
char
*
begin_key
,
size_t
begin_keylen
,
const
char
*
end_key
,
size_t
end_keylen
,
char
**
errptr
)
{
SaveError
(
errptr
,
db
->
rep
->
DeleteRange
(
options
->
rep
,
column_family
->
rep
,
Slice
(
begin_key
,
begin_keylen
),
Slice
(
end_key
,
end_keylen
)));
}
void
crocksdb_merge
(
crocksdb_t
*
db
,
const
crocksdb_writeoptions_t
*
options
,
...
...
librocksdb_sys/crocksdb/rocksdb/c.h
View file @
4894f435
...
...
@@ -235,6 +235,13 @@ extern C_ROCKSDB_LIBRARY_API void crocksdb_single_delete_cf(
crocksdb_column_family_handle_t
*
column_family
,
const
char
*
key
,
size_t
keylen
,
char
**
errptr
);
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_delete_range_cf
(
crocksdb_t
*
db
,
const
crocksdb_writeoptions_t
*
options
,
crocksdb_column_family_handle_t
*
column_family
,
const
char
*
begin_key
,
size_t
begin_keylen
,
const
char
*
end_key
,
size_t
end_keylen
,
char
**
errptr
);
extern
C_ROCKSDB_LIBRARY_API
void
crocksdb_merge
(
crocksdb_t
*
db
,
const
crocksdb_writeoptions_t
*
options
,
const
char
*
key
,
size_t
keylen
,
const
char
*
val
,
size_t
vallen
,
char
**
errptr
);
...
...
librocksdb_sys/src/lib.rs
View file @
4894f435
...
...
@@ -351,6 +351,14 @@ extern "C" {
k
:
*
const
u8
,
kLen
:
size_t
,
err
:
*
mut
*
mut
c_char
);
pub
fn
crocksdb_delete_range_cf
(
db
:
*
mut
DBInstance
,
writeopts
:
*
const
DBWriteOptions
,
cf
:
*
mut
DBCFHandle
,
begin_key
:
*
const
u8
,
begin_keylen
:
size_t
,
end_key
:
*
const
u8
,
end_keylen
:
size_t
,
err
:
*
mut
*
mut
c_char
);
pub
fn
crocksdb_close
(
db
:
*
mut
DBInstance
);
pub
fn
crocksdb_pause_bg_work
(
db
:
*
mut
DBInstance
);
pub
fn
crocksdb_continue_bg_work
(
db
:
*
mut
DBInstance
);
...
...
@@ -459,6 +467,17 @@ extern "C" {
cf
:
*
mut
DBCFHandle
,
key
:
*
const
u8
,
klen
:
size_t
);
pub
fn
crocksdb_writebatch_delete_range
(
batch
:
*
mut
DBWriteBatch
,
begin_key
:
*
const
u8
,
begin_keylen
:
size_t
,
end_key
:
*
const
u8
,
end_keylen
:
size_t
);
pub
fn
crocksdb_writebatch_delete_range_cf
(
batch
:
*
mut
DBWriteBatch
,
cf
:
*
mut
DBCFHandle
,
begin_key
:
*
const
u8
,
begin_keylen
:
size_t
,
end_key
:
*
const
u8
,
end_keylen
:
size_t
);
pub
fn
crocksdb_writebatch_iterate
(
batch
:
*
mut
DBWriteBatch
,
state
:
*
mut
c_void
,
put_fn
:
extern
"C"
fn
(
state
:
*
mut
c_void
,
...
...
src/rocksdb.rs
View file @
4894f435
...
...
@@ -264,6 +264,12 @@ pub trait Writable {
fn
delete_cf
(
&
self
,
cf
:
&
CFHandle
,
key
:
&
[
u8
])
->
Result
<
(),
String
>
;
fn
single_delete
(
&
self
,
key
:
&
[
u8
])
->
Result
<
(),
String
>
;
fn
single_delete_cf
(
&
self
,
cf
:
&
CFHandle
,
key
:
&
[
u8
])
->
Result
<
(),
String
>
;
fn
delete_range
(
&
self
,
begin_key
:
&
[
u8
],
end_key
:
&
[
u8
])
->
Result
<
(),
String
>
;
fn
delete_range_cf
(
&
self
,
cf
:
&
CFHandle
,
begin_key
:
&
[
u8
],
end_key
:
&
[
u8
])
->
Result
<
(),
String
>
;
}
/// A range of keys, `start_key` is included, but not `end_key`.
...
...
@@ -692,6 +698,24 @@ impl DB {
}
}
fn
delete_range_cf_opt
(
&
self
,
cf
:
&
CFHandle
,
begin_key
:
&
[
u8
],
end_key
:
&
[
u8
],
writeopts
:
&
WriteOptions
)
->
Result
<
(),
String
>
{
unsafe
{
ffi_try!
(
crocksdb_delete_range_cf
(
self
.inner
,
writeopts
.inner
,
cf
.inner
,
begin_key
.as_ptr
(),
begin_key
.len
()
as
size_t
,
end_key
.as_ptr
(),
end_key
.len
()
as
size_t
));
Ok
(())
}
}
/// Flush all memtable data.
///
/// Due to lack of abi, only default cf is supported.
...
...
@@ -1000,6 +1024,19 @@ impl Writable for DB {
fn
single_delete_cf
(
&
self
,
cf
:
&
CFHandle
,
key
:
&
[
u8
])
->
Result
<
(),
String
>
{
self
.single_delete_cf_opt
(
cf
,
key
,
&
WriteOptions
::
new
())
}
fn
delete_range
(
&
self
,
begin_key
:
&
[
u8
],
end_key
:
&
[
u8
])
->
Result
<
(),
String
>
{
let
handle
=
self
.cf_handle
(
"default"
)
.unwrap
();
self
.delete_range_cf
(
handle
,
begin_key
,
end_key
)
}
fn
delete_range_cf
(
&
self
,
cf
:
&
CFHandle
,
begin_key
:
&
[
u8
],
end_key
:
&
[
u8
])
->
Result
<
(),
String
>
{
self
.delete_range_cf_opt
(
cf
,
begin_key
,
end_key
,
&
WriteOptions
::
new
())
}
}
impl
Default
for
WriteBatch
{
...
...
@@ -1146,6 +1183,33 @@ impl Writable for WriteBatch {
Ok
(())
}
}
fn
delete_range
(
&
self
,
begin_key
:
&
[
u8
],
end_key
:
&
[
u8
])
->
Result
<
(),
String
>
{
unsafe
{
crocksdb_ffi
::
crocksdb_writebatch_delete_range
(
self
.inner
,
begin_key
.as_ptr
(),
begin_key
.len
(),
end_key
.as_ptr
(),
end_key
.len
());
Ok
(())
}
}
fn
delete_range_cf
(
&
self
,
cf
:
&
CFHandle
,
begin_key
:
&
[
u8
],
end_key
:
&
[
u8
])
->
Result
<
(),
String
>
{
unsafe
{
crocksdb_ffi
::
crocksdb_writebatch_delete_range_cf
(
self
.inner
,
cf
.inner
,
begin_key
.as_ptr
(),
begin_key
.len
(),
end_key
.as_ptr
(),
end_key
.len
());
Ok
(())
}
}
}
pub
struct
DBVector
{
...
...
@@ -1516,6 +1580,58 @@ mod test {
assert
!
(
a
.unwrap
()
.is_none
());
}
#[test]
fn
test_delete_range
()
{
// Test `DB::delete_range()`
let
path
=
TempDir
::
new
(
"_rust_rocksdb_test_delete_range"
)
.expect
(
""
);
let
db
=
DB
::
open_default
(
path
.path
()
.to_str
()
.unwrap
())
.unwrap
();
// Prepare some data.
let
prepare_data
=
||
{
db
.put
(
b
"a"
,
b
"v1"
)
.unwrap
();
let
a
=
db
.get
(
b
"a"
);
assert_eq!
(
a
.unwrap
()
.unwrap
(),
b
"v1"
);
db
.put
(
b
"b"
,
b
"v2"
)
.unwrap
();
let
b
=
db
.get
(
b
"b"
);
assert_eq!
(
b
.unwrap
()
.unwrap
(),
b
"v2"
);
db
.put
(
b
"c"
,
b
"v3"
)
.unwrap
();
let
c
=
db
.get
(
b
"c"
);
assert_eq!
(
c
.unwrap
()
.unwrap
(),
b
"v3"
);
};
prepare_data
();
// Ensure delete range interface works to delete the specified range `[b"a", b"c")`.
db
.delete_range
(
b
"a"
,
b
"c"
)
.unwrap
();
let
check_data
=
||
{
assert
!
(
db
.get
(
b
"a"
)
.unwrap
()
.is_none
());
assert
!
(
db
.get
(
b
"b"
)
.unwrap
()
.is_none
());
let
c
=
db
.get
(
b
"c"
);
assert_eq!
(
c
.unwrap
()
.unwrap
(),
b
"v3"
);
};
check_data
();
// Test `DB::delete_range_cf()`
prepare_data
();
let
cf_handle
=
db
.cf_handle
(
"default"
)
.unwrap
();
db
.delete_range_cf
(
cf_handle
,
b
"a"
,
b
"c"
)
.unwrap
();
check_data
();
// Test `WriteBatch::delete_range()`
prepare_data
();
let
batch
=
WriteBatch
::
new
();
batch
.delete_range
(
b
"a"
,
b
"c"
)
.unwrap
();
assert
!
(
db
.write
(
batch
)
.is_ok
());
check_data
();
// Test `WriteBatch::delete_range_cf()`
prepare_data
();
let
batch
=
WriteBatch
::
new
();
batch
.delete_range_cf
(
cf_handle
,
b
"a"
,
b
"c"
)
.unwrap
();
assert
!
(
db
.write
(
batch
)
.is_ok
());
check_data
();
}
#[test]
fn
test_pause_bg_work
()
{
let
path
=
TempDir
::
new
(
"_rust_rocksdb_pause_bg_work"
)
.expect
(
""
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment