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
14dc3d00
Commit
14dc3d00
authored
Jul 12, 2015
by
Tyler Neely
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #11 from dgrnbrg/master
Add support for WriteBatch
parents
57f490d8
a0f3ad3a
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
127 additions
and
24 deletions
+127
-24
ffi.rs
src/ffi.rs
+4
-0
lib.rs
src/lib.rs
+2
-0
main.rs
src/main.rs
+2
-2
merge_operator.rs
src/merge_operator.rs
+1
-1
rocksdb.rs
src/rocksdb.rs
+118
-21
No files found.
src/ffi.rs
View file @
14dc3d00
...
@@ -272,6 +272,10 @@ extern {
...
@@ -272,6 +272,10 @@ extern {
pub
fn
rocksdb_iter_get_error
(
iter
:
RocksDBIterator
,
pub
fn
rocksdb_iter_get_error
(
iter
:
RocksDBIterator
,
err
:
*
const
*
const
u8
);
err
:
*
const
*
const
u8
);
// Write batch
// Write batch
pub
fn
rocksdb_write
(
db
:
RocksDBInstance
,
writeopts
:
RocksDBWriteOptions
,
batch
:
RocksDBWriteBatch
,
err
:
*
mut
i8
);
pub
fn
rocksdb_writebatch_create
()
->
RocksDBWriteBatch
;
pub
fn
rocksdb_writebatch_create
()
->
RocksDBWriteBatch
;
pub
fn
rocksdb_writebatch_create_from
(
rep
:
*
const
u8
,
pub
fn
rocksdb_writebatch_create_from
(
rep
:
*
const
u8
,
size
:
size_t
)
->
RocksDBWriteBatch
;
size
:
size_t
)
->
RocksDBWriteBatch
;
...
...
src/lib.rs
View file @
14dc3d00
...
@@ -34,6 +34,8 @@ pub use rocksdb::{
...
@@ -34,6 +34,8 @@ pub use rocksdb::{
RocksDB
,
RocksDB
,
RocksDBResult
,
RocksDBResult
,
RocksDBVector
,
RocksDBVector
,
WriteBatch
,
Writable
,
};
};
pub
use
rocksdb_options
::{
pub
use
rocksdb_options
::{
RocksDBOptions
,
RocksDBOptions
,
...
...
src/main.rs
View file @
14dc3d00
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
extern
crate
rocksdb
;
extern
crate
rocksdb
;
extern
crate
test
;
extern
crate
test
;
use
rocksdb
::{
RocksDBOptions
,
RocksDB
,
MergeOperands
,
new_bloom_filter
};
use
rocksdb
::{
RocksDBOptions
,
RocksDB
,
MergeOperands
,
new_bloom_filter
,
Writable
};
use
rocksdb
::
RocksDBCompactionStyle
::
RocksDBUniversalCompaction
;
use
rocksdb
::
RocksDBCompactionStyle
::
RocksDBUniversalCompaction
;
fn
main
()
{
fn
main
()
{
...
@@ -88,7 +88,7 @@ mod tests {
...
@@ -88,7 +88,7 @@ mod tests {
use
test
::
Bencher
;
use
test
::
Bencher
;
use
std
::
thread
::
sleep_ms
;
use
std
::
thread
::
sleep_ms
;
use
rocksdb
::{
RocksDBOptions
,
RocksDB
,
MergeOperands
,
new_bloom_filter
};
use
rocksdb
::{
RocksDBOptions
,
RocksDB
,
MergeOperands
,
new_bloom_filter
,
Writable
};
use
rocksdb
::
RocksDBCompactionStyle
::
RocksDBUniversalCompaction
;
use
rocksdb
::
RocksDBCompactionStyle
::
RocksDBUniversalCompaction
;
fn
tuned_for_somebody_elses_disk
()
->
RocksDB
{
fn
tuned_for_somebody_elses_disk
()
->
RocksDB
{
...
...
src/merge_operator.rs
View file @
14dc3d00
...
@@ -21,7 +21,7 @@ use std::ptr;
...
@@ -21,7 +21,7 @@ use std::ptr;
use
std
::
slice
;
use
std
::
slice
;
use
rocksdb_options
::{
RocksDBOptions
};
use
rocksdb_options
::{
RocksDBOptions
};
use
rocksdb
::{
RocksDB
,
RocksDBResult
,
RocksDBVector
};
use
rocksdb
::{
RocksDB
,
RocksDBResult
,
RocksDBVector
,
Writable
};
pub
struct
MergeOperatorCallback
{
pub
struct
MergeOperatorCallback
{
pub
name
:
CString
,
pub
name
:
CString
,
...
...
src/rocksdb.rs
View file @
14dc3d00
...
@@ -32,6 +32,17 @@ pub struct RocksDB {
...
@@ -32,6 +32,17 @@ pub struct RocksDB {
inner
:
rocksdb_ffi
::
RocksDBInstance
,
inner
:
rocksdb_ffi
::
RocksDBInstance
,
}
}
pub
struct
WriteBatch
{
inner
:
rocksdb_ffi
::
RocksDBWriteBatch
}
// This is for the RocksDB and write batches to share the same API
pub
trait
Writable
{
fn
put
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
(),
&
str
>
;
fn
merge
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
(),
&
str
>
;
fn
delete
(
&
self
,
key
:
&
[
u8
])
->
Result
<
(),
&
str
>
;
}
fn
error_message
<
'a
>
(
ptr
:
*
const
i8
)
->
&
'a
str
{
fn
error_message
<
'a
>
(
ptr
:
*
const
i8
)
->
&
'a
str
{
unsafe
{
unsafe
{
return
from_utf8
(
CStr
::
from_ptr
(
ptr
)
.to_bytes
())
.unwrap
();
return
from_utf8
(
CStr
::
from_ptr
(
ptr
)
.to_bytes
())
.unwrap
();
...
@@ -117,27 +128,11 @@ impl RocksDB {
...
@@ -117,27 +128,11 @@ impl RocksDB {
}
}
}
}
pub
fn
put
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
pub
fn
write
(
&
self
,
batch
:
WriteBatch
)
->
Result
<
(),
&
str
>
{
unsafe
{
let
writeopts
=
rocksdb_ffi
::
rocksdb_writeoptions_create
();
let
err
=
0
as
*
mut
i8
;
rocksdb_ffi
::
rocksdb_put
(
self
.inner
,
writeopts
,
key
.as_ptr
(),
key
.len
()
as
size_t
,
value
.as_ptr
(),
value
.len
()
as
size_t
,
err
);
if
!
err
.is_null
()
{
return
Err
(
error_message
(
err
));
}
return
Ok
(())
}
}
pub
fn
merge
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
unsafe
{
unsafe
{
let
writeopts
=
rocksdb_ffi
::
rocksdb_writeoptions_create
();
let
writeopts
=
rocksdb_ffi
::
rocksdb_writeoptions_create
();
let
err
=
0
as
*
mut
i8
;
let
err
=
0
as
*
mut
i8
;
rocksdb_ffi
::
rocksdb_merge
(
self
.inner
,
writeopts
,
key
.as_ptr
(),
rocksdb_ffi
::
rocksdb_write
(
self
.inner
,
writeopts
,
batch
.inner
,
err
);
key
.len
()
as
size_t
,
value
.as_ptr
(),
value
.len
()
as
size_t
,
err
);
if
!
err
.is_null
()
{
if
!
err
.is_null
()
{
return
Err
(
error_message
(
err
));
return
Err
(
error_message
(
err
));
}
}
...
@@ -172,7 +167,41 @@ impl RocksDB {
...
@@ -172,7 +167,41 @@ impl RocksDB {
}
}
}
}
pub
fn
delete
(
&
self
,
key
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
pub
fn
close
(
&
self
)
{
unsafe
{
rocksdb_ffi
::
rocksdb_close
(
self
.inner
);
}
}
}
impl
Writable
for
RocksDB
{
fn
put
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
unsafe
{
let
writeopts
=
rocksdb_ffi
::
rocksdb_writeoptions_create
();
let
err
=
0
as
*
mut
i8
;
rocksdb_ffi
::
rocksdb_put
(
self
.inner
,
writeopts
,
key
.as_ptr
(),
key
.len
()
as
size_t
,
value
.as_ptr
(),
value
.len
()
as
size_t
,
err
);
if
!
err
.is_null
()
{
return
Err
(
error_message
(
err
));
}
return
Ok
(())
}
}
fn
merge
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
unsafe
{
let
writeopts
=
rocksdb_ffi
::
rocksdb_writeoptions_create
();
let
err
=
0
as
*
mut
i8
;
rocksdb_ffi
::
rocksdb_merge
(
self
.inner
,
writeopts
,
key
.as_ptr
(),
key
.len
()
as
size_t
,
value
.as_ptr
(),
value
.len
()
as
size_t
,
err
);
if
!
err
.is_null
()
{
return
Err
(
error_message
(
err
));
}
return
Ok
(())
}
}
fn
delete
(
&
self
,
key
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
unsafe
{
unsafe
{
let
writeopts
=
rocksdb_ffi
::
rocksdb_writeoptions_create
();
let
writeopts
=
rocksdb_ffi
::
rocksdb_writeoptions_create
();
let
err
=
0
as
*
mut
i8
;
let
err
=
0
as
*
mut
i8
;
...
@@ -184,9 +213,51 @@ impl RocksDB {
...
@@ -184,9 +213,51 @@ impl RocksDB {
return
Ok
(())
return
Ok
(())
}
}
}
}
}
pub
fn
close
(
&
self
)
{
impl
WriteBatch
{
unsafe
{
rocksdb_ffi
::
rocksdb_close
(
self
.inner
);
}
pub
fn
new
()
->
WriteBatch
{
WriteBatch
{
inner
:
unsafe
{
rocksdb_ffi
::
rocksdb_writebatch_create
()
}
}
}
}
impl
Drop
for
WriteBatch
{
fn
drop
(
&
mut
self
)
{
unsafe
{
rocksdb_ffi
::
rocksdb_writebatch_destroy
(
self
.inner
)
}
}
}
impl
Writable
for
WriteBatch
{
fn
put
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
unsafe
{
rocksdb_ffi
::
rocksdb_writebatch_put
(
self
.inner
,
key
.as_ptr
(),
key
.len
()
as
size_t
,
value
.as_ptr
(),
value
.len
()
as
size_t
);
return
Ok
(())
}
}
fn
merge
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
unsafe
{
rocksdb_ffi
::
rocksdb_writebatch_merge
(
self
.inner
,
key
.as_ptr
(),
key
.len
()
as
size_t
,
value
.as_ptr
(),
value
.len
()
as
size_t
);
return
Ok
(())
}
}
fn
delete
(
&
self
,
key
:
&
[
u8
])
->
Result
<
(),
&
str
>
{
unsafe
{
rocksdb_ffi
::
rocksdb_writebatch_delete
(
self
.inner
,
key
.as_ptr
(),
key
.len
()
as
size_t
);
return
Ok
(())
}
}
}
}
}
...
@@ -310,3 +381,29 @@ fn external() {
...
@@ -310,3 +381,29 @@ fn external() {
let
opts
=
RocksDBOptions
::
new
();
let
opts
=
RocksDBOptions
::
new
();
assert
!
(
RocksDB
::
destroy
(
opts
,
path
)
.is_ok
());
assert
!
(
RocksDB
::
destroy
(
opts
,
path
)
.is_ok
());
}
}
#[test]
fn
writebatch_works
()
{
let
path
=
"_rust_rocksdb_writebacktest"
;
let
db
=
RocksDB
::
open_default
(
path
)
.unwrap
();
{
// test put
let
batch
=
WriteBatch
::
new
();
assert
!
(
db
.get
(
b
"k1"
)
.is_none
());
batch
.put
(
b
"k1"
,
b
"v1111"
);
assert
!
(
db
.get
(
b
"k1"
)
.is_none
());
let
p
=
db
.write
(
batch
);
assert
!
(
p
.is_ok
());
let
r
:
RocksDBResult
<
RocksDBVector
,
&
str
>
=
db
.get
(
b
"k1"
);
assert
!
(
r
.unwrap
()
.to_utf8
()
.unwrap
()
==
"v1111"
);
}
{
// test delete
let
batch
=
WriteBatch
::
new
();
batch
.delete
(
b
"k1"
);
let
p
=
db
.write
(
batch
);
assert
!
(
p
.is_ok
());
assert
!
(
db
.get
(
b
"k1"
)
.is_none
());
}
db
.close
();
let
opts
=
RocksDBOptions
::
new
();
assert
!
(
RocksDB
::
destroy
(
opts
,
path
)
.is_ok
());
}
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