@@ -22,6 +22,7 @@ pub struct UDTDataType {
22
22
23
23
pub keyspace : String ,
24
24
pub name : String ,
25
+ pub frozen : bool ,
25
26
}
26
27
27
28
impl UDTDataType {
@@ -30,13 +31,15 @@ impl UDTDataType {
30
31
field_types : Vec :: new ( ) ,
31
32
keyspace : "" . to_string ( ) ,
32
33
name : "" . to_string ( ) ,
34
+ frozen : false ,
33
35
}
34
36
}
35
37
36
38
pub fn create_with_params (
37
39
user_defined_types : & HashMap < String , Arc < UserDefinedType > > ,
38
40
keyspace_name : & str ,
39
41
name : & str ,
42
+ frozen : bool ,
40
43
) -> UDTDataType {
41
44
UDTDataType {
42
45
field_types : user_defined_types
@@ -57,6 +60,7 @@ impl UDTDataType {
57
60
. collect ( ) ,
58
61
keyspace : keyspace_name. to_string ( ) ,
59
62
name : name. to_owned ( ) ,
63
+ frozen,
60
64
}
61
65
}
62
66
@@ -65,6 +69,7 @@ impl UDTDataType {
65
69
field_types : Vec :: with_capacity ( capacity) ,
66
70
keyspace : "" . to_string ( ) ,
67
71
name : "" . to_string ( ) ,
72
+ frozen : false ,
68
73
}
69
74
}
70
75
@@ -94,9 +99,19 @@ impl Default for UDTDataType {
94
99
pub enum CassDataType {
95
100
Value ( CassValueType ) ,
96
101
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
+ } ,
100
115
Tuple ( Vec < Arc < CassDataType > > ) ,
101
116
Custom ( String ) ,
102
117
}
@@ -135,25 +150,36 @@ pub fn get_column_type_from_cql_type(
135
150
) -> CassDataType {
136
151
match cql_type {
137
152
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 (
144
164
key,
145
165
user_defined_types,
146
166
keyspace_name,
147
167
) ) ) ,
148
- Some ( Arc :: new ( get_column_type_from_cql_type (
168
+ val_type : Some ( Arc :: new ( get_column_type_from_cql_type (
149
169
value,
150
170
user_defined_types,
151
171
keyspace_name,
152
172
) ) ) ,
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
+ } ,
157
183
} ,
158
184
CqlType :: Tuple ( tuple) => CassDataType :: Tuple (
159
185
tuple
@@ -167,7 +193,7 @@ pub fn get_column_type_from_cql_type(
167
193
} )
168
194
. collect ( ) ,
169
195
) ,
170
- CqlType :: UserDefinedType { definition, .. } => {
196
+ CqlType :: UserDefinedType { definition, frozen } => {
171
197
let name = match definition {
172
198
Ok ( resolved) => & resolved. name ,
173
199
Err ( not_resolved) => & not_resolved. name ,
@@ -176,6 +202,7 @@ pub fn get_column_type_from_cql_type(
176
202
user_defined_types,
177
203
keyspace_name,
178
204
name,
205
+ * frozen,
179
206
) )
180
207
}
181
208
}
@@ -187,16 +214,18 @@ impl CassDataType {
187
214
CassDataType :: UDT ( udt_data_type) => {
188
215
udt_data_type. field_types . get ( index) . map ( |( _, b) | b)
189
216
}
190
- CassDataType :: List ( t ) | CassDataType :: Set ( t ) => {
217
+ CassDataType :: List { typ , .. } | CassDataType :: Set { typ , .. } => {
191
218
if index > 0 {
192
219
None
193
220
} else {
194
- t . as_ref ( )
221
+ typ . as_ref ( )
195
222
}
196
223
}
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 ( ) ,
200
229
_ => None ,
201
230
} ,
202
231
CassDataType :: Tuple ( v) => v. get ( index) ,
@@ -206,21 +235,23 @@ impl CassDataType {
206
235
207
236
fn add_sub_data_type ( & mut self , sub_type : Arc < CassDataType > ) -> Result < ( ) , CassError > {
208
237
match self {
209
- CassDataType :: List ( t ) | CassDataType :: Set ( t ) => match t {
238
+ CassDataType :: List { typ , .. } | CassDataType :: Set { typ , .. } => match typ {
210
239
Some ( _) => Err ( CassError :: CASS_ERROR_LIB_BAD_PARAMS ) ,
211
240
None => {
212
- * t = Some ( sub_type) ;
241
+ * typ = Some ( sub_type) ;
213
242
Ok ( ( ) )
214
243
}
215
244
} ,
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 ( ) {
218
249
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) ;
221
252
Ok ( ( ) )
222
253
} else {
223
- * t2 = Some ( sub_type) ;
254
+ * val_type = Some ( sub_type) ;
224
255
Ok ( ( ) )
225
256
}
226
257
}
@@ -243,9 +274,9 @@ impl CassDataType {
243
274
match & self {
244
275
CassDataType :: Value ( value_data_type) => * value_data_type,
245
276
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 ,
249
280
CassDataType :: Tuple ( ..) => CassValueType :: CASS_VALUE_TYPE_TUPLE ,
250
281
CassDataType :: Custom ( ..) => CassValueType :: CASS_VALUE_TYPE_CUSTOM ,
251
282
}
@@ -268,16 +299,19 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
268
299
ColumnType :: Text => CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_TEXT ) ,
269
300
ColumnType :: Timestamp => CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_TIMESTAMP ) ,
270
301
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
+ } ,
281
315
ColumnType :: UserDefinedType {
282
316
type_name,
283
317
keyspace,
@@ -289,6 +323,7 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
289
323
. collect ( ) ,
290
324
keyspace : ( * keyspace) . clone ( ) ,
291
325
name : ( * type_name) . clone ( ) ,
326
+ frozen : false ,
292
327
} ) ,
293
328
ColumnType :: SmallInt => CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_SMALL_INT ) ,
294
329
ColumnType :: TinyInt => CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_TINY_INT ) ,
@@ -312,10 +347,20 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
312
347
#[ no_mangle]
313
348
pub unsafe extern "C" fn cass_data_type_new ( value_type : CassValueType ) -> * const CassDataType {
314
349
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
+ } ,
317
358
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
+ } ,
319
364
CassValueType :: CASS_VALUE_TYPE_UDT => CassDataType :: UDT ( UDTDataType :: new ( ) ) ,
320
365
CassValueType :: CASS_VALUE_TYPE_CUSTOM => CassDataType :: Custom ( "" . to_string ( ) ) ,
321
366
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) ->
358
403
data_type. get_value_type ( )
359
404
}
360
405
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
+ }
363
419
364
420
#[ no_mangle]
365
421
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
498
554
match data_type {
499
555
CassDataType :: Value ( ..) => 0 ,
500
556
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 ,
503
561
CassDataType :: Tuple ( v) => v. len ( ) as size_t ,
504
562
CassDataType :: Custom ( ..) => 0 ,
505
563
}
0 commit comments