From 9cac89349cbbf27b8a47cd1602f557ca0d24034d Mon Sep 17 00:00:00 2001 From: Snizhana Korniichuk Date: Fri, 12 Sep 2025 11:28:38 +0300 Subject: [PATCH 1/8] using WideColumn --- librocksdb-sys/rocksdb | 2 +- src/db_iterator.rs | 41 ++++++++++++++++++++++--------------- src/lib.rs | 3 ++- src/wide/db_wide_columns.rs | 7 ++++--- tests/test_iterator.rs | 17 ++++++++------- 5 files changed, 39 insertions(+), 31 deletions(-) diff --git a/librocksdb-sys/rocksdb b/librocksdb-sys/rocksdb index a36a4a97c..fcc05637e 160000 --- a/librocksdb-sys/rocksdb +++ b/librocksdb-sys/rocksdb @@ -1 +1 @@ -Subproject commit a36a4a97ce98e1def1e0be7790a81cd1437381ac +Subproject commit fcc05637e9b17e5f2470c18ab677ea06539d5185 diff --git a/src/db_iterator.rs b/src/db_iterator.rs index 1dd65e2d1..73037824c 100644 --- a/src/db_iterator.rs +++ b/src/db_iterator.rs @@ -11,12 +11,14 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - +use crate::wide::db_wide_columns::WideColumns; +use crate::wide::db_wide_columns::WideColumn; use crate::{ db, db::{DBAccess, DB}, column_family::AsColumnFamilyRef, ffi, Error, ReadOptions, WriteBatch, + }; use libc::{c_char, c_uchar, size_t}; use std::{marker::PhantomData, slice}; @@ -115,33 +117,38 @@ impl<'a, D: DBAccess> DBATGIteratorWithThreadMode<'a, D> { } } - pub fn attribute_groups(&self) -> Vec>, Error>> { + pub fn attribute_groups(&self) -> Vec { if self.valid() { self.attribute_groups_impl() } else { - vec![] + let mut result = Vec::new(); + result.push(WideColumn { cf: String::new(), value: String::new()}); + return result; } } - fn attribute_groups_impl(&self) -> Vec>, Error>> { - let mut len: size_t = 0; - - let mut values: *mut *mut c_char = ptr::null_mut(); - let mut values_sizes: *mut size_t = ptr::null_mut(); - let mut errors: *mut *mut c_char = ptr::null_mut(); + fn attribute_groups_impl(&self) -> Vec { + let mut values: *mut *mut ffi::rocksdb_widecolumns_t = ptr::null_mut(); + let mut values_sizes: usize = 0; unsafe { ffi::rocksdb_iter_attribute_groups( self.inner.as_ptr(), &mut values, - &mut values_sizes, - &mut errors, - &mut len); - - let values = slice::from_raw_parts(values, len); - let values_sizes = slice::from_raw_parts(values_sizes, len); - let errors = slice::from_raw_parts(errors, len); - db::convert_values(values.to_vec(), values_sizes.to_vec(), errors.to_vec()) + &mut values_sizes); + + + let list = slice::from_raw_parts(values, values_sizes); + let mut result = Vec::new(); + + for col in list { + let wc = WideColumns::from_c(col.clone()); + let value = String::from_utf8_lossy(wc.value()).into_owned(); + let cf = String::from_utf8_lossy(wc.name()).into_owned(); + result.push(WideColumn { cf, value: value }); + } + + result } } diff --git a/src/lib.rs b/src/lib.rs index a062d2789..72dabe618 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -93,7 +93,7 @@ mod db; mod db_iterator; mod db_options; mod db_pinnable_slice; -mod wide; +pub mod wide; mod env; mod iter_range; pub mod merge_operator; @@ -131,6 +131,7 @@ pub use crate::{ UniversalCompactionStopStyle, WaitForCompactOptions, WriteBufferManager, WriteOptions, }, wide::db_wide_columns::WideColumns, + wide::db_wide_columns::WideColumn, db_pinnable_slice::DBPinnableSlice, env::Env, ffi_util::CStrLike, diff --git a/src/wide/db_wide_columns.rs b/src/wide/db_wide_columns.rs index 6f68c067d..df0df98a6 100644 --- a/src/wide/db_wide_columns.rs +++ b/src/wide/db_wide_columns.rs @@ -4,9 +4,10 @@ use libc::size_t; use std::marker::PhantomData; use std::slice; -pub struct WideColumn <'a> { - name: &'a str, - value: &'a str, +#[derive(Debug)] +pub struct WideColumn { + pub cf: String, + pub value: String, } pub struct WideColumns<'a> { diff --git a/tests/test_iterator.rs b/tests/test_iterator.rs index 247c49226..53096becf 100644 --- a/tests/test_iterator.rs +++ b/tests/test_iterator.rs @@ -16,9 +16,11 @@ mod util; use pretty_assertions::assert_eq; -use rocksdb::{Direction, IteratorMode, MemtableFactory, Options, DB, DBRawIteratorWithThreadMode, WideColumns}; +use rocksdb::{Direction, IteratorMode, MemtableFactory, Options, DB, DBRawIteratorWithThreadMode}; use util::{assert_iter, assert_iter_reversed, pair, DBPath}; use rocksdb::ReadOptions; +use rocksdb::wide::db_wide_columns::WideColumn; + #[test] #[allow(clippy::cognitive_complexity)] @@ -359,14 +361,11 @@ fn test_atg_iterator() { while it.valid() { let key: Box<[u8]> = it.key().unwrap().into(); - let atg: Vec = it.attribute_groups() - .into_iter() - .map(|ag| ag.unwrap()) - .filter(|o| o.is_some()) - .flat_map(|ag| ag.unwrap()) - .collect(); - - println!("atg|{:?}=>{:?}", key, atg); + let atg: Vec = it.attribute_groups(); + + for col in &atg { + println!("cf={:?}", col); +} it.next(); } From 87ee81dbb2126c059ac14834db2ee61b9746d3a7 Mon Sep 17 00:00:00 2001 From: Snizhana Korniichuk Date: Fri, 12 Sep 2025 12:50:00 +0300 Subject: [PATCH 2/8] using WideColumn --- src/wide/db_wide_columns.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/wide/db_wide_columns.rs b/src/wide/db_wide_columns.rs index df0df98a6..ee8ce25da 100644 --- a/src/wide/db_wide_columns.rs +++ b/src/wide/db_wide_columns.rs @@ -3,8 +3,10 @@ use core::ops::Deref; use libc::size_t; use std::marker::PhantomData; use std::slice; +use rustler::NifStruct; -#[derive(Debug)] +#[derive(NifStruct, Debug)] +#[module = "WideColumn"] pub struct WideColumn { pub cf: String, pub value: String, From 0fa7c52d1ead602099c15d723f64a5aad2d188e9 Mon Sep 17 00:00:00 2001 From: Snizhana Korniichuk Date: Fri, 12 Sep 2025 12:56:14 +0300 Subject: [PATCH 3/8] using WideColumn --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index 149bd611c..7904544df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,7 @@ libc = "0.2" librocksdb-sys = { path = "librocksdb-sys", version = "0.17.3", default-features = false, features = [ "static", ] } +rustler = "0.37.0" serde = { version = "1", features = ["derive"], optional = true } [dev-dependencies] From ca0d21235f2c1a1e680f79aae971405e860acf5d Mon Sep 17 00:00:00 2001 From: Snizhana Korniichuk Date: Fri, 12 Sep 2025 13:06:35 +0300 Subject: [PATCH 4/8] using WideColumn --- src/wide/db_wide_columns.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wide/db_wide_columns.rs b/src/wide/db_wide_columns.rs index ee8ce25da..3e66b3733 100644 --- a/src/wide/db_wide_columns.rs +++ b/src/wide/db_wide_columns.rs @@ -5,7 +5,8 @@ use std::marker::PhantomData; use std::slice; use rustler::NifStruct; -#[derive(NifStruct, Debug)] +#[derive(NifStruct, Debug, Clone)] +#[rustler(encode, decode)] #[module = "WideColumn"] pub struct WideColumn { pub cf: String, From 20f63542540a8c6123f4e913a8245b51841f6d4b Mon Sep 17 00:00:00 2001 From: Snizhana Korniichuk Date: Fri, 12 Sep 2025 14:22:08 +0300 Subject: [PATCH 5/8] add encoder --- src/wide/db_wide_columns.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/wide/db_wide_columns.rs b/src/wide/db_wide_columns.rs index 3e66b3733..db7421b16 100644 --- a/src/wide/db_wide_columns.rs +++ b/src/wide/db_wide_columns.rs @@ -3,16 +3,20 @@ use core::ops::Deref; use libc::size_t; use std::marker::PhantomData; use std::slice; -use rustler::NifStruct; +use rustler::{Encoder, Env, Term}; -#[derive(NifStruct, Debug, Clone)] -#[rustler(encode, decode)] -#[module = "WideColumn"] +#[derive(Debug, Clone)] pub struct WideColumn { pub cf: String, pub value: String, } +impl Encoder for WideColumn { + fn encode<'a>(&self, env: Env<'a>) -> Term<'a> { + (self.cf.clone(), self.value.clone()).encode(env) + } +} + pub struct WideColumns<'a> { ptr: *mut ffi::rocksdb_widecolumns_t, db: PhantomData<&'a DB>, From 99a0e52d1456f464108ac1ab996dc298b8511735 Mon Sep 17 00:00:00 2001 From: Snizhana Korniichuk Date: Fri, 12 Sep 2025 16:48:34 +0300 Subject: [PATCH 6/8] add encoder --- src/db_iterator.rs | 4 ++-- src/wide/db_wide_columns.rs | 11 ++--------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/db_iterator.rs b/src/db_iterator.rs index 73037824c..e3fc08565 100644 --- a/src/db_iterator.rs +++ b/src/db_iterator.rs @@ -122,7 +122,7 @@ impl<'a, D: DBAccess> DBATGIteratorWithThreadMode<'a, D> { self.attribute_groups_impl() } else { let mut result = Vec::new(); - result.push(WideColumn { cf: String::new(), value: String::new()}); + result.push(WideColumn { cf: String::new(), value: (&[]).to_vec()}); return result; } } @@ -143,7 +143,7 @@ impl<'a, D: DBAccess> DBATGIteratorWithThreadMode<'a, D> { for col in list { let wc = WideColumns::from_c(col.clone()); - let value = String::from_utf8_lossy(wc.value()).into_owned(); + let value = wc.value().to_vec(); let cf = String::from_utf8_lossy(wc.name()).into_owned(); result.push(WideColumn { cf, value: value }); } diff --git a/src/wide/db_wide_columns.rs b/src/wide/db_wide_columns.rs index db7421b16..580a16956 100644 --- a/src/wide/db_wide_columns.rs +++ b/src/wide/db_wide_columns.rs @@ -3,18 +3,11 @@ use core::ops::Deref; use libc::size_t; use std::marker::PhantomData; use std::slice; -use rustler::{Encoder, Env, Term}; #[derive(Debug, Clone)] -pub struct WideColumn { +pub struct WideColumn{ pub cf: String, - pub value: String, -} - -impl Encoder for WideColumn { - fn encode<'a>(&self, env: Env<'a>) -> Term<'a> { - (self.cf.clone(), self.value.clone()).encode(env) - } + pub value: Vec, } pub struct WideColumns<'a> { From fe0bdb2dc4a794c75be7d61b8081c9b0d34fc040 Mon Sep 17 00:00:00 2001 From: Snizhana Korniichuk Date: Wed, 8 Oct 2025 15:13:54 +0300 Subject: [PATCH 7/8] git add new version rust in github --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index afbfebe03..ae73dd140 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -2,7 +2,7 @@ name: RocksDB CI on: [push, pull_request] env: - RUST_VERSION: 1.71.1 + RUST_VERSION: 1.88 CARGO_TERM_COLOR: always jobs: From a3b950964f4397cc843e2c1f691ecabbb4eb9373 Mon Sep 17 00:00:00 2001 From: Snizhana Korniichuk Date: Thu, 9 Oct 2025 14:26:06 +0300 Subject: [PATCH 8/8] delete rustler --- Cargo.toml | 1 - src/db_iterator.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7904544df..149bd611c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,6 @@ libc = "0.2" librocksdb-sys = { path = "librocksdb-sys", version = "0.17.3", default-features = false, features = [ "static", ] } -rustler = "0.37.0" serde = { version = "1", features = ["derive"], optional = true } [dev-dependencies] diff --git a/src/db_iterator.rs b/src/db_iterator.rs index e3fc08565..019c5cd1a 100644 --- a/src/db_iterator.rs +++ b/src/db_iterator.rs @@ -122,7 +122,7 @@ impl<'a, D: DBAccess> DBATGIteratorWithThreadMode<'a, D> { self.attribute_groups_impl() } else { let mut result = Vec::new(); - result.push(WideColumn { cf: String::new(), value: (&[]).to_vec()}); + result.push(WideColumn { cf: String::new(), value: Vec::new()}); return result; } }