ckb_rocksdb/ops/
columnfamily.rs

1use crate::ffi;
2
3use crate::{ffi_util::to_cstring, handle::Handle, ColumnFamily, Error, Options};
4
5use std::collections::BTreeMap;
6
7pub trait GetColumnFamilys {
8    fn get_cfs(&self) -> &BTreeMap<String, ColumnFamily>;
9
10    fn get_mut_cfs(&mut self) -> &mut BTreeMap<String, ColumnFamily>;
11
12    /// Return the underlying column family handle.
13    fn cf_handle(&self, name: &str) -> Option<&ColumnFamily> {
14        self.get_cfs().get(name)
15    }
16}
17
18pub trait CreateCF {
19    fn create_cf<N: AsRef<str>>(&mut self, name: N, opts: &Options) -> Result<(), Error>;
20}
21
22pub trait DropCF {
23    fn drop_cf(&mut self, name: &str) -> Result<(), Error>;
24}
25
26impl<T> CreateCF for T
27where
28    T: Handle<ffi::rocksdb_t> + super::Write + GetColumnFamilys,
29{
30    fn create_cf<N: AsRef<str>>(&mut self, name: N, opts: &Options) -> Result<(), Error> {
31        let cname = to_cstring(
32            name.as_ref(),
33            "Failed to convert path to CString when opening rocksdb",
34        )?;
35        unsafe {
36            let cf_handle = ffi_try!(ffi::rocksdb_create_column_family(
37                self.handle(),
38                opts.inner,
39                cname.as_ptr(),
40            ));
41
42            self.get_mut_cfs()
43                .insert(name.as_ref().to_string(), ColumnFamily::new(cf_handle));
44        };
45        Ok(())
46    }
47}
48
49impl<T> DropCF for T
50where
51    T: Handle<ffi::rocksdb_t> + super::Write + GetColumnFamilys,
52{
53    fn drop_cf(&mut self, name: &str) -> Result<(), Error> {
54        let cf = self
55            .get_mut_cfs()
56            .remove(name)
57            .ok_or_else(|| Error::new(format!("Invalid column family: {}", name)))?;
58        unsafe {
59            ffi_try!(ffi::rocksdb_drop_column_family(self.handle(), cf.inner,));
60        }
61        Ok(())
62    }
63}