Skip to content

Commit 1e2e943

Browse files
authored
Merge pull request #141 from muzarski/frozen_support
cass_data_type: frozen support
2 parents 0cd7ca7 + e099d45 commit 1e2e943

File tree

3 files changed

+169
-89
lines changed

3 files changed

+169
-89
lines changed

scylla-rust-wrapper/src/cass_types.rs

Lines changed: 105 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub struct UDTDataType {
2222

2323
pub keyspace: String,
2424
pub name: String,
25+
pub frozen: bool,
2526
}
2627

2728
impl UDTDataType {
@@ -30,13 +31,15 @@ impl UDTDataType {
3031
field_types: Vec::new(),
3132
keyspace: "".to_string(),
3233
name: "".to_string(),
34+
frozen: false,
3335
}
3436
}
3537

3638
pub fn create_with_params(
3739
user_defined_types: &HashMap<String, Arc<UserDefinedType>>,
3840
keyspace_name: &str,
3941
name: &str,
42+
frozen: bool,
4043
) -> UDTDataType {
4144
UDTDataType {
4245
field_types: user_defined_types
@@ -57,6 +60,7 @@ impl UDTDataType {
5760
.collect(),
5861
keyspace: keyspace_name.to_string(),
5962
name: name.to_owned(),
63+
frozen,
6064
}
6165
}
6266

@@ -65,6 +69,7 @@ impl UDTDataType {
6569
field_types: Vec::with_capacity(capacity),
6670
keyspace: "".to_string(),
6771
name: "".to_string(),
72+
frozen: false,
6873
}
6974
}
7075

@@ -94,9 +99,19 @@ impl Default for UDTDataType {
9499
pub enum CassDataType {
95100
Value(CassValueType),
96101
UDT(UDTDataType),
97-
List(Option<Arc<CassDataType>>),
98-
Set(Option<Arc<CassDataType>>),
99-
Map(Option<Arc<CassDataType>>, Option<Arc<CassDataType>>),
102+
List {
103+
typ: Option<Arc<CassDataType>>,
104+
frozen: bool,
105+
},
106+
Set {
107+
typ: Option<Arc<CassDataType>>,
108+
frozen: bool,
109+
},
110+
Map {
111+
key_type: Option<Arc<CassDataType>>,
112+
val_type: Option<Arc<CassDataType>>,
113+
frozen: bool,
114+
},
100115
Tuple(Vec<Arc<CassDataType>>),
101116
Custom(String),
102117
}
@@ -135,25 +150,36 @@ pub fn get_column_type_from_cql_type(
135150
) -> CassDataType {
136151
match cql_type {
137152
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(
153+
CqlType::Collection { type_, frozen } => match type_ {
154+
CollectionType::List(list) => CassDataType::List {
155+
typ: Some(Arc::new(get_column_type_from_cql_type(
156+
list,
157+
user_defined_types,
158+
keyspace_name,
159+
))),
160+
frozen: *frozen,
161+
},
162+
CollectionType::Map(key, value) => CassDataType::Map {
163+
key_type: Some(Arc::new(get_column_type_from_cql_type(
144164
key,
145165
user_defined_types,
146166
keyspace_name,
147167
))),
148-
Some(Arc::new(get_column_type_from_cql_type(
168+
val_type: Some(Arc::new(get_column_type_from_cql_type(
149169
value,
150170
user_defined_types,
151171
keyspace_name,
152172
))),
153-
),
154-
CollectionType::Set(set) => CassDataType::Set(Some(Arc::new(
155-
get_column_type_from_cql_type(set, user_defined_types, keyspace_name),
156-
))),
173+
frozen: *frozen,
174+
},
175+
CollectionType::Set(set) => CassDataType::Set {
176+
typ: Some(Arc::new(get_column_type_from_cql_type(
177+
set,
178+
user_defined_types,
179+
keyspace_name,
180+
))),
181+
frozen: *frozen,
182+
},
157183
},
158184
CqlType::Tuple(tuple) => CassDataType::Tuple(
159185
tuple
@@ -167,7 +193,7 @@ pub fn get_column_type_from_cql_type(
167193
})
168194
.collect(),
169195
),
170-
CqlType::UserDefinedType { definition, .. } => {
196+
CqlType::UserDefinedType { definition, frozen } => {
171197
let name = match definition {
172198
Ok(resolved) => &resolved.name,
173199
Err(not_resolved) => &not_resolved.name,
@@ -176,6 +202,7 @@ pub fn get_column_type_from_cql_type(
176202
user_defined_types,
177203
keyspace_name,
178204
name,
205+
*frozen,
179206
))
180207
}
181208
}
@@ -187,16 +214,18 @@ impl CassDataType {
187214
CassDataType::UDT(udt_data_type) => {
188215
udt_data_type.field_types.get(index).map(|(_, b)| b)
189216
}
190-
CassDataType::List(t) | CassDataType::Set(t) => {
217+
CassDataType::List { typ, .. } | CassDataType::Set { typ, .. } => {
191218
if index > 0 {
192219
None
193220
} else {
194-
t.as_ref()
221+
typ.as_ref()
195222
}
196223
}
197-
CassDataType::Map(t1, t2) => match index {
198-
0 => t1.as_ref(),
199-
1 => t2.as_ref(),
224+
CassDataType::Map {
225+
key_type, val_type, ..
226+
} => match index {
227+
0 => key_type.as_ref(),
228+
1 => val_type.as_ref(),
200229
_ => None,
201230
},
202231
CassDataType::Tuple(v) => v.get(index),
@@ -206,21 +235,23 @@ impl CassDataType {
206235

207236
fn add_sub_data_type(&mut self, sub_type: Arc<CassDataType>) -> Result<(), CassError> {
208237
match self {
209-
CassDataType::List(t) | CassDataType::Set(t) => match t {
238+
CassDataType::List { typ, .. } | CassDataType::Set { typ, .. } => match typ {
210239
Some(_) => Err(CassError::CASS_ERROR_LIB_BAD_PARAMS),
211240
None => {
212-
*t = Some(sub_type);
241+
*typ = Some(sub_type);
213242
Ok(())
214243
}
215244
},
216-
CassDataType::Map(t1, t2) => {
217-
if t1.is_some() && t2.is_some() {
245+
CassDataType::Map {
246+
key_type, val_type, ..
247+
} => {
248+
if key_type.is_some() && val_type.is_some() {
218249
Err(CassError::CASS_ERROR_LIB_BAD_PARAMS)
219-
} else if t1.is_none() {
220-
*t1 = Some(sub_type);
250+
} else if key_type.is_none() {
251+
*key_type = Some(sub_type);
221252
Ok(())
222253
} else {
223-
*t2 = Some(sub_type);
254+
*val_type = Some(sub_type);
224255
Ok(())
225256
}
226257
}
@@ -243,9 +274,9 @@ impl CassDataType {
243274
match &self {
244275
CassDataType::Value(value_data_type) => *value_data_type,
245276
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,
277+
CassDataType::List { .. } => CassValueType::CASS_VALUE_TYPE_LIST,
278+
CassDataType::Set { .. } => CassValueType::CASS_VALUE_TYPE_SET,
279+
CassDataType::Map { .. } => CassValueType::CASS_VALUE_TYPE_MAP,
249280
CassDataType::Tuple(..) => CassValueType::CASS_VALUE_TYPE_TUPLE,
250281
CassDataType::Custom(..) => CassValueType::CASS_VALUE_TYPE_CUSTOM,
251282
}
@@ -268,16 +299,19 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
268299
ColumnType::Text => CassDataType::Value(CassValueType::CASS_VALUE_TYPE_TEXT),
269300
ColumnType::Timestamp => CassDataType::Value(CassValueType::CASS_VALUE_TYPE_TIMESTAMP),
270301
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-
}
302+
ColumnType::List(boxed_type) => CassDataType::List {
303+
typ: Some(Arc::new(get_column_type(boxed_type.as_ref()))),
304+
frozen: false,
305+
},
306+
ColumnType::Map(key, value) => CassDataType::Map {
307+
key_type: Some(Arc::new(get_column_type(key.as_ref()))),
308+
val_type: Some(Arc::new(get_column_type(value.as_ref()))),
309+
frozen: false,
310+
},
311+
ColumnType::Set(boxed_type) => CassDataType::Set {
312+
typ: Some(Arc::new(get_column_type(boxed_type.as_ref()))),
313+
frozen: false,
314+
},
281315
ColumnType::UserDefinedType {
282316
type_name,
283317
keyspace,
@@ -289,6 +323,7 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
289323
.collect(),
290324
keyspace: (*keyspace).clone(),
291325
name: (*type_name).clone(),
326+
frozen: false,
292327
}),
293328
ColumnType::SmallInt => CassDataType::Value(CassValueType::CASS_VALUE_TYPE_SMALL_INT),
294329
ColumnType::TinyInt => CassDataType::Value(CassValueType::CASS_VALUE_TYPE_TINY_INT),
@@ -312,10 +347,20 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
312347
#[no_mangle]
313348
pub unsafe extern "C" fn cass_data_type_new(value_type: CassValueType) -> *const CassDataType {
314349
let data_type = match value_type {
315-
CassValueType::CASS_VALUE_TYPE_LIST => CassDataType::List(None),
316-
CassValueType::CASS_VALUE_TYPE_SET => CassDataType::Set(None),
350+
CassValueType::CASS_VALUE_TYPE_LIST => CassDataType::List {
351+
typ: None,
352+
frozen: false,
353+
},
354+
CassValueType::CASS_VALUE_TYPE_SET => CassDataType::Set {
355+
typ: None,
356+
frozen: false,
357+
},
317358
CassValueType::CASS_VALUE_TYPE_TUPLE => CassDataType::Tuple(Vec::new()),
318-
CassValueType::CASS_VALUE_TYPE_MAP => CassDataType::Map(None, None),
359+
CassValueType::CASS_VALUE_TYPE_MAP => CassDataType::Map {
360+
key_type: None,
361+
val_type: None,
362+
frozen: false,
363+
},
319364
CassValueType::CASS_VALUE_TYPE_UDT => CassDataType::UDT(UDTDataType::new()),
320365
CassValueType::CASS_VALUE_TYPE_CUSTOM => CassDataType::Custom("".to_string()),
321366
CassValueType::CASS_VALUE_TYPE_UNKNOWN => return ptr::null_mut(),
@@ -358,8 +403,19 @@ pub unsafe extern "C" fn cass_data_type_type(data_type: *const CassDataType) ->
358403
data_type.get_value_type()
359404
}
360405

361-
// #[no_mangle]
362-
// pub unsafe extern "C" fn cass_data_type_is_frozen(data_type: *const CassDataType) -> cass_bool_t {}
406+
#[no_mangle]
407+
pub unsafe extern "C" fn cass_data_type_is_frozen(data_type: *const CassDataType) -> cass_bool_t {
408+
let data_type = ptr_to_ref(data_type);
409+
let is_frozen = match data_type {
410+
CassDataType::UDT(udt) => udt.frozen,
411+
CassDataType::List { frozen, .. } => *frozen,
412+
CassDataType::Set { frozen, .. } => *frozen,
413+
CassDataType::Map { frozen, .. } => *frozen,
414+
_ => false,
415+
};
416+
417+
is_frozen as cass_bool_t
418+
}
363419

364420
#[no_mangle]
365421
pub unsafe extern "C" fn cass_data_type_type_name(
@@ -498,8 +554,10 @@ pub unsafe extern "C" fn cass_data_type_sub_type_count(data_type: *const CassDat
498554
match data_type {
499555
CassDataType::Value(..) => 0,
500556
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,
557+
CassDataType::List { typ, .. } | CassDataType::Set { typ, .. } => typ.is_some() as size_t,
558+
CassDataType::Map {
559+
key_type, val_type, ..
560+
} => key_type.is_some() as size_t + val_type.is_some() as size_t,
503561
CassDataType::Tuple(v) => v.len() as size_t,
504562
CassDataType::Custom(..) => 0,
505563
}

scylla-rust-wrapper/src/query_result.rs

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

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

11851190
match val.value_type.as_ref() {
1186-
CassDataType::Map(_, Some(value)) => value.get_value_type(),
1191+
CassDataType::Map {
1192+
val_type: Some(value),
1193+
..
1194+
} => value.get_value_type(),
11871195
_ => CassValueType::CASS_VALUE_TYPE_UNKNOWN,
11881196
}
11891197
}

0 commit comments

Comments
 (0)