ckb_rocksdb/ops/
setoptions.rs

1use 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}