1 /*
2   Copyright (c) DataStax, Inc.
3 
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7 
8   http://www.apache.org/licenses/LICENSE-2.0
9 
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15 */
16 
17 #include "user_type_value.hpp"
18 
19 #include "collection.hpp"
20 #include "external.hpp"
21 #include "macros.hpp"
22 #include "tuple.hpp"
23 #include "utils.hpp"
24 
25 #include <string.h>
26 
27 using namespace datastax;
28 using namespace datastax::internal;
29 using namespace datastax::internal::core;
30 
31 extern "C" {
32 
cass_user_type_new_from_data_type(const CassDataType * data_type)33 CassUserType* cass_user_type_new_from_data_type(const CassDataType* data_type) {
34   if (!data_type->is_user_type()) {
35     return NULL;
36   }
37   return CassUserType::to(new UserTypeValue(DataType::ConstPtr(data_type)));
38 }
39 
cass_user_type_free(CassUserType * user_type)40 void cass_user_type_free(CassUserType* user_type) { delete user_type->from(); }
41 
cass_user_type_data_type(const CassUserType * user_type)42 const CassDataType* cass_user_type_data_type(const CassUserType* user_type) {
43   return CassDataType::to(user_type->data_type().get());
44 }
45 
46 #define CASS_USER_TYPE_SET(Name, Params, Value)                                              \
47   CassError cass_user_type_set_##Name(CassUserType* user_type, size_t index Params) {        \
48     return user_type->set(index, Value);                                                     \
49   }                                                                                          \
50   CassError cass_user_type_set_##Name##_by_name(CassUserType* user_type,                     \
51                                                 const char* name Params) {                   \
52     return user_type->set(StringRef(name), Value);                                           \
53   }                                                                                          \
54   CassError cass_user_type_set_##Name##_by_name_n(CassUserType* user_type, const char* name, \
55                                                   size_t name_length Params) {               \
56     return user_type->set(StringRef(name, name_length), Value);                              \
57   }
58 
CASS_USER_TYPE_SET(null,ZERO_PARAMS_ (),CassNull ())59 CASS_USER_TYPE_SET(null, ZERO_PARAMS_(), CassNull())
60 CASS_USER_TYPE_SET(int8, ONE_PARAM_(cass_int8_t value), value)
61 CASS_USER_TYPE_SET(int16, ONE_PARAM_(cass_int16_t value), value)
62 CASS_USER_TYPE_SET(int32, ONE_PARAM_(cass_int32_t value), value)
63 CASS_USER_TYPE_SET(uint32, ONE_PARAM_(cass_uint32_t value), value)
64 CASS_USER_TYPE_SET(int64, ONE_PARAM_(cass_int64_t value), value)
65 CASS_USER_TYPE_SET(float, ONE_PARAM_(cass_float_t value), value)
66 CASS_USER_TYPE_SET(double, ONE_PARAM_(cass_double_t value), value)
67 CASS_USER_TYPE_SET(bool, ONE_PARAM_(cass_bool_t value), value)
68 CASS_USER_TYPE_SET(inet, ONE_PARAM_(CassInet value), value)
69 CASS_USER_TYPE_SET(uuid, ONE_PARAM_(CassUuid value), value)
70 CASS_USER_TYPE_SET(collection, ONE_PARAM_(const CassCollection* value), value)
71 CASS_USER_TYPE_SET(tuple, ONE_PARAM_(const CassTuple* value), value)
72 CASS_USER_TYPE_SET(user_type, ONE_PARAM_(const CassUserType* value), value)
73 CASS_USER_TYPE_SET(bytes, TWO_PARAMS_(const cass_byte_t* value, size_t value_size),
74                    CassBytes(value, value_size))
75 CASS_USER_TYPE_SET(decimal, THREE_PARAMS_(const cass_byte_t* varint, size_t varint_size, int scale),
76                    CassDecimal(varint, varint_size, scale))
77 CASS_USER_TYPE_SET(duration,
78                    THREE_PARAMS_(cass_int32_t months, cass_int32_t days, cass_int64_t nanos),
79                    CassDuration(months, days, nanos))
80 
81 #undef CASS_USER_TYPE_SET
82 
83 CassError cass_user_type_set_string(CassUserType* user_type, size_t index, const char* value) {
84   return user_type->set(index, CassString(value, SAFE_STRLEN(value)));
85 }
86 
cass_user_type_set_string_n(CassUserType * user_type,size_t index,const char * value,size_t value_length)87 CassError cass_user_type_set_string_n(CassUserType* user_type, size_t index, const char* value,
88                                       size_t value_length) {
89   return user_type->set(index, CassString(value, value_length));
90 }
91 
cass_user_type_set_string_by_name(CassUserType * user_type,const char * name,const char * value)92 CassError cass_user_type_set_string_by_name(CassUserType* user_type, const char* name,
93                                             const char* value) {
94   return user_type->set(StringRef(name), CassString(value, SAFE_STRLEN(value)));
95 }
96 
cass_user_type_set_string_by_name_n(CassUserType * user_type,const char * name,size_t name_length,const char * value,size_t value_length)97 CassError cass_user_type_set_string_by_name_n(CassUserType* user_type, const char* name,
98                                               size_t name_length, const char* value,
99                                               size_t value_length) {
100   return user_type->set(StringRef(name, name_length), CassString(value, value_length));
101 }
102 
cass_user_type_set_custom(CassUserType * user_type,size_t index,const char * class_name,const cass_byte_t * value,size_t value_size)103 CassError cass_user_type_set_custom(CassUserType* user_type, size_t index, const char* class_name,
104                                     const cass_byte_t* value, size_t value_size) {
105   return user_type->set(index, CassCustom(StringRef(class_name), value, value_size));
106 }
107 
cass_user_type_set_custom_n(CassUserType * user_type,size_t index,const char * class_name,size_t class_name_length,const cass_byte_t * value,size_t value_size)108 CassError cass_user_type_set_custom_n(CassUserType* user_type, size_t index, const char* class_name,
109                                       size_t class_name_length, const cass_byte_t* value,
110                                       size_t value_size) {
111   return user_type->set(index,
112                         CassCustom(StringRef(class_name, class_name_length), value, value_size));
113 }
114 
cass_user_type_set_custom_by_name(CassUserType * user_type,const char * name,const char * class_name,const cass_byte_t * value,size_t value_size)115 CassError cass_user_type_set_custom_by_name(CassUserType* user_type, const char* name,
116                                             const char* class_name, const cass_byte_t* value,
117                                             size_t value_size) {
118   return user_type->set(StringRef(name), CassCustom(StringRef(class_name), value, value_size));
119 }
120 
cass_user_type_set_custom_by_name_n(CassUserType * user_type,const char * name,size_t name_length,const char * class_name,size_t class_name_length,const cass_byte_t * value,size_t value_size)121 CassError cass_user_type_set_custom_by_name_n(CassUserType* user_type, const char* name,
122                                               size_t name_length, const char* class_name,
123                                               size_t class_name_length, const cass_byte_t* value,
124                                               size_t value_size) {
125   return user_type->set(StringRef(name, name_length),
126                         CassCustom(StringRef(class_name, class_name_length), value, value_size));
127 }
128 
129 } // extern "C"
130