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
ed089679
Commit
ed089679
authored
May 23, 2016
by
Jay
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor iterator (#12)
parent
1f605a95
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
67 additions
and
81 deletions
+67
-81
lib.rs
src/lib.rs
+1
-2
main.rs
src/main.rs
+7
-7
rocksdb.rs
src/rocksdb.rs
+0
-0
rocksdb_options.rs
src/rocksdb_options.rs
+2
-3
test_iterator.rs
test/test_iterator.rs
+57
-69
No files found.
src/lib.rs
View file @
ed089679
...
@@ -27,7 +27,6 @@ pub mod comparator;
...
@@ -27,7 +27,6 @@ pub mod comparator;
pub
use
librocksdb_sys
::{
DBCompactionStyle
,
DBComparator
,
DBCompressionType
,
pub
use
librocksdb_sys
::{
DBCompactionStyle
,
DBComparator
,
DBCompressionType
,
new_bloom_filter
,
self
as
rocksdb_ffi
};
new_bloom_filter
,
self
as
rocksdb_ffi
};
pub
use
rocksdb
::{
DB
,
DBIterator
,
DBVector
,
Direction
,
IteratorMode
,
Kv
,
pub
use
rocksdb
::{
DB
,
DBIterator
,
DBVector
,
Kv
,
SeekKey
,
Writable
,
WriteBatch
};
Writable
,
WriteBatch
};
pub
use
rocksdb_options
::{
BlockBasedOptions
,
Options
,
WriteOptions
};
pub
use
rocksdb_options
::{
BlockBasedOptions
,
Options
,
WriteOptions
};
pub
use
merge_operator
::
MergeOperands
;
pub
use
merge_operator
::
MergeOperands
;
src/main.rs
View file @
ed089679
...
@@ -129,13 +129,13 @@ fn main() {
...
@@ -129,13 +129,13 @@ fn main() {
db
.merge
(
b
"k1"
,
b
"efg"
);
db
.merge
(
b
"k1"
,
b
"efg"
);
db
.merge
(
b
"k1"
,
b
"h"
);
db
.merge
(
b
"k1"
,
b
"h"
);
db
.get
(
b
"k1"
)
db
.get
(
b
"k1"
)
.map
(|
value
|
{
.map
(|
value
|
{
match
value
.to_utf8
()
{
match
value
.to_utf8
()
{
Some
(
v
)
=>
(),
Some
(
v
)
=>
(),
None
=>
panic!
(
"value corrupted"
),
None
=>
panic!
(
"value corrupted"
),
}
}
})
})
.or_else
(|
e
|
panic!
(
"error retrieving value: {}"
,
e
));
.or_else
(|
e
|
panic!
(
"error retrieving value: {}"
,
e
));
db
.delete
(
b
"k1"
);
db
.delete
(
b
"k1"
);
}
}
}
}
...
...
src/rocksdb.rs
View file @
ed089679
This diff is collapsed.
Click to expand it.
src/rocksdb_options.rs
View file @
ed089679
...
@@ -60,9 +60,8 @@ impl Drop for WriteOptions {
...
@@ -60,9 +60,8 @@ impl Drop for WriteOptions {
impl
Default
for
BlockBasedOptions
{
impl
Default
for
BlockBasedOptions
{
fn
default
()
->
BlockBasedOptions
{
fn
default
()
->
BlockBasedOptions
{
let
block_opts
=
unsafe
{
let
block_opts
=
rocksdb_ffi
::
rocksdb_block_based_options_create
()
unsafe
{
rocksdb_ffi
::
rocksdb_block_based_options_create
()
};
};
let
rocksdb_ffi
::
DBBlockBasedTableOptions
(
opt_ptr
)
=
block_opts
;
let
rocksdb_ffi
::
DBBlockBasedTableOptions
(
opt_ptr
)
=
block_opts
;
if
opt_ptr
.is_null
()
{
if
opt_ptr
.is_null
()
{
panic!
(
"Could not create rocksdb block based options"
.to_string
());
panic!
(
"Could not create rocksdb block based options"
.to_string
());
...
...
test/test_iterator.rs
View file @
ed089679
use
rocksdb
::{
DB
,
Direction
,
IteratorMode
,
Writable
,
Kv
};
use
rocksdb
::{
DB
,
Writable
,
SeekKey
,
DBIterator
,
Kv
};
use
tempdir
::
TempDir
;
use
tempdir
::
TempDir
;
fn
collect
<
'a
,
T
:
Iterator
<
Item
=
Kv
<
'a
>>>
(
iter
:
T
)
->
Vec
<
(
Vec
<
u8
>
,
Vec
<
u8
>
)
>
{
fn
prev_collect
<
'a
>
(
mut
iter
:
DBIterator
<
'a
>
)
->
Vec
<
Kv
>
{
iter
.map
(|(
k
,
v
)|
(
k
.to_vec
(),
v
.to_vec
()))
.collect
()
let
mut
buf
=
vec!
[];
while
iter
.valid
()
{
buf
.push
(
iter
.kv
()
.unwrap
());
iter
.prev
();
}
buf
}
}
#[test]
#[test]
...
@@ -28,96 +33,79 @@ pub fn test_iterator() {
...
@@ -28,96 +33,79 @@ 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
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
let
mut
iter
=
db
.iter
(
SeekKey
::
Start
);
assert_eq!
(
collect
(
iterator1
),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(
),
expected
);
// Test that it's idempotent
// Test that it's idempotent
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
iter
=
db
.iter
(
SeekKey
::
Start
);
assert_eq!
(
collect
(
iterator1
),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(),
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
collect
(
iterator1
),
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
collect
(
iterator1
),
expected
);
// Test it in reverse a few times
// Test it in reverse a few times
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
iter
=
db
.iter
(
SeekKey
::
End
);
let
mut
tmp_vec
=
collect
(
iterator1
);
let
mut
tmp_vec
=
prev_collect
(
iter
);
tmp_vec
.reverse
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
assert_eq!
(
tmp_vec
,
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
iter
=
db
.iter
(
SeekKey
::
End
);
let
mut
tmp_vec
=
collect
(
iterator1
);
let
mut
tmp_vec
=
prev_collect
(
iter
);
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
let
mut
tmp_vec
=
collect
(
iterator1
);
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
let
mut
tmp_vec
=
collect
(
iterator1
);
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
let
mut
tmp_vec
=
collect
(
iterator1
);
tmp_vec
.reverse
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
assert_eq!
(
tmp_vec
,
expected
);
// Try it forward again
// Try it forward again
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
iter
=
db
.iter
(
SeekKey
::
Start
);
assert_eq!
(
collect
(
iterator1
),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(
),
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
iter
=
db
.iter
(
SeekKey
::
Start
);
assert_eq!
(
collect
(
iterator1
),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(
),
expected
);
let
old_iterator
=
db
.iter
ator
(
IteratorMode
::
Start
);
let
old_iterator
=
db
.iter
(
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
()),
(
k2
.to_vec
(),
v2
.to_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!
(
collect
(
old_iterator
),
expected
);
assert_eq!
(
old_iterator
.collect
::
<
Vec
<
_
>>
(
),
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
iter
=
db
.iter
(
SeekKey
::
Start
);
assert_eq!
(
collect
(
iterator1
),
expected2
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(
),
expected2
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
From
(
b
"k2"
,
iter
=
db
.iter
(
SeekKey
::
Key
(
k2
));
Direction
::
Forward
));
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!
(
collect
(
iterator1
),
expected
);
assert_eq!
(
iter
.collect
::
<
Vec
<
_
>>
(
),
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
From
(
b
"k2"
,
iter
=
db
.iter
(
SeekKey
::
Key
(
k2
));
Direction
::
Reverse
));
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!
(
collect
(
iterator1
),
expected
);
assert_eq!
(
prev_collect
(
iter
),
expected
);
let
iterator1
=
db
.iterator
(
IteratorMode
::
From
(
b
"k0"
,
Direction
::
Forward
));
iter
=
db
.iter
(
SeekKey
::
Key
(
b
"k0"
));
assert
!
(
iterator1
.valid
());
assert
!
(
iter
.valid
());
let
iterator2
=
db
.iterator
(
IteratorMode
::
From
(
b
"k1"
,
Direction
::
Forward
));
iter
.seek
(
SeekKey
::
Key
(
b
"k1"
));
assert
!
(
iterator2
.valid
());
assert
!
(
iter
.valid
());
let
iterator3
=
db
.iterator
(
IteratorMode
::
From
(
b
"k11"
,
Direction
::
Forward
));
iter
.seek
(
SeekKey
::
Key
(
b
"k11"
));
assert
!
(
iterator3
.valid
());
assert
!
(
iter
.valid
());
let
iterator4
=
db
.iterator
(
IteratorMode
::
From
(
b
"k5"
,
Direction
::
Forward
));
iter
.seek
(
SeekKey
::
Key
(
b
"k5"
));
assert
!
(
!
iterator4
.valid
());
assert
!
(
!
iter
.valid
());
let
iterator5
=
db
.iterator
(
IteratorMode
::
From
(
b
"k0"
,
Direction
::
Reverse
));
iter
.seek
(
SeekKey
::
Key
(
b
"k0"
));
assert
!
(
iterator5
.valid
());
assert
!
(
iter
.valid
());
let
iterator6
=
db
.iterator
(
IteratorMode
::
From
(
b
"k1"
,
Direction
::
Reverse
));
iter
.seek
(
SeekKey
::
Key
(
b
"k1"
));
assert
!
(
iterator6
.valid
());
assert
!
(
iter
.valid
());
let
iterator7
=
db
.iterator
(
IteratorMode
::
From
(
b
"k11"
,
Direction
::
Reverse
));
iter
.seek
(
SeekKey
::
Key
(
b
"k11"
));
assert
!
(
iterator7
.valid
());
assert
!
(
iter
.valid
());
let
iterator8
=
db
.iterator
(
IteratorMode
::
From
(
b
"k5"
,
Direction
::
Reverse
));
iter
.seek
(
SeekKey
::
Key
(
b
"k5"
));
assert
!
(
!
iterator8
.valid
());
assert
!
(
!
iter
.valid
());
let
mut
iterator1
=
db
.iterator
(
IteratorMode
::
From
(
b
"k4"
,
Direction
::
Forward
));
iter
.seek
(
SeekKey
::
Key
(
b
"k4"
));
iterator1
.next
();
assert
!
(
iter
.valid
());
assert
!
(
iterator1
.valid
());
iter
.prev
();
iterator1
.next
();
assert
!
(
iter
.valid
());
assert
!
(
!
iterator1
.valid
());
iter
.next
();
assert
!
(
iter
.valid
());
iter
.next
();
assert
!
(
!
iter
.valid
());
// Once iterator is invalid, it can't be reverted.
iter
.prev
();
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