ckb_rocksdb/ops/
columnfamily.rs1use 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 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}