ckb_rocksdb/ops/
setoptions.rs1use crate::{handle::Handle, ColumnFamily, Error};
2use libc::c_char;
3use std::ffi::CString;
4
5pub trait SetOptions {
6 fn set_options(&self, opts: &[(&str, &str)]) -> Result<(), Error>;
7 fn set_options_cf(&self, cf: &ColumnFamily, opts: &[(&str, &str)]) -> Result<(), Error>;
8}
9
10impl<T> SetOptions for T
11where
12 T: Handle<ffi::rocksdb_t>,
13{
14 fn set_options(&self, opts: &[(&str, &str)]) -> Result<(), Error> {
15 let copts = build_coptions(opts)?;
16 let cnames: Vec<*const c_char> = copts.iter().map(|opt| opt.0.as_ptr()).collect();
17 let cvalues: Vec<*const c_char> = copts.iter().map(|opt| opt.1.as_ptr()).collect();
18 let count = opts.len() as i32;
19
20 unsafe {
21 ffi_try!(ffi::rocksdb_set_options(
22 self.handle(),
23 count,
24 cnames.as_ptr(),
25 cvalues.as_ptr(),
26 ));
27 }
28 Ok(())
29 }
30
31 fn set_options_cf(&self, cf: &ColumnFamily, opts: &[(&str, &str)]) -> Result<(), Error> {
32 let copts = build_coptions(opts)?;
33 let cnames: Vec<*const c_char> = copts.iter().map(|opt| opt.0.as_ptr()).collect();
34 let cvalues: Vec<*const c_char> = copts.iter().map(|opt| opt.1.as_ptr()).collect();
35 let count = opts.len() as i32;
36
37 unsafe {
38 ffi_try!(ffi::rocksdb_set_options_cf(
39 self.handle(),
40 cf.handle(),
41 count,
42 cnames.as_ptr(),
43 cvalues.as_ptr(),
44 ));
45 }
46 Ok(())
47 }
48}
49
50fn build_coptions(opts: &[(&str, &str)]) -> Result<Vec<(CString, CString)>, Error> {
51 opts.iter()
52 .map(|(name, value)| {
53 let cname = match CString::new(name.as_bytes()) {
54 Ok(cname) => cname,
55 Err(e) => return Err(Error::new(format!("Invalid option name `{}`", e))),
56 };
57 let cvalue = match CString::new(value.as_bytes()) {
58 Ok(cvalue) => cvalue,
59 Err(e) => return Err(Error::new(format!("Invalid option value: `{}`", e))),
60 };
61 Ok((cname, cvalue))
62 })
63 .collect()
64}