From 3d7bf2f31cddb9e147b15bb03002f283142900bb Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Thu, 14 Apr 2022 21:49:35 +0800 Subject: [PATCH] open column families automatically, returns status --- .gitignore | 1 + cozo-rocks/build.rs | 4 +- cozo-rocks/{src => include}/cozorocks.h | 30 +++++++++++--- cozo-rocks/src/cozorocks.cc | 2 +- cozo-rocks/src/lib.rs | 54 ++++++++++++++++--------- src/storage.rs | 30 ++++---------- 6 files changed, 72 insertions(+), 49 deletions(-) rename cozo-rocks/{src => include}/cozorocks.h (81%) diff --git a/.gitignore b/.gitignore index 0585f4af..3c320008 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ compile_commands.json CTestTestfile.cmake _deps +*.db \ No newline at end of file diff --git a/cozo-rocks/build.rs b/cozo-rocks/build.rs index d8dc8b1a..ef1c55d9 100644 --- a/cozo-rocks/build.rs +++ b/cozo-rocks/build.rs @@ -2,7 +2,7 @@ fn main() { cxx_build::bridge("src/lib.rs") .file("src/cozorocks.cc") .include("../rocksdb/include") - .include("src") + .include("include") .flag_if_supported("-std=c++17") .compile("cozo-rocks"); @@ -12,5 +12,5 @@ fn main() { println!("cargo:rustc-link-lib=bz2"); println!("cargo:rerun-if-changed=src/main.rs"); println!("cargo:rerun-if-changed=src/cozorocks.cc"); - println!("cargo:rerun-if-changed=src/cozorocks.h"); + println!("cargo:rerun-if-changed=include/cozorocks.h"); } \ No newline at end of file diff --git a/cozo-rocks/src/cozorocks.h b/cozo-rocks/include/cozorocks.h similarity index 81% rename from cozo-rocks/src/cozorocks.h rename to cozo-rocks/include/cozorocks.h index a3f3e577..21521b8e 100644 --- a/cozo-rocks/src/cozorocks.h +++ b/cozo-rocks/include/cozorocks.h @@ -161,19 +161,39 @@ struct DBBridge { } }; -inline std::vector list_column_families(const OptionsBridge &options, - const rust::Slice path) { - std::vector column_families; +inline std::unique_ptr > list_column_families(const OptionsBridge &options, + const rust::Slice path) { + auto column_families = std::make_unique < std::vector < std::string >> (); RDB::DB::ListColumnFamilies(options.inner, std::string(reinterpret_cast(path.data()), path.size()), - &column_families); + &*column_families); return column_families; } -inline std::unique_ptr open_db(const OptionsBridge &options, const rust::Slice path) { +inline std::unique_ptr open_db(const OptionsBridge &options, const rust::Slice path, Status &status) { + auto old_column_families = std::vector(); + RDB::DB::ListColumnFamilies(options.inner, + std::string(reinterpret_cast(path.data()), path.size()), + &old_column_families); + if (old_column_families.empty()) { + old_column_families.push_back(RDB::kDefaultColumnFamilyName); + } + + std::vector column_families; + + for (auto el: old_column_families) { + column_families.push_back(RDB::ColumnFamilyDescriptor( + el, options.inner)); + } + + std::vector < RDB::ColumnFamilyHandle * > handles; + RDB::DB *db_ptr; RDB::Status s = RDB::DB::Open(options.inner, std::string(reinterpret_cast(path.data()), path.size()), + column_families, + &handles, &db_ptr); + write_status(std::move(s), status); return std::unique_ptr(new DBBridge(db_ptr)); } \ No newline at end of file diff --git a/cozo-rocks/src/cozorocks.cc b/cozo-rocks/src/cozorocks.cc index 2c7e4651..c07b3931 100644 --- a/cozo-rocks/src/cozorocks.cc +++ b/cozo-rocks/src/cozorocks.cc @@ -2,7 +2,7 @@ // Created by Ziyang Hu on 2022/4/13. // -#include "cozorocks.h" +#include "../include/cozorocks.h" #include "cozo-rocks/src/lib.rs.h" void write_status_impl(Status &status, StatusCode code, StatusSubCode subcode, StatusSeverity severity) { diff --git a/cozo-rocks/src/lib.rs b/cozo-rocks/src/lib.rs index 1d1e3eda..92c53bfe 100644 --- a/cozo-rocks/src/lib.rs +++ b/cozo-rocks/src/lib.rs @@ -84,7 +84,8 @@ mod ffi { fn set_comparator(self: &OptionsBridge, name: &str, compare: fn(&[u8], &[u8]) -> i8); type DBBridge; - fn open_db(options: &OptionsBridge, path: &[u8]) -> UniquePtr; + fn list_column_families(options: &OptionsBridge, path: &[u8]) -> UniquePtr>; + fn open_db(options: &OptionsBridge, path: &[u8], status: &mut Status) -> UniquePtr; fn put(self: &DBBridge, options: &WriteOptionsBridge, key: &[u8], val: &[u8], status: &mut Status); fn get(self: &DBBridge, options: &ReadOptionsBridge, key: &[u8], status: &mut Status) -> UniquePtr; } @@ -182,30 +183,45 @@ pub struct DB { default_write_options: WriteOptions, } +fn get_path_bytes(path: &std::path::Path) -> &[u8] { + #[cfg(unix)] + { + use std::os::unix::ffi::OsStrExt; + path.as_os_str().as_bytes() + } + + #[cfg(not(unix))] + { path.to_string_lossy().to_string().as_bytes() } +} + impl DB { #[inline] - pub fn open(options: Options, path: impl AsRef) -> Self { - #[cfg(unix)] - { - use std::os::unix::ffi::OsStrExt; - Self { - bridge: open_db( - &options.bridge, - path.as_ref().as_os_str().as_bytes(), - ), + pub fn list_column_families(options: &Options, path: impl AsRef) -> Vec { + let results = list_column_families(&options.bridge, get_path_bytes(path.as_ref())); + results.iter().map(|s| s.to_string_lossy().into_owned()).collect() + } + + #[inline] + pub fn open(options: Options, path: impl AsRef) -> Result { + let mut status = Status::default(); + let bridge = open_db( + &options.bridge, + get_path_bytes(path.as_ref()), + &mut status + ); + + if status.code == StatusCode::kOk { + Ok(Self { + bridge, default_read_options: ReadOptions::default(), default_write_options: WriteOptions::default(), options, - } - } - #[cfg(not(unix))] - { - Self { - bridge: open_db( - &options.bridge, - path.as_ref().to_string_lossy().to_string().as_bytes()) - } + }) + } else { + Err(status) } + + } #[inline] diff --git a/src/storage.rs b/src/storage.rs index ed457b1a..30c49e58 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -6,22 +6,6 @@ pub struct Storage { #[allow(dead_code)] path: String, } -// -// fn make_options() -> Options { -// let mut options = Options::default(); -// -// options.create_missing_column_families(true); -// options.create_if_missing(true); -// options.set_comparator("cozo_comparator_v1", cozo_comparator_v1); -// options -// } - -// #[allow(dead_code)] -// fn make_write_options(global: bool) -> WriteOptions { -// let mut options = WriteOptions::new(); -// options.disable_wal(!global); -// options -// } impl Storage { pub fn no_storage() -> Self { @@ -79,13 +63,15 @@ mod tests { #[test] fn import() { use cozo_rocks::*; + let options = Options::default() + .increase_parallelism() + .optimize_level_style_compaction() + .set_create_if_missing(true) + .set_comparator("cozo_comparator_v1", cozo_comparator_v1); + println!("{:?}", DB::list_column_families(&options, "xxyyzz.db")); - let db = DB::open(Options::default() - .increase_parallelism() - .optimize_level_style_compaction() - .set_create_if_missing(true) - .set_comparator("cozo_comparator_v1", cozo_comparator_v1), - "xxyyzz.db"); + let db = DB::open(options, + "xxyyzz.db").unwrap(); let mut x = vec![]; let mut builder = ByteArrayBuilder::new(&mut x);