diff --git a/src/db.rs b/src/db.rs index 3067928..d73ff63 100644 --- a/src/db.rs +++ b/src/db.rs @@ -659,6 +659,32 @@ impl DB { }) } + pub fn list_cf>(opts: &Options, path: P) -> Result, Error> { + let path = path.as_ref(); + let cpath = match CString::new(path.to_string_lossy().as_bytes()) { + Ok(c) => c, + Err(_) => { + return Err(Error::new("Failed to convert path to CString \ + when opening DB." + .to_owned())) + } + }; + + let mut length = 0; + + unsafe { + let ptr = ffi_try!(ffi::rocksdb_list_column_families(opts.inner, + cpath.as_ptr() as *const _, + &mut length)); + + let vec = Vec::from_raw_parts(ptr, length, length).iter().map(|&ptr| { + CString::from_raw(ptr).into_string().unwrap() + }).collect(); + Ok(vec) + } + } + + pub fn destroy>(opts: &Options, path: P) -> Result<(), Error> { let cpath = CString::new(path.as_ref().to_string_lossy().as_bytes()).unwrap(); unsafe { diff --git a/tests/test_column_family.rs b/tests/test_column_family.rs index 8644aaa..9795b78 100644 --- a/tests/test_column_family.rs +++ b/tests/test_column_family.rs @@ -62,6 +62,17 @@ pub fn test_column_family() { Err(e) => panic!("failed to open db with column family: {}", e), } } + + // should be able to list a cf + { + let opts = Options::default(); + let vec = DB::list_cf(&opts, path); + match vec { + Ok(vec) => assert_eq!(vec, vec!["default", "cf1"]), + Err(e) => panic!("failed to drop column family: {}", e), + } + } + // TODO should be able to use writebatch ops with a cf { }