@@ -22,6 +22,7 @@ pub struct UDTDataType {
2222
2323 pub keyspace : String ,
2424 pub name : String ,
25+ pub frozen : bool ,
2526}
2627
2728impl 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 {
9499pub 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]
313348pub 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]
365421pub 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 }
0 commit comments