Skip to content

Commit 9cac893

Browse files
committed
using WideColumn
1 parent a7a88e5 commit 9cac893

5 files changed

Lines changed: 39 additions & 31 deletions

File tree

librocksdb-sys/rocksdb

src/db_iterator.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14-
14+
use crate::wide::db_wide_columns::WideColumns;
15+
use crate::wide::db_wide_columns::WideColumn;
1516
use crate::{
1617
db,
1718
db::{DBAccess, DB},
1819
column_family::AsColumnFamilyRef,
1920
ffi, Error, ReadOptions, WriteBatch,
21+
2022
};
2123
use libc::{c_char, c_uchar, size_t};
2224
use std::{marker::PhantomData, slice};
@@ -115,33 +117,38 @@ impl<'a, D: DBAccess> DBATGIteratorWithThreadMode<'a, D> {
115117
}
116118
}
117119

118-
pub fn attribute_groups(&self) -> Vec<Result<Option<Vec<u8>>, Error>> {
120+
pub fn attribute_groups(&self) -> Vec<WideColumn> {
119121
if self.valid() {
120122
self.attribute_groups_impl()
121123
} else {
122-
vec![]
124+
let mut result = Vec::new();
125+
result.push(WideColumn { cf: String::new(), value: String::new()});
126+
return result;
123127
}
124128
}
125129

126-
fn attribute_groups_impl(&self) -> Vec<Result<Option<Vec<u8>>, Error>> {
127-
let mut len: size_t = 0;
128-
129-
let mut values: *mut *mut c_char = ptr::null_mut();
130-
let mut values_sizes: *mut size_t = ptr::null_mut();
131-
let mut errors: *mut *mut c_char = ptr::null_mut();
130+
fn attribute_groups_impl(&self) -> Vec<WideColumn> {
131+
let mut values: *mut *mut ffi::rocksdb_widecolumns_t = ptr::null_mut();
132+
let mut values_sizes: usize = 0;
132133

133134
unsafe {
134135
ffi::rocksdb_iter_attribute_groups(
135136
self.inner.as_ptr(),
136137
&mut values,
137-
&mut values_sizes,
138-
&mut errors,
139-
&mut len);
140-
141-
let values = slice::from_raw_parts(values, len);
142-
let values_sizes = slice::from_raw_parts(values_sizes, len);
143-
let errors = slice::from_raw_parts(errors, len);
144-
db::convert_values(values.to_vec(), values_sizes.to_vec(), errors.to_vec())
138+
&mut values_sizes);
139+
140+
141+
let list = slice::from_raw_parts(values, values_sizes);
142+
let mut result = Vec::new();
143+
144+
for col in list {
145+
let wc = WideColumns::from_c(col.clone());
146+
let value = String::from_utf8_lossy(wc.value()).into_owned();
147+
let cf = String::from_utf8_lossy(wc.name()).into_owned();
148+
result.push(WideColumn { cf, value: value });
149+
}
150+
151+
result
145152
}
146153
}
147154

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ mod db;
9393
mod db_iterator;
9494
mod db_options;
9595
mod db_pinnable_slice;
96-
mod wide;
96+
pub mod wide;
9797
mod env;
9898
mod iter_range;
9999
pub mod merge_operator;
@@ -131,6 +131,7 @@ pub use crate::{
131131
UniversalCompactionStopStyle, WaitForCompactOptions, WriteBufferManager, WriteOptions,
132132
},
133133
wide::db_wide_columns::WideColumns,
134+
wide::db_wide_columns::WideColumn,
134135
db_pinnable_slice::DBPinnableSlice,
135136
env::Env,
136137
ffi_util::CStrLike,

src/wide/db_wide_columns.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ use libc::size_t;
44
use std::marker::PhantomData;
55
use std::slice;
66

7-
pub struct WideColumn <'a> {
8-
name: &'a str,
9-
value: &'a str,
7+
#[derive(Debug)]
8+
pub struct WideColumn {
9+
pub cf: String,
10+
pub value: String,
1011
}
1112

1213
pub struct WideColumns<'a> {

tests/test_iterator.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ mod util;
1616

1717
use pretty_assertions::assert_eq;
1818

19-
use rocksdb::{Direction, IteratorMode, MemtableFactory, Options, DB, DBRawIteratorWithThreadMode, WideColumns};
19+
use rocksdb::{Direction, IteratorMode, MemtableFactory, Options, DB, DBRawIteratorWithThreadMode};
2020
use util::{assert_iter, assert_iter_reversed, pair, DBPath};
2121
use rocksdb::ReadOptions;
22+
use rocksdb::wide::db_wide_columns::WideColumn;
23+
2224

2325
#[test]
2426
#[allow(clippy::cognitive_complexity)]
@@ -359,14 +361,11 @@ fn test_atg_iterator() {
359361

360362
while it.valid() {
361363
let key: Box<[u8]> = it.key().unwrap().into();
362-
let atg: Vec<u8> = it.attribute_groups()
363-
.into_iter()
364-
.map(|ag| ag.unwrap())
365-
.filter(|o| o.is_some())
366-
.flat_map(|ag| ag.unwrap())
367-
.collect();
368-
369-
println!("atg|{:?}=>{:?}", key, atg);
364+
let atg: Vec<WideColumn> = it.attribute_groups();
365+
366+
for col in &atg {
367+
println!("cf={:?}", col);
368+
}
370369
it.next();
371370
}
372371

0 commit comments

Comments
 (0)