Skip to content

Commit 7afce3d

Browse files
committed
cass_data_type: info whether collection is frozen
1 parent ca7dfa3 commit 7afce3d

File tree

3 files changed

+147
-86
lines changed

3 files changed

+147
-86
lines changed

scylla-rust-wrapper/src/cass_types.rs

Lines changed: 84 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,19 @@ impl Default for UDTDataType {
9494
pub enum CassDataType {
9595
Value(CassValueType),
9696
UDT(UDTDataType),
97-
List(Option<Arc<CassDataType>>),
98-
Set(Option<Arc<CassDataType>>),
99-
Map(Option<Arc<CassDataType>>, Option<Arc<CassDataType>>),
97+
List {
98+
typ: Option<Arc<CassDataType>>,
99+
frozen: bool,
100+
},
101+
Set {
102+
typ: Option<Arc<CassDataType>>,
103+
frozen: bool,
104+
},
105+
Map {
106+
key_type: Option<Arc<CassDataType>>,
107+
val_type: Option<Arc<CassDataType>>,
108+
frozen: bool,
109+
},
100110
Tuple(Vec<Arc<CassDataType>>),
101111
Custom(String),
102112
}
@@ -135,25 +145,36 @@ pub fn get_column_type_from_cql_type(
135145
) -> CassDataType {
136146
match cql_type {
137147
CqlType::Native(native) => CassDataType::Value(native.clone().into()),
138-
CqlType::Collection { type_, .. } => match type_ {
139-
CollectionType::List(list) => CassDataType::List(Some(Arc::new(
140-
get_column_type_from_cql_type(list, user_defined_types, keyspace_name),
141-
))),
142-
CollectionType::Map(key, value) => CassDataType::Map(
143-
Some(Arc::new(get_column_type_from_cql_type(
148+
CqlType::Collection { type_, frozen } => match type_ {
149+
CollectionType::List(list) => CassDataType::List {
150+
typ: Some(Arc::new(get_column_type_from_cql_type(
151+
list,
152+
user_defined_types,
153+
keyspace_name,
154+
))),
155+
frozen: *frozen,
156+
},
157+
CollectionType::Map(key, value) => CassDataType::Map {
158+
key_type: Some(Arc::new(get_column_type_from_cql_type(
144159
key,
145160
user_defined_types,
146161
keyspace_name,
147162
))),
148-
Some(Arc::new(get_column_type_from_cql_type(
163+
val_type: Some(Arc::new(get_column_type_from_cql_type(
149164
value,
150165
user_defined_types,
151166
keyspace_name,
152167
))),
153-
),
154-
CollectionType::Set(set) => CassDataType::Set(Some(Arc::new(
155-
get_column_type_from_cql_type(set, user_defined_types, keyspace_name),
156-
))),
168+
frozen: *frozen,
169+
},
170+
CollectionType::Set(set) => CassDataType::Set {
171+
typ: Some(Arc::new(get_column_type_from_cql_type(
172+
set,
173+
user_defined_types,
174+
keyspace_name,
175+
))),
176+
frozen: *frozen,
177+
},
157178
},
158179
CqlType::Tuple(tuple) => CassDataType::Tuple(
159180
tuple
@@ -187,16 +208,18 @@ impl CassDataType {
187208
CassDataType::UDT(udt_data_type) => {
188209
udt_data_type.field_types.get(index).map(|(_, b)| b)
189210
}
190-
CassDataType::List(t) | CassDataType::Set(t) => {
211+
CassDataType::List { typ, .. } | CassDataType::Set { typ, .. } => {
191212
if index > 0 {
192213
None
193214
} else {
194-
t.as_ref()
215+
typ.as_ref()
195216
}
196217
}
197-
CassDataType::Map(t1, t2) => match index {
198-
0 => t1.as_ref(),
199-
1 => t2.as_ref(),
218+
CassDataType::Map {
219+
key_type, val_type, ..
220+
} => match index {
221+
0 => key_type.as_ref(),
222+
1 => val_type.as_ref(),
200223
_ => None,
201224
},
202225
CassDataType::Tuple(v) => v.get(index),
@@ -206,21 +229,23 @@ impl CassDataType {
206229

207230
fn add_sub_data_type(&mut self, sub_type: Arc<CassDataType>) -> Result<(), CassError> {
208231
match self {
209-
CassDataType::List(t) | CassDataType::Set(t) => match t {
232+
CassDataType::List { typ, .. } | CassDataType::Set { typ, .. } => match typ {
210233
Some(_) => Err(CassError::CASS_ERROR_LIB_BAD_PARAMS),
211234
None => {
212-
*t = Some(sub_type);
235+
*typ = Some(sub_type);
213236
Ok(())
214237
}
215238
},
216-
CassDataType::Map(t1, t2) => {
217-
if t1.is_some() && t2.is_some() {
239+
CassDataType::Map {
240+
key_type, val_type, ..
241+
} => {
242+
if key_type.is_some() && val_type.is_some() {
218243
Err(CassError::CASS_ERROR_LIB_BAD_PARAMS)
219-
} else if t1.is_none() {
220-
*t1 = Some(sub_type);
244+
} else if key_type.is_none() {
245+
*key_type = Some(sub_type);
221246
Ok(())
222247
} else {
223-
*t2 = Some(sub_type);
248+
*val_type = Some(sub_type);
224249
Ok(())
225250
}
226251
}
@@ -243,9 +268,9 @@ impl CassDataType {
243268
match &self {
244269
CassDataType::Value(value_data_type) => *value_data_type,
245270
CassDataType::UDT { .. } => CassValueType::CASS_VALUE_TYPE_UDT,
246-
CassDataType::List(..) => CassValueType::CASS_VALUE_TYPE_LIST,
247-
CassDataType::Set(..) => CassValueType::CASS_VALUE_TYPE_SET,
248-
CassDataType::Map(..) => CassValueType::CASS_VALUE_TYPE_MAP,
271+
CassDataType::List { .. } => CassValueType::CASS_VALUE_TYPE_LIST,
272+
CassDataType::Set { .. } => CassValueType::CASS_VALUE_TYPE_SET,
273+
CassDataType::Map { .. } => CassValueType::CASS_VALUE_TYPE_MAP,
249274
CassDataType::Tuple(..) => CassValueType::CASS_VALUE_TYPE_TUPLE,
250275
CassDataType::Custom(..) => CassValueType::CASS_VALUE_TYPE_CUSTOM,
251276
}
@@ -268,16 +293,19 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
268293
ColumnType::Text => CassDataType::Value(CassValueType::CASS_VALUE_TYPE_TEXT),
269294
ColumnType::Timestamp => CassDataType::Value(CassValueType::CASS_VALUE_TYPE_TIMESTAMP),
270295
ColumnType::Inet => CassDataType::Value(CassValueType::CASS_VALUE_TYPE_INET),
271-
ColumnType::List(boxed_type) => {
272-
CassDataType::List(Some(Arc::new(get_column_type(boxed_type.as_ref()))))
273-
}
274-
ColumnType::Map(key, value) => CassDataType::Map(
275-
Some(Arc::new(get_column_type(key.as_ref()))),
276-
Some(Arc::new(get_column_type(value.as_ref()))),
277-
),
278-
ColumnType::Set(boxed_type) => {
279-
CassDataType::Set(Some(Arc::new(get_column_type(boxed_type.as_ref()))))
280-
}
296+
ColumnType::List(boxed_type) => CassDataType::List {
297+
typ: Some(Arc::new(get_column_type(boxed_type.as_ref()))),
298+
frozen: false,
299+
},
300+
ColumnType::Map(key, value) => CassDataType::Map {
301+
key_type: Some(Arc::new(get_column_type(key.as_ref()))),
302+
val_type: Some(Arc::new(get_column_type(value.as_ref()))),
303+
frozen: false,
304+
},
305+
ColumnType::Set(boxed_type) => CassDataType::Set {
306+
typ: Some(Arc::new(get_column_type(boxed_type.as_ref()))),
307+
frozen: false,
308+
},
281309
ColumnType::UserDefinedType {
282310
type_name,
283311
keyspace,
@@ -312,10 +340,20 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
312340
#[no_mangle]
313341
pub unsafe extern "C" fn cass_data_type_new(value_type: CassValueType) -> *const CassDataType {
314342
let data_type = match value_type {
315-
CassValueType::CASS_VALUE_TYPE_LIST => CassDataType::List(None),
316-
CassValueType::CASS_VALUE_TYPE_SET => CassDataType::Set(None),
343+
CassValueType::CASS_VALUE_TYPE_LIST => CassDataType::List {
344+
typ: None,
345+
frozen: false,
346+
},
347+
CassValueType::CASS_VALUE_TYPE_SET => CassDataType::Set {
348+
typ: None,
349+
frozen: false,
350+
},
317351
CassValueType::CASS_VALUE_TYPE_TUPLE => CassDataType::Tuple(Vec::new()),
318-
CassValueType::CASS_VALUE_TYPE_MAP => CassDataType::Map(None, None),
352+
CassValueType::CASS_VALUE_TYPE_MAP => CassDataType::Map {
353+
key_type: None,
354+
val_type: None,
355+
frozen: false,
356+
},
319357
CassValueType::CASS_VALUE_TYPE_UDT => CassDataType::UDT(UDTDataType::new()),
320358
CassValueType::CASS_VALUE_TYPE_CUSTOM => CassDataType::Custom("".to_string()),
321359
CassValueType::CASS_VALUE_TYPE_UNKNOWN => return ptr::null_mut(),
@@ -498,8 +536,10 @@ pub unsafe extern "C" fn cass_data_type_sub_type_count(data_type: *const CassDat
498536
match data_type {
499537
CassDataType::Value(..) => 0,
500538
CassDataType::UDT(udt_data_type) => udt_data_type.field_types.len() as size_t,
501-
CassDataType::List(t) | CassDataType::Set(t) => t.is_some() as size_t,
502-
CassDataType::Map(t1, t2) => t1.is_some() as size_t + t2.is_some() as size_t,
539+
CassDataType::List { typ, .. } | CassDataType::Set { typ, .. } => typ.is_some() as size_t,
540+
CassDataType::Map {
541+
key_type, val_type, ..
542+
} => key_type.is_some() as size_t + val_type.is_some() as size_t,
503543
CassDataType::Tuple(v) => v.len() as size_t,
504544
CassDataType::Custom(..) => 0,
505545
}

scylla-rust-wrapper/src/query_result.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,9 +1170,14 @@ pub unsafe extern "C" fn cass_value_primary_sub_type(
11701170
let val = ptr_to_ref(collection);
11711171

11721172
match val.value_type.as_ref() {
1173-
CassDataType::List(Some(list)) => list.get_value_type(),
1174-
CassDataType::Set(Some(set)) => set.get_value_type(),
1175-
CassDataType::Map(Some(key), _) => key.get_value_type(),
1173+
CassDataType::List {
1174+
typ: Some(list), ..
1175+
} => list.get_value_type(),
1176+
CassDataType::Set { typ: Some(set), .. } => set.get_value_type(),
1177+
CassDataType::Map {
1178+
key_type: Some(key),
1179+
..
1180+
} => key.get_value_type(),
11761181
_ => CassValueType::CASS_VALUE_TYPE_UNKNOWN,
11771182
}
11781183
}
@@ -1184,7 +1189,10 @@ pub unsafe extern "C" fn cass_value_secondary_sub_type(
11841189
let val = ptr_to_ref(collection);
11851190

11861191
match val.value_type.as_ref() {
1187-
CassDataType::Map(_, Some(value)) => value.get_value_type(),
1192+
CassDataType::Map {
1193+
val_type: Some(value),
1194+
..
1195+
} => value.get_value_type(),
11881196
_ => CassValueType::CASS_VALUE_TYPE_UNKNOWN,
11891197
}
11901198
}

scylla-rust-wrapper/src/session.rs

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -346,44 +346,57 @@ fn create_cass_row_columns(row: Row, metadata: &Arc<CassResultData>) -> Vec<Cass
346346

347347
fn get_column_value(column: CqlValue, column_type: &Arc<CassDataType>) -> Value {
348348
match (column, column_type.as_ref()) {
349-
(CqlValue::List(list), CassDataType::List(Some(list_type))) => {
350-
CollectionValue(Collection::List(
351-
list.into_iter()
352-
.map(|val| CassValue {
353-
value_type: list_type.clone(),
354-
value: Some(get_column_value(val, list_type)),
355-
})
356-
.collect(),
357-
))
358-
}
359-
(CqlValue::Map(map), CassDataType::Map(Some(key_type), Some(value_type))) => {
360-
CollectionValue(Collection::Map(
361-
map.into_iter()
362-
.map(|(key, val)| {
363-
(
364-
CassValue {
365-
value_type: key_type.clone(),
366-
value: Some(get_column_value(key, key_type)),
367-
},
368-
CassValue {
369-
value_type: value_type.clone(),
370-
value: Some(get_column_value(val, value_type)),
371-
},
372-
)
373-
})
374-
.collect(),
375-
))
376-
}
377-
(CqlValue::Set(set), CassDataType::Set(Some(set_type))) => {
378-
CollectionValue(Collection::Set(
379-
set.into_iter()
380-
.map(|val| CassValue {
381-
value_type: set_type.clone(),
382-
value: Some(get_column_value(val, set_type)),
383-
})
384-
.collect(),
385-
))
386-
}
349+
(
350+
CqlValue::List(list),
351+
CassDataType::List {
352+
typ: Some(list_type),
353+
..
354+
},
355+
) => CollectionValue(Collection::List(
356+
list.into_iter()
357+
.map(|val| CassValue {
358+
value_type: list_type.clone(),
359+
value: Some(get_column_value(val, list_type)),
360+
})
361+
.collect(),
362+
)),
363+
(
364+
CqlValue::Map(map),
365+
CassDataType::Map {
366+
key_type: Some(key_typ),
367+
val_type: Some(value_type),
368+
..
369+
},
370+
) => CollectionValue(Collection::Map(
371+
map.into_iter()
372+
.map(|(key, val)| {
373+
(
374+
CassValue {
375+
value_type: key_typ.clone(),
376+
value: Some(get_column_value(key, key_typ)),
377+
},
378+
CassValue {
379+
value_type: value_type.clone(),
380+
value: Some(get_column_value(val, value_type)),
381+
},
382+
)
383+
})
384+
.collect(),
385+
)),
386+
(
387+
CqlValue::Set(set),
388+
CassDataType::Set {
389+
typ: Some(set_type),
390+
..
391+
},
392+
) => CollectionValue(Collection::Set(
393+
set.into_iter()
394+
.map(|val| CassValue {
395+
value_type: set_type.clone(),
396+
value: Some(get_column_value(val, set_type)),
397+
})
398+
.collect(),
399+
)),
387400
(
388401
CqlValue::UserDefinedType {
389402
keyspace,

0 commit comments

Comments
 (0)