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
f340e74c
Commit
f340e74c
authored
Nov 26, 2014
by
Tyler Neely
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add cargo build for rocksdb 3.8.1, no more LD_PRELOAD
parent
d2d4a551
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
152 additions
and
53 deletions
+152
-53
Cargo.toml
Cargo.toml
+4
-0
Cargo.toml
rocksdb-sys/Cargo.toml
+13
-0
build.rs
rocksdb-sys/build.rs
+55
-0
lib.rs
rocksdb-sys/lib.rs
+12
-13
lib.rs
src/lib.rs
+3
-2
main.rs
src/main.rs
+6
-3
rocksdb.rs
src/rocksdb.rs
+59
-35
No files found.
Cargo.toml
View file @
f340e74c
...
@@ -3,3 +3,7 @@
...
@@ -3,3 +3,7 @@
name
=
"rocksdb"
name
=
"rocksdb"
version
=
"0.0.1"
version
=
"0.0.1"
authors
=
[
"Tyler Neely <t@jujit.su>"
]
authors
=
[
"Tyler Neely <t@jujit.su>"
]
[dependencies.rocksdb-sys]
path
=
"rocksdb-sys"
version
=
"*"
rocksdb-sys/Cargo.toml
0 → 100644
View file @
f340e74c
[package]
name
=
"rocksdb-sys"
version
=
"0.0.1"
authors
=
[]
links
=
"rocksdb"
build
=
"build.rs"
[build-dependencies.pkg-config]
git
=
"https://github.com/alexcrichton/pkg-config-rs"
[lib]
name
=
"rocksdb-sys"
path
=
"lib.rs"
rocksdb-sys/build.rs
0 → 100644
View file @
f340e74c
extern
crate
"pkg-config"
as
pkg_config
;
use
std
::
os
;
use
std
::
io
::{
mod
,
fs
,
Command
};
use
std
::
io
::
process
::
InheritFd
;
//TODO windows + osx support
fn
main
()
{
// Next, fall back and try to use pkg-config if its available.
match
pkg_config
::
find_library
(
"librocksdb"
)
{
Ok
(())
=>
return
,
Err
(
..
)
=>
{}
}
let
src
=
os
::
getcwd
()
.unwrap
();
let
dst
=
Path
::
new
(
os
::
getenv
(
"OUT_DIR"
)
.unwrap
());
let
_
=
fs
::
mkdir
(
&
dst
.join
(
"build"
),
io
::
USER_DIR
);
let
mut
config_opts
=
Vec
::
new
();
config_opts
.push
(
"--enable-static=yes"
.to_string
());
config_opts
.push
(
format!
(
"--prefix={}"
,
dst
.display
()));
config_opts
.push
(
"--disable-manual"
.to_string
());
println!
(
"cwd: {}"
,
src
.as_str
());
run
(
Command
::
new
(
make
())
.arg
(
"shared_lib"
)
.arg
(
format!
(
"-j{}"
,
os
::
getenv
(
"NUM_JOBS"
)
.unwrap
()))
.cwd
(
&
src
.join
(
"rocksdb"
)));
// Don't run `make install` because apparently it's a little buggy on mingw
// for windows.
fs
::
mkdir_recursive
(
&
dst
.join
(
"lib/pkgconfig"
),
io
::
USER_DIR
)
.unwrap
();
fs
::
rename
(
&
src
.join
(
"rocksdb/librocksdb.so"
),
&
dst
.join
(
"lib/librocksdb.so"
))
.unwrap
();
println!
(
"cargo:rustc-flags=-L {}/lib -l rocksdb:dylib"
,
dst
.display
());
println!
(
"cargo:root={}"
,
dst
.display
());
println!
(
"cargo:include={}/include"
,
src
.join
(
"rocksdb"
)
.display
());
}
fn
run
(
cmd
:
&
mut
Command
)
{
println!
(
"running: {}"
,
cmd
);
assert
!
(
cmd
.stdout
(
InheritFd
(
1
))
.stderr
(
InheritFd
(
2
))
.status
()
.unwrap
()
.success
());
}
fn
make
()
->
&
'static
str
{
if
cfg!
(
target_os
=
"freebsd"
)
{
"gmake"
}
else
{
"make"
}
}
src/ffi
.rs
→
rocksdb-sys/lib
.rs
View file @
f340e74c
extern
crate
libc
;
extern
crate
libc
;
use
self
::
libc
::{
c_int
,
c_void
,
size_t
};
use
self
::
libc
::{
c_int
,
c_void
,
size_t
};
use
std
::
io
::{
IoResult
,
IoError
};
use
std
::
c_vec
::
CVec
;
use
std
::
c_str
::
CString
;
#[repr(C)]
#[repr(C)]
pub
struct
RocksdbOptions
(
pub
*
const
c_void
);
pub
struct
RocksdbOptions
(
pub
*
const
c_void
);
...
@@ -19,9 +16,8 @@ pub struct RocksdbMergeOperator(pub *const c_void);
...
@@ -19,9 +16,8 @@ pub struct RocksdbMergeOperator(pub *const c_void);
#[repr(C)]
#[repr(C)]
pub
struct
RocksdbFilterPolicy
(
pub
*
const
c_void
);
pub
struct
RocksdbFilterPolicy
(
pub
*
const
c_void
);
#[allow(dead_code)]
#[repr(C)]
#[repr(C)]
enum
RocksdbCompressionType
{
pub
enum
RocksdbCompressionType
{
RocksdbNoCompression
=
0
,
RocksdbNoCompression
=
0
,
RocksdbSnappyCompression
=
1
,
RocksdbSnappyCompression
=
1
,
RocksdbZlibCompression
=
2
,
RocksdbZlibCompression
=
2
,
...
@@ -30,22 +26,19 @@ enum RocksdbCompressionType {
...
@@ -30,22 +26,19 @@ enum RocksdbCompressionType {
RocksdbLz4hcCompression
=
5
RocksdbLz4hcCompression
=
5
}
}
#[allow(dead_code)]
#[repr(C)]
#[repr(C)]
enum
RocksdbCompactionStyle
{
pub
enum
RocksdbCompactionStyle
{
RocksdbLevelCompaction
=
0
,
RocksdbLevelCompaction
=
0
,
RocksdbUniversalCompaction
=
1
,
RocksdbUniversalCompaction
=
1
,
RocksdbFifoCompaction
=
2
RocksdbFifoCompaction
=
2
}
}
#[allow(dead_code)]
#[repr(C)]
#[repr(C)]
enum
RocksdbUniversalCompactionStyle
{
pub
enum
RocksdbUniversalCompactionStyle
{
rocksdb_similar_size_compaction_stop_style
=
0
,
rocksdb_similar_size_compaction_stop_style
=
0
,
rocksdb_total_size_compaction_stop_style
=
1
rocksdb_total_size_compaction_stop_style
=
1
}
}
#[allow(dead_code)]
#[link(name
=
"rocksdb"
)]
#[link(name
=
"rocksdb"
)]
extern
{
extern
{
pub
fn
rocksdb_options_create
()
->
RocksdbOptions
;
pub
fn
rocksdb_options_create
()
->
RocksdbOptions
;
...
@@ -114,8 +107,15 @@ extern {
...
@@ -114,8 +107,15 @@ extern {
k
:
*
const
u8
,
kLen
:
size_t
,
k
:
*
const
u8
,
kLen
:
size_t
,
valLen
:
*
const
size_t
,
err
:
*
mut
i8
)
->
*
mut
u8
;
valLen
:
*
const
size_t
,
err
:
*
mut
i8
)
->
*
mut
u8
;
pub
fn
rocksdb_close
(
db
:
RocksdbInstance
);
pub
fn
rocksdb_close
(
db
:
RocksdbInstance
);
pub
fn
rocksdb_destroy_db
(
options
:
RocksdbOptions
,
path
:
*
const
i8
,
err
:
*
mut
i8
);
pub
fn
rocksdb_repair_db
(
options
:
RocksdbOptions
,
path
:
*
const
i8
,
err
:
*
mut
i8
);
}
}
#[allow(dead_code)]
#[test]
#[test]
fn
internal
()
{
fn
internal
()
{
unsafe
{
unsafe
{
...
@@ -127,11 +127,10 @@ fn internal() {
...
@@ -127,11 +127,10 @@ fn internal() {
rocksdb_options_optimize_level_style_compaction
(
opts
,
0
);
rocksdb_options_optimize_level_style_compaction
(
opts
,
0
);
rocksdb_options_set_create_if_missing
(
opts
,
1
);
rocksdb_options_set_create_if_missing
(
opts
,
1
);
let
rustpath
=
"
datadir
"
;
let
rustpath
=
"
internaltest
"
;
let
cpath
=
rustpath
.to_c_str
();
let
cpath
=
rustpath
.to_c_str
();
let
cpath_ptr
=
cpath
.as_ptr
();
let
cpath_ptr
=
cpath
.as_ptr
();
//TODO this will SIGSEGV
let
err
=
0
as
*
mut
i8
;
let
err
=
0
as
*
mut
i8
;
let
db
=
rocksdb_open
(
opts
,
cpath_ptr
,
err
);
let
db
=
rocksdb_open
(
opts
,
cpath_ptr
,
err
);
assert
!
(
err
.is_null
());
assert
!
(
err
.is_null
());
...
@@ -153,7 +152,7 @@ fn internal() {
...
@@ -153,7 +152,7 @@ fn internal() {
assert
!
(
read_opts_ptr
.is_not_null
());
assert
!
(
read_opts_ptr
.is_not_null
());
libc
::
free
(
err
as
*
mut
c_void
);
libc
::
free
(
err
as
*
mut
c_void
);
let
mut
val_len
:
size_t
=
0
;
let
val_len
:
size_t
=
0
;
let
val_len_ptr
=
&
val_len
as
*
const
size_t
;
let
val_len_ptr
=
&
val_len
as
*
const
size_t
;
rocksdb_get
(
db
,
readopts
,
key
.as_ptr
(),
4
,
val_len_ptr
,
err
);
rocksdb_get
(
db
,
readopts
,
key
.as_ptr
(),
4
,
val_len_ptr
,
err
);
assert
!
(
err
.is_null
());
assert
!
(
err
.is_null
());
...
...
src/lib.rs
View file @
f340e74c
#
!
[
crate_id
=
"rocksdb"
]
#
!
[
crate_id
=
"rocksdb"
]
#
!
[
crate_type
=
"lib"
]
#
!
[
crate_type
=
"lib"
]
#
!
[
feature
(
globs
)]
#
!
[
allow
(
dead_code
)]
extern
crate
"rocksdb-sys"
as
rocksdb_ffi
;
pub
use
rocksdb
::{
pub
use
rocksdb
::{
open
,
open
,
...
@@ -8,4 +10,3 @@ pub use rocksdb::{
...
@@ -8,4 +10,3 @@ pub use rocksdb::{
RocksdbResult
,
RocksdbResult
,
};
};
pub
mod
rocksdb
;
pub
mod
rocksdb
;
mod
ffi
;
src/main.rs
View file @
f340e74c
...
@@ -3,13 +3,15 @@ extern crate test;
...
@@ -3,13 +3,15 @@ extern crate test;
use
rocksdb
::
open
;
use
rocksdb
::
open
;
use
test
::
Bencher
;
use
test
::
Bencher
;
#[allow(dead_code)]
fn
main
()
{
fn
main
()
{
let
db
=
open
(
"testdb"
.to_string
(),
true
)
.unwrap
();
let
db
=
open
(
"testdb"
.to_string
(),
true
)
.unwrap
();
db
.put
(
b
"hey"
,
b
"v1111"
);
assert
!
(
db
.put
(
b
"hey"
,
b
"v1111"
)
.is_ok
()
);
db
.get
(
b
"hey"
)
.map
(|
v
|
{
println!
(
"value: {}"
,
v
.as_slice
());
});
db
.get
(
b
"hey"
)
.map
(|
raw
|
{
std
::
str
::
from_utf8
(
raw
.as_slice
())
.map
(|
v
|
{
println!
(
"value: {}"
,
v
);
})
});
db
.close
();
db
.close
();
}
}
#[allow(dead_code)]
#[bench]
#[bench]
fn
writes
(
b
:
&
mut
Bencher
)
{
fn
writes
(
b
:
&
mut
Bencher
)
{
let
db
=
open
(
"testdb"
.to_string
(),
true
)
.unwrap
();
let
db
=
open
(
"testdb"
.to_string
(),
true
)
.unwrap
();
...
@@ -21,7 +23,8 @@ fn writes(b: &mut Bencher) {
...
@@ -21,7 +23,8 @@ fn writes(b: &mut Bencher) {
db
.close
();
db
.close
();
}
}
#[bbench]
#[allow(dead_code)]
#[bench]
fn
reads
(
b
:
&
mut
Bencher
)
{
fn
reads
(
b
:
&
mut
Bencher
)
{
let
db
=
open
(
"testdb"
.to_string
(),
true
)
.unwrap
();
let
db
=
open
(
"testdb"
.to_string
(),
true
)
.unwrap
();
let
mut
i
=
0
as
u64
;
let
mut
i
=
0
as
u64
;
...
...
src/rocksdb.rs
View file @
f340e74c
extern
crate
libc
;
extern
crate
libc
;
use
self
::
libc
::{
c_
int
,
c_
void
,
size_t
};
use
self
::
libc
::{
c_void
,
size_t
};
use
std
::
io
::{
Io
Result
,
Io
Error
};
use
std
::
io
::{
IoError
};
use
std
::
c_vec
::
CVec
;
use
std
::
c_vec
::
CVec
;
use
std
::
c_str
::
CString
;
use
std
::
c_str
::
CString
;
use
ffi
;
use
rocksdb_
ffi
;
// TODO learn more about lifetimes and determine if it's appropriate to keep
// TODO learn more about lifetimes and determine if it's appropriate to keep
// inner on the stack, instead.
// inner on the stack, instead.
...
@@ -15,12 +15,13 @@ pub struct RocksdbVector {
...
@@ -15,12 +15,13 @@ pub struct RocksdbVector {
impl
RocksdbVector
{
impl
RocksdbVector
{
pub
fn
from_c
(
val
:
*
mut
u8
,
val_len
:
size_t
)
->
RocksdbVector
{
pub
fn
from_c
(
val
:
*
mut
u8
,
val_len
:
size_t
)
->
RocksdbVector
{
unsafe
{
unsafe
{
RocksdbVector
{
RocksdbVector
{
inner
:
inner
:
box
CVec
::
new_with_dtor
(
val
,
val_len
as
uint
,
box
CVec
::
new_with_dtor
(
val
,
val_len
as
uint
,
proc
(){
proc
(){
libc
::
free
(
val
as
*
mut
c_void
);
libc
::
free
(
val
as
*
mut
c_void
);
})}
})
}
}
}
}
}
...
@@ -29,7 +30,8 @@ impl RocksdbVector {
...
@@ -29,7 +30,8 @@ impl RocksdbVector {
}
}
}
}
// RocksdbResult exists because of the inherent difference between
// an operational failure and the absence of a possible result.
#[deriving(Clone,
PartialEq,
PartialOrd,
Eq,
Ord,
Show)]
#[deriving(Clone,
PartialEq,
PartialOrd,
Eq,
Ord,
Show)]
pub
enum
RocksdbResult
<
T
,
E
>
{
pub
enum
RocksdbResult
<
T
,
E
>
{
Some
(
T
),
Some
(
T
),
...
@@ -37,6 +39,27 @@ pub enum RocksdbResult<T, E> {
...
@@ -37,6 +39,27 @@ pub enum RocksdbResult<T, E> {
Error
(
E
),
Error
(
E
),
}
}
/*
impl <E> RocksdbResult<Box<CVec<u8>>, E> {
pub fn from_c(val: *mut u8, val_len: size_t) -> RocksdbResult<Box<CVec<u8>>, E> {
unsafe {
RocksdbResult::Some(
box CVec::new_with_dtor(val, val_len as uint,
proc(){
libc::free(val as *mut c_void);
}))
}
}
pub fn as_slice<'a>(self) -> Option<&'a [u8]> {
match self {
RocksdbResult::Some(x) => Some(x.as_slice()),
RocksdbResult::None => None,
RocksdbResult::Error(e) => None,
}
}
}
*/
impl
<
T
,
E
>
RocksdbResult
<
T
,
E
>
{
impl
<
T
,
E
>
RocksdbResult
<
T
,
E
>
{
#[unstable
=
"waiting for unboxed closures"
]
#[unstable
=
"waiting for unboxed closures"
]
pub
fn
map
<
U
>
(
self
,
f
:
|
T
|
->
U
)
->
RocksdbResult
<
U
,
E
>
{
pub
fn
map
<
U
>
(
self
,
f
:
|
T
|
->
U
)
->
RocksdbResult
<
U
,
E
>
{
...
@@ -70,38 +93,37 @@ impl <T,E> RocksdbResult<T,E> {
...
@@ -70,38 +93,37 @@ impl <T,E> RocksdbResult<T,E> {
pub
fn
is_some
(
self
)
->
bool
{
pub
fn
is_some
(
self
)
->
bool
{
match
self
{
match
self
{
RocksdbResult
::
Some
(
T
)
=>
true
,
RocksdbResult
::
Some
(
_
)
=>
true
,
RocksdbResult
::
None
=>
false
,
RocksdbResult
::
None
=>
false
,
RocksdbResult
::
Error
(
E
)
=>
false
,
RocksdbResult
::
Error
(
_
)
=>
false
,
}
}
}
}
pub
fn
is_none
(
self
)
->
bool
{
pub
fn
is_none
(
self
)
->
bool
{
match
self
{
match
self
{
RocksdbResult
::
Some
(
T
)
=>
false
,
RocksdbResult
::
Some
(
_
)
=>
false
,
RocksdbResult
::
None
=>
true
,
RocksdbResult
::
None
=>
true
,
RocksdbResult
::
Error
(
E
)
=>
false
,
RocksdbResult
::
Error
(
_
)
=>
false
,
}
}
}
}
pub
fn
is_error
(
self
)
->
bool
{
pub
fn
is_error
(
self
)
->
bool
{
match
self
{
match
self
{
RocksdbResult
::
Some
(
T
)
=>
false
,
RocksdbResult
::
Some
(
_
)
=>
false
,
RocksdbResult
::
None
=>
false
,
RocksdbResult
::
None
=>
false
,
RocksdbResult
::
Error
(
E
)
=>
true
,
RocksdbResult
::
Error
(
_
)
=>
true
,
}
}
}
}
}
}
pub
struct
Rocksdb
{
pub
struct
Rocksdb
{
inner
:
ffi
::
RocksdbInstance
,
inner
:
rocksdb_ffi
::
RocksdbInstance
,
path
:
String
,
}
}
impl
Rocksdb
{
impl
Rocksdb
{
pub
fn
put
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
bool
,
String
>
{
pub
fn
put
(
&
self
,
key
:
&
[
u8
],
value
:
&
[
u8
])
->
Result
<
bool
,
String
>
{
unsafe
{
unsafe
{
let
writeopts
=
ffi
::
rocksdb_writeoptions_create
();
let
writeopts
=
rocksdb_
ffi
::
rocksdb_writeoptions_create
();
let
err
=
0
as
*
mut
i8
;
let
err
=
0
as
*
mut
i8
;
ffi
::
rocksdb_put
(
self
.inner
,
writeopts
,
key
.as_ptr
(),
rocksdb_
ffi
::
rocksdb_put
(
self
.inner
,
writeopts
,
key
.as_ptr
(),
key
.len
()
as
size_t
,
value
.as_ptr
(),
key
.len
()
as
size_t
,
value
.as_ptr
(),
value
.len
()
as
size_t
,
err
);
value
.len
()
as
size_t
,
err
);
if
err
.is_not_null
()
{
if
err
.is_not_null
()
{
...
@@ -112,7 +134,7 @@ impl Rocksdb {
...
@@ -112,7 +134,7 @@ impl Rocksdb {
None
=>
{
None
=>
{
let
ie
=
IoError
::
last_error
();
let
ie
=
IoError
::
last_error
();
return
Err
(
format!
(
return
Err
(
format!
(
"ERROR: desc:{}, details:{}"
,
"ERROR: desc:{}, details:{}"
,
ie
.desc
,
ie
.desc
,
ie
.detail
.unwrap_or_else
(
ie
.detail
.unwrap_or_else
(
||
{
"none provided by OS"
.to_string
()})))
||
{
"none provided by OS"
.to_string
()})))
...
@@ -125,8 +147,8 @@ impl Rocksdb {
...
@@ -125,8 +147,8 @@ impl Rocksdb {
pub
fn
get
(
&
self
,
key
:
&
[
u8
])
->
RocksdbResult
<
RocksdbVector
,
String
>
{
pub
fn
get
(
&
self
,
key
:
&
[
u8
])
->
RocksdbResult
<
RocksdbVector
,
String
>
{
unsafe
{
unsafe
{
let
readopts
=
ffi
::
rocksdb_readoptions_create
();
let
readopts
=
rocksdb_
ffi
::
rocksdb_readoptions_create
();
let
ffi
::
RocksdbReadOptions
(
read_opts_ptr
)
=
readopts
;
let
rocksdb_
ffi
::
RocksdbReadOptions
(
read_opts_ptr
)
=
readopts
;
if
read_opts_ptr
.is_null
()
{
if
read_opts_ptr
.is_null
()
{
return
RocksdbResult
::
Error
(
"Unable to create rocksdb read
\
return
RocksdbResult
::
Error
(
"Unable to create rocksdb read
\
options. This is a fairly trivial call, and its failure
\
options. This is a fairly trivial call, and its failure
\
...
@@ -137,7 +159,7 @@ impl Rocksdb {
...
@@ -137,7 +159,7 @@ impl Rocksdb {
let
val_len
:
size_t
=
0
;
let
val_len
:
size_t
=
0
;
let
val_len_ptr
=
&
val_len
as
*
const
size_t
;
let
val_len_ptr
=
&
val_len
as
*
const
size_t
;
let
err
=
0
as
*
mut
i8
;
let
err
=
0
as
*
mut
i8
;
let
val
=
ffi
::
rocksdb_get
(
self
.inner
,
readopts
,
key
.as_ptr
(),
let
val
=
rocksdb_
ffi
::
rocksdb_get
(
self
.inner
,
readopts
,
key
.as_ptr
(),
key
.len
()
as
size_t
,
val_len_ptr
,
err
);
key
.len
()
as
size_t
,
val_len_ptr
,
err
);
if
err
.is_not_null
()
{
if
err
.is_not_null
()
{
let
cs
=
CString
::
new
(
err
as
*
const
i8
,
true
);
let
cs
=
CString
::
new
(
err
as
*
const
i8
,
true
);
...
@@ -160,33 +182,33 @@ impl Rocksdb {
...
@@ -160,33 +182,33 @@ impl Rocksdb {
}
}
pub
fn
close
(
&
self
)
{
pub
fn
close
(
&
self
)
{
unsafe
{
ffi
::
rocksdb_close
(
self
.inner
);
}
unsafe
{
rocksdb_
ffi
::
rocksdb_close
(
self
.inner
);
}
}
}
}
}
pub
fn
open
(
path
:
String
,
create_if_missing
:
bool
)
->
Result
<
Rocksdb
,
String
>
{
pub
fn
open
(
path
:
String
,
create_if_missing
:
bool
)
->
Result
<
Rocksdb
,
String
>
{
unsafe
{
unsafe
{
let
opts
=
ffi
::
rocksdb_options_create
();
let
opts
=
rocksdb_
ffi
::
rocksdb_options_create
();
let
ffi
::
RocksdbOptions
(
opt_ptr
)
=
opts
;
let
rocksdb_
ffi
::
RocksdbOptions
(
opt_ptr
)
=
opts
;
if
opt_ptr
.is_null
()
{
if
opt_ptr
.is_null
()
{
return
Err
(
"Could not create options"
.to_string
());
return
Err
(
"Could not create options"
.to_string
());
}
}
ffi
::
rocksdb_options_increase_parallelism
(
opts
,
2
);
//rocksdb_
ffi::rocksdb_options_increase_parallelism(opts, 2);
//ffi::rocksdb_options_optimize_level_style_compaction(opts, 0);
//
rocksdb_
ffi::rocksdb_options_optimize_level_style_compaction(opts, 0);
match
create_if_missing
{
match
create_if_missing
{
true
=>
ffi
::
rocksdb_options_set_create_if_missing
(
opts
,
1
),
true
=>
rocksdb_
ffi
::
rocksdb_options_set_create_if_missing
(
opts
,
1
),
false
=>
ffi
::
rocksdb_options_set_create_if_missing
(
opts
,
0
),
false
=>
rocksdb_
ffi
::
rocksdb_options_set_create_if_missing
(
opts
,
0
),
}
}
let
cpath
=
path
.to_c_str
();
let
cpath
=
path
.to_c_str
();
let
cpath_ptr
=
cpath
.as_ptr
();
let
cpath_ptr
=
cpath
.as_ptr
();
let
err
=
0
as
*
mut
i8
;
let
err
=
0
as
*
mut
i8
;
let
db
=
ffi
::
rocksdb_open
(
opts
,
cpath_ptr
,
err
);
let
db
=
rocksdb_ffi
::
rocksdb_open
(
opts
,
cpath_ptr
,
err
);
let
ffi
::
RocksdbInstance
(
db_ptr
)
=
db
;
let
rocksdb_
ffi
::
RocksdbInstance
(
db_ptr
)
=
db
;
if
err
.is_not_null
()
{
if
err
.is_not_null
()
{
let
cs
=
CString
::
new
(
err
as
*
const
i8
,
true
);
let
cs
=
CString
::
new
(
err
as
*
const
i8
,
true
);
match
cs
.as_str
()
{
match
cs
.as_str
()
{
...
@@ -199,14 +221,16 @@ pub fn open(path: String, create_if_missing: bool) -> Result<Rocksdb, String> {
...
@@ -199,14 +221,16 @@ pub fn open(path: String, create_if_missing: bool) -> Result<Rocksdb, String> {
if
db_ptr
.is_null
()
{
if
db_ptr
.is_null
()
{
return
Err
(
"Could not initialize database."
.to_string
());
return
Err
(
"Could not initialize database."
.to_string
());
}
}
Ok
(
Rocksdb
{
inner
:
db
,
path
:
path
})
Ok
(
Rocksdb
{
inner
:
db
})
}
}
}
}
#[allow(dead_code)]
#[test]
#[test]
fn
external
()
{
fn
external
()
{
let
db
=
open
(
"testdb"
.to_string
(),
true
)
.unwrap
();
let
db
=
open
(
"externaltest"
.to_string
(),
true
)
.unwrap
();
db
.put
(
b
"k1"
,
b
"v1111"
);
let
p
=
db
.put
(
b
"k1"
,
b
"v1111"
);
assert
!
(
p
.is_ok
());
let
r
:
RocksdbResult
<
RocksdbVector
,
String
>
=
db
.get
(
b
"k1"
);
let
r
:
RocksdbResult
<
RocksdbVector
,
String
>
=
db
.get
(
b
"k1"
);
//assert!(r.is_some());
//assert!(r.is_some());
r
.map
(|
v
|
{
assert
!
(
v
.as_slice
()
.len
()
==
5
);
}
);
r
.map
(|
v
|
{
assert
!
(
v
.as_slice
()
.len
()
==
5
);
}
);
...
...
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