@@ -915,12 +915,21 @@ pub unsafe extern "C" fn cass_value_data_type(value: *const CassValue) -> *const
915
915
Arc :: as_ptr ( & value_from_raw. value_type )
916
916
}
917
917
918
+ macro_rules! val_ptr_to_ref_ensure_non_null {
919
+ ( $ptr: ident) => { {
920
+ if $ptr. is_null( ) {
921
+ return CassError :: CASS_ERROR_LIB_NULL_VALUE ;
922
+ }
923
+ ptr_to_ref( $ptr)
924
+ } } ;
925
+ }
926
+
918
927
#[ no_mangle]
919
928
pub unsafe extern "C" fn cass_value_get_float (
920
929
value : * const CassValue ,
921
930
output : * mut cass_float_t ,
922
931
) -> CassError {
923
- let val: & CassValue = ptr_to_ref ( value) ;
932
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
924
933
match val. value {
925
934
Some ( Value :: RegularValue ( CqlValue :: Float ( f) ) ) => std:: ptr:: write ( output, f) ,
926
935
Some ( _) => return CassError :: CASS_ERROR_LIB_INVALID_VALUE_TYPE ,
@@ -935,7 +944,7 @@ pub unsafe extern "C" fn cass_value_get_double(
935
944
value : * const CassValue ,
936
945
output : * mut cass_double_t ,
937
946
) -> CassError {
938
- let val: & CassValue = ptr_to_ref ( value) ;
947
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
939
948
match val. value {
940
949
Some ( Value :: RegularValue ( CqlValue :: Double ( d) ) ) => std:: ptr:: write ( output, d) ,
941
950
Some ( _) => return CassError :: CASS_ERROR_LIB_INVALID_VALUE_TYPE ,
@@ -950,7 +959,7 @@ pub unsafe extern "C" fn cass_value_get_bool(
950
959
value : * const CassValue ,
951
960
output : * mut cass_bool_t ,
952
961
) -> CassError {
953
- let val: & CassValue = ptr_to_ref ( value) ;
962
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
954
963
match val. value {
955
964
Some ( Value :: RegularValue ( CqlValue :: Boolean ( b) ) ) => {
956
965
std:: ptr:: write ( output, b as cass_bool_t )
@@ -967,7 +976,7 @@ pub unsafe extern "C" fn cass_value_get_int8(
967
976
value : * const CassValue ,
968
977
output : * mut cass_int8_t ,
969
978
) -> CassError {
970
- let val: & CassValue = ptr_to_ref ( value) ;
979
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
971
980
match val. value {
972
981
Some ( Value :: RegularValue ( CqlValue :: TinyInt ( i) ) ) => std:: ptr:: write ( output, i) ,
973
982
Some ( _) => return CassError :: CASS_ERROR_LIB_INVALID_VALUE_TYPE ,
@@ -982,7 +991,7 @@ pub unsafe extern "C" fn cass_value_get_int16(
982
991
value : * const CassValue ,
983
992
output : * mut cass_int16_t ,
984
993
) -> CassError {
985
- let val: & CassValue = ptr_to_ref ( value) ;
994
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
986
995
match val. value {
987
996
Some ( Value :: RegularValue ( CqlValue :: SmallInt ( i) ) ) => std:: ptr:: write ( output, i) ,
988
997
Some ( _) => return CassError :: CASS_ERROR_LIB_INVALID_VALUE_TYPE ,
@@ -997,7 +1006,7 @@ pub unsafe extern "C" fn cass_value_get_uint32(
997
1006
value : * const CassValue ,
998
1007
output : * mut cass_uint32_t ,
999
1008
) -> CassError {
1000
- let val: & CassValue = ptr_to_ref ( value) ;
1009
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
1001
1010
match val. value {
1002
1011
Some ( Value :: RegularValue ( CqlValue :: Date ( u) ) ) => std:: ptr:: write ( output, u. 0 ) , // FIXME: hack
1003
1012
Some ( _) => return CassError :: CASS_ERROR_LIB_INVALID_VALUE_TYPE ,
@@ -1012,7 +1021,7 @@ pub unsafe extern "C" fn cass_value_get_int32(
1012
1021
value : * const CassValue ,
1013
1022
output : * mut cass_int32_t ,
1014
1023
) -> CassError {
1015
- let val: & CassValue = ptr_to_ref ( value) ;
1024
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
1016
1025
match val. value {
1017
1026
Some ( Value :: RegularValue ( CqlValue :: Int ( i) ) ) => std:: ptr:: write ( output, i) ,
1018
1027
Some ( _) => return CassError :: CASS_ERROR_LIB_INVALID_VALUE_TYPE ,
@@ -1027,7 +1036,7 @@ pub unsafe extern "C" fn cass_value_get_int64(
1027
1036
value : * const CassValue ,
1028
1037
output : * mut cass_int64_t ,
1029
1038
) -> CassError {
1030
- let val: & CassValue = ptr_to_ref ( value) ;
1039
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
1031
1040
match val. value {
1032
1041
Some ( Value :: RegularValue ( CqlValue :: BigInt ( i) ) ) => std:: ptr:: write ( output, i) ,
1033
1042
Some ( Value :: RegularValue ( CqlValue :: Counter ( i) ) ) => {
@@ -1049,7 +1058,7 @@ pub unsafe extern "C" fn cass_value_get_uuid(
1049
1058
value : * const CassValue ,
1050
1059
output : * mut CassUuid ,
1051
1060
) -> CassError {
1052
- let val: & CassValue = ptr_to_ref ( value) ;
1061
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
1053
1062
match val. value {
1054
1063
Some ( Value :: RegularValue ( CqlValue :: Uuid ( uuid) ) ) => std:: ptr:: write ( output, uuid. into ( ) ) ,
1055
1064
Some ( Value :: RegularValue ( CqlValue :: Timeuuid ( uuid) ) ) => {
@@ -1067,7 +1076,7 @@ pub unsafe extern "C" fn cass_value_get_inet(
1067
1076
value : * const CassValue ,
1068
1077
output : * mut CassInet ,
1069
1078
) -> CassError {
1070
- let val: & CassValue = ptr_to_ref ( value) ;
1079
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
1071
1080
match val. value {
1072
1081
Some ( Value :: RegularValue ( CqlValue :: Inet ( inet) ) ) => std:: ptr:: write ( output, inet. into ( ) ) ,
1073
1082
Some ( _) => return CassError :: CASS_ERROR_LIB_INVALID_VALUE_TYPE ,
@@ -1083,7 +1092,7 @@ pub unsafe extern "C" fn cass_value_get_string(
1083
1092
output : * mut * const c_char ,
1084
1093
output_size : * mut size_t ,
1085
1094
) -> CassError {
1086
- let val: & CassValue = ptr_to_ref ( value) ;
1095
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
1087
1096
match & val. value {
1088
1097
// It seems that cpp driver doesn't check the type - you can call _get_string
1089
1098
// on any type and get internal represenation. I don't see how to do it easily in
@@ -1109,7 +1118,7 @@ pub unsafe extern "C" fn cass_value_get_duration(
1109
1118
days : * mut cass_int32_t ,
1110
1119
nanos : * mut cass_int64_t ,
1111
1120
) -> CassError {
1112
- let val: & CassValue = ptr_to_ref ( value) ;
1121
+ let val: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
1113
1122
1114
1123
match & val. value {
1115
1124
Some ( Value :: RegularValue ( CqlValue :: Duration ( duration) ) ) => {
@@ -1130,11 +1139,7 @@ pub unsafe extern "C" fn cass_value_get_bytes(
1130
1139
output : * mut * const cass_byte_t ,
1131
1140
output_size : * mut size_t ,
1132
1141
) -> CassError {
1133
- if value. is_null ( ) {
1134
- return CassError :: CASS_ERROR_LIB_NULL_VALUE ;
1135
- }
1136
-
1137
- let value_from_raw: & CassValue = ptr_to_ref ( value) ;
1142
+ let value_from_raw: & CassValue = val_ptr_to_ref_ensure_non_null ! ( value) ;
1138
1143
1139
1144
// FIXME: This should be implemented for all CQL types
1140
1145
// Note: currently rust driver does not allow to get raw bytes of the CQL value.
0 commit comments