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
a7c90f5d
Commit
a7c90f5d
authored
May 25, 2016
by
siddontang
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'ngaut/master' into siddontang/delete-file-in-range
parents
ca55143a
791fc15f
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
30 additions
and
29 deletions
+30
-29
rocksdb.rs
src/rocksdb.rs
+11
-14
test_iterator.rs
test/test_iterator.rs
+19
-15
No files found.
src/rocksdb.rs
View file @
a7c90f5d
...
@@ -68,19 +68,15 @@ impl<'a> From<&'a [u8]> for SeekKey<'a> {
...
@@ -68,19 +68,15 @@ impl<'a> From<&'a [u8]> for SeekKey<'a> {
}
}
impl
<
'a
>
DBIterator
<
'a
>
{
impl
<
'a
>
DBIterator
<
'a
>
{
fn
new
(
db
:
&
'a
DB
,
readopts
:
&
ReadOptions
,
key
:
SeekKey
)
->
DBIterator
<
'a
>
{
fn
new
(
db
:
&
'a
DB
,
readopts
:
&
ReadOptions
)
->
DBIterator
<
'a
>
{
unsafe
{
unsafe
{
let
iterator
=
rocksdb_ffi
::
rocksdb_create_iterator
(
db
.inner
,
let
iterator
=
rocksdb_ffi
::
rocksdb_create_iterator
(
db
.inner
,
readopts
.inner
);
readopts
.inner
);
let
mut
rv
=
DBIterator
{
DBIterator
{
db
:
db
,
db
:
db
,
inner
:
iterator
,
inner
:
iterator
,
};
}
rv
.seek
(
key
);
rv
}
}
}
}
...
@@ -176,7 +172,7 @@ impl<'a> DBIterator<'a> {
...
@@ -176,7 +172,7 @@ impl<'a> DBIterator<'a> {
pub
type
Kv
=
(
Vec
<
u8
>
,
Vec
<
u8
>
);
pub
type
Kv
=
(
Vec
<
u8
>
,
Vec
<
u8
>
);
impl
<
'
a
>
Iterator
for
DBIterator
<
'a
>
{
impl
<
'
b
,
'a
>
Iterator
for
&
'b
mut
DBIterator
<
'a
>
{
type
Item
=
Kv
;
type
Item
=
Kv
;
fn
next
(
&
mut
self
)
->
Option
<
Kv
>
{
fn
next
(
&
mut
self
)
->
Option
<
Kv
>
{
...
@@ -206,10 +202,10 @@ impl<'a> Snapshot<'a> {
...
@@ -206,10 +202,10 @@ impl<'a> Snapshot<'a> {
}
}
}
}
pub
fn
iter
(
&
self
,
key
:
SeekKey
)
->
DBIterator
{
pub
fn
iter
(
&
self
)
->
DBIterator
{
let
mut
readopts
=
ReadOptions
::
new
();
let
mut
readopts
=
ReadOptions
::
new
();
readopts
.set_snapshot
(
self
);
readopts
.set_snapshot
(
self
);
DBIterator
::
new
(
self
.db
,
&
readopts
,
key
)
DBIterator
::
new
(
self
.db
,
&
readopts
)
}
}
pub
fn
get
(
&
self
,
key
:
&
[
u8
])
->
Result
<
Option
<
DBVector
>
,
String
>
{
pub
fn
get
(
&
self
,
key
:
&
[
u8
])
->
Result
<
Option
<
DBVector
>
,
String
>
{
...
@@ -579,9 +575,9 @@ impl DB {
...
@@ -579,9 +575,9 @@ impl DB {
self
.cfs
.get
(
name
)
self
.cfs
.get
(
name
)
}
}
pub
fn
iter
(
&
self
,
key
:
SeekKey
)
->
DBIterator
{
pub
fn
iter
(
&
self
)
->
DBIterator
{
let
opts
=
ReadOptions
::
new
();
let
opts
=
ReadOptions
::
new
();
DBIterator
::
new
(
&
self
,
&
opts
,
key
)
DBIterator
::
new
(
&
self
,
&
opts
)
}
}
pub
fn
iter_cf
(
&
self
,
pub
fn
iter_cf
(
&
self
,
...
@@ -1127,8 +1123,9 @@ mod test {
...
@@ -1127,8 +1123,9 @@ mod test {
db
.put
(
b
"k1"
,
b
"v1111"
)
.expect
(
""
);
db
.put
(
b
"k1"
,
b
"v1111"
)
.expect
(
""
);
db
.put
(
b
"k2"
,
b
"v2222"
)
.expect
(
""
);
db
.put
(
b
"k2"
,
b
"v2222"
)
.expect
(
""
);
db
.put
(
b
"k3"
,
b
"v3333"
)
.expect
(
""
);
db
.put
(
b
"k3"
,
b
"v3333"
)
.expect
(
""
);
let
iter
=
db
.iter
(
SeekKey
::
Start
);
let
mut
iter
=
db
.iter
();
for
(
k
,
v
)
in
iter
{
iter
.seek
(
SeekKey
::
Start
);
for
(
k
,
v
)
in
&
mut
iter
{
println!
(
"Hello {}: {}"
,
println!
(
"Hello {}: {}"
,
str
::
from_utf8
(
&*
k
)
.unwrap
(),
str
::
from_utf8
(
&*
k
)
.unwrap
(),
str
::
from_utf8
(
&*
v
)
.unwrap
());
str
::
from_utf8
(
&*
v
)
.unwrap
());
...
...
test/test_iterator.rs
View file @
a7c90f5d
use
rocksdb
::{
DB
,
Writable
,
SeekKey
,
DBIterator
,
Kv
};
use
rocksdb
::{
DB
,
Writable
,
SeekKey
,
DBIterator
,
Kv
};
use
tempdir
::
TempDir
;
use
tempdir
::
TempDir
;
fn
prev_collect
<
'a
>
(
mut
iter
:
DBIterator
<
'a
>
)
->
Vec
<
Kv
>
{
fn
prev_collect
<
'a
>
(
iter
:
&
mut
DBIterator
<
'a
>
)
->
Vec
<
Kv
>
{
let
mut
buf
=
vec!
[];
let
mut
buf
=
vec!
[];
while
iter
.valid
()
{
while
iter
.valid
()
{
buf
.push
(
iter
.kv
()
.unwrap
());
buf
.push
(
iter
.kv
()
.unwrap
());
...
@@ -33,32 +33,35 @@ pub fn test_iterator() {
...
@@ -33,32 +33,35 @@ pub fn test_iterator() {
(
k2
.to_vec
(),
v2
.to_vec
()),
(
k2
.to_vec
(),
v2
.to_vec
()),
(
k3
.to_vec
(),
v3
.to_vec
())];
(
k3
.to_vec
(),
v3
.to_vec
())];
let
mut
iter
=
db
.iter
(
SeekKey
::
Start
);
let
mut
iter
=
db
.iter
();
iter
.seek
(
SeekKey
::
Start
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
// Test that it's idempotent
// Test that it's idempotent
iter
=
db
.iter
(
SeekKey
::
Start
);
iter
.seek
(
SeekKey
::
Start
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
// Test it in reverse a few times
// Test it in reverse a few times
iter
=
db
.iter
(
SeekKey
::
End
);
iter
.seek
(
SeekKey
::
End
);
let
mut
tmp_vec
=
prev_collect
(
iter
);
let
mut
tmp_vec
=
prev_collect
(
&
mut
iter
);
tmp_vec
.reverse
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
assert_eq!
(
tmp_vec
,
expected
);
iter
=
db
.iter
(
SeekKey
::
End
);
iter
.seek
(
SeekKey
::
End
);
let
mut
tmp_vec
=
prev_collect
(
iter
);
let
mut
tmp_vec
=
prev_collect
(
&
mut
iter
);
tmp_vec
.reverse
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
assert_eq!
(
tmp_vec
,
expected
);
// Try it forward again
// Try it forward again
iter
=
db
.iter
(
SeekKey
::
Start
);
iter
.seek
(
SeekKey
::
Start
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
iter
=
db
.iter
(
SeekKey
::
Start
);
iter
.seek
(
SeekKey
::
Start
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
let
old_iterator
=
db
.iter
(
SeekKey
::
Start
);
let
mut
old_iterator
=
db
.iter
();
old_iterator
.seek
(
SeekKey
::
Start
);
let
p
=
db
.put
(
&*
k4
,
&*
v4
);
let
p
=
db
.put
(
&*
k4
,
&*
v4
);
assert
!
(
p
.is_ok
());
assert
!
(
p
.is_ok
());
let
expected2
=
vec!
[(
k1
.to_vec
(),
v1
.to_vec
()),
let
expected2
=
vec!
[(
k1
.to_vec
(),
v1
.to_vec
()),
...
@@ -67,20 +70,21 @@ pub fn test_iterator() {
...
@@ -67,20 +70,21 @@ pub fn test_iterator() {
(
k4
.to_vec
(),
v4
.to_vec
())];
(
k4
.to_vec
(),
v4
.to_vec
())];
assert_eq!
(
old_iterator
.collect
::
<
Vec
<
_
>>
(),
expected
);
assert_eq!
(
old_iterator
.collect
::
<
Vec
<
_
>>
(),
expected
);
iter
=
db
.iter
(
SeekKey
::
Start
);
iter
=
db
.iter
();
iter
.seek
(
SeekKey
::
Start
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected2
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected2
);
iter
=
db
.iter
(
SeekKey
::
Key
(
k2
));
iter
.seek
(
SeekKey
::
Key
(
k2
));
let
expected
=
vec!
[(
k2
.to_vec
(),
v2
.to_vec
()),
let
expected
=
vec!
[(
k2
.to_vec
(),
v2
.to_vec
()),
(
k3
.to_vec
(),
v3
.to_vec
()),
(
k3
.to_vec
(),
v3
.to_vec
()),
(
k4
.to_vec
(),
v4
.to_vec
())];
(
k4
.to_vec
(),
v4
.to_vec
())];
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
iter
=
db
.iter
(
SeekKey
::
Key
(
k2
));
iter
.seek
(
SeekKey
::
Key
(
k2
));
let
expected
=
vec!
[(
k2
.to_vec
(),
v2
.to_vec
()),
(
k1
.to_vec
(),
v1
.to_vec
())];
let
expected
=
vec!
[(
k2
.to_vec
(),
v2
.to_vec
()),
(
k1
.to_vec
(),
v1
.to_vec
())];
assert_eq!
(
prev_collect
(
iter
),
expected
);
assert_eq!
(
prev_collect
(
&
mut
iter
),
expected
);
iter
=
db
.iter
(
SeekKey
::
Key
(
b
"k0"
));
iter
.seek
(
SeekKey
::
Key
(
b
"k0"
));
assert
!
(
iter
.valid
());
assert
!
(
iter
.valid
());
iter
.seek
(
SeekKey
::
Key
(
b
"k1"
));
iter
.seek
(
SeekKey
::
Key
(
b
"k1"
));
assert
!
(
iter
.valid
());
assert
!
(
iter
.valid
());
...
...
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