@@ -94,9 +94,19 @@ impl Default for UDTDataType {
94
94
pub enum CassDataType {
95
95
Value ( CassValueType ) ,
96
96
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
+ } ,
100
110
Tuple ( Vec < Arc < CassDataType > > ) ,
101
111
Custom ( String ) ,
102
112
}
@@ -135,25 +145,36 @@ pub fn get_column_type_from_cql_type(
135
145
) -> CassDataType {
136
146
match cql_type {
137
147
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 (
144
159
key,
145
160
user_defined_types,
146
161
keyspace_name,
147
162
) ) ) ,
148
- Some ( Arc :: new ( get_column_type_from_cql_type (
163
+ val_type : Some ( Arc :: new ( get_column_type_from_cql_type (
149
164
value,
150
165
user_defined_types,
151
166
keyspace_name,
152
167
) ) ) ,
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
+ } ,
157
178
} ,
158
179
CqlType :: Tuple ( tuple) => CassDataType :: Tuple (
159
180
tuple
@@ -187,16 +208,18 @@ impl CassDataType {
187
208
CassDataType :: UDT ( udt_data_type) => {
188
209
udt_data_type. field_types . get ( index) . map ( |( _, b) | b)
189
210
}
190
- CassDataType :: List ( t ) | CassDataType :: Set ( t ) => {
211
+ CassDataType :: List { typ , .. } | CassDataType :: Set { typ , .. } => {
191
212
if index > 0 {
192
213
None
193
214
} else {
194
- t . as_ref ( )
215
+ typ . as_ref ( )
195
216
}
196
217
}
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 ( ) ,
200
223
_ => None ,
201
224
} ,
202
225
CassDataType :: Tuple ( v) => v. get ( index) ,
@@ -206,21 +229,23 @@ impl CassDataType {
206
229
207
230
fn add_sub_data_type ( & mut self , sub_type : Arc < CassDataType > ) -> Result < ( ) , CassError > {
208
231
match self {
209
- CassDataType :: List ( t ) | CassDataType :: Set ( t ) => match t {
232
+ CassDataType :: List { typ , .. } | CassDataType :: Set { typ , .. } => match typ {
210
233
Some ( _) => Err ( CassError :: CASS_ERROR_LIB_BAD_PARAMS ) ,
211
234
None => {
212
- * t = Some ( sub_type) ;
235
+ * typ = Some ( sub_type) ;
213
236
Ok ( ( ) )
214
237
}
215
238
} ,
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 ( ) {
218
243
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) ;
221
246
Ok ( ( ) )
222
247
} else {
223
- * t2 = Some ( sub_type) ;
248
+ * val_type = Some ( sub_type) ;
224
249
Ok ( ( ) )
225
250
}
226
251
}
@@ -243,9 +268,9 @@ impl CassDataType {
243
268
match & self {
244
269
CassDataType :: Value ( value_data_type) => * value_data_type,
245
270
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 ,
249
274
CassDataType :: Tuple ( ..) => CassValueType :: CASS_VALUE_TYPE_TUPLE ,
250
275
CassDataType :: Custom ( ..) => CassValueType :: CASS_VALUE_TYPE_CUSTOM ,
251
276
}
@@ -268,16 +293,19 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
268
293
ColumnType :: Text => CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_TEXT ) ,
269
294
ColumnType :: Timestamp => CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_TIMESTAMP ) ,
270
295
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
+ } ,
281
309
ColumnType :: UserDefinedType {
282
310
type_name,
283
311
keyspace,
@@ -312,10 +340,20 @@ pub fn get_column_type(column_type: &ColumnType) -> CassDataType {
312
340
#[ no_mangle]
313
341
pub unsafe extern "C" fn cass_data_type_new ( value_type : CassValueType ) -> * const CassDataType {
314
342
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
+ } ,
317
351
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
+ } ,
319
357
CassValueType :: CASS_VALUE_TYPE_UDT => CassDataType :: UDT ( UDTDataType :: new ( ) ) ,
320
358
CassValueType :: CASS_VALUE_TYPE_CUSTOM => CassDataType :: Custom ( "" . to_string ( ) ) ,
321
359
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
498
536
match data_type {
499
537
CassDataType :: Value ( ..) => 0 ,
500
538
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 ,
503
543
CassDataType :: Tuple ( v) => v. len ( ) as size_t ,
504
544
CassDataType :: Custom ( ..) => 0 ,
505
545
}
0 commit comments