|
11 | 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | 12 | // See the License for the specific language governing permissions and |
13 | 13 | // limitations under the License. |
14 | | - |
| 14 | +use crate::wide::db_wide_columns::WideColumns; |
| 15 | +use crate::wide::db_wide_columns::WideColumn; |
15 | 16 | use crate::{ |
16 | 17 | db, |
17 | 18 | db::{DBAccess, DB}, |
18 | 19 | column_family::AsColumnFamilyRef, |
19 | 20 | ffi, Error, ReadOptions, WriteBatch, |
| 21 | + |
20 | 22 | }; |
21 | 23 | use libc::{c_char, c_uchar, size_t}; |
22 | 24 | use std::{marker::PhantomData, slice}; |
@@ -115,33 +117,38 @@ impl<'a, D: DBAccess> DBATGIteratorWithThreadMode<'a, D> { |
115 | 117 | } |
116 | 118 | } |
117 | 119 |
|
118 | | - pub fn attribute_groups(&self) -> Vec<Result<Option<Vec<u8>>, Error>> { |
| 120 | + pub fn attribute_groups(&self) -> Vec<WideColumn> { |
119 | 121 | if self.valid() { |
120 | 122 | self.attribute_groups_impl() |
121 | 123 | } else { |
122 | | - vec![] |
| 124 | + let mut result = Vec::new(); |
| 125 | + result.push(WideColumn { cf: String::new(), value: Vec::new()}); |
| 126 | + return result; |
123 | 127 | } |
124 | 128 | } |
125 | 129 |
|
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; |
132 | 133 |
|
133 | 134 | unsafe { |
134 | 135 | ffi::rocksdb_iter_attribute_groups( |
135 | 136 | self.inner.as_ptr(), |
136 | 137 | &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 = wc.value().to_vec(); |
| 147 | + let cf = String::from_utf8_lossy(wc.name()).into_owned(); |
| 148 | + result.push(WideColumn { cf, value: value }); |
| 149 | + } |
| 150 | + |
| 151 | + result |
145 | 152 | } |
146 | 153 | } |
147 | 154 |
|
|
0 commit comments