From d130665c30adef26a04ae1c5bdf5bdd3af96abaa Mon Sep 17 00:00:00 2001 From: Michael Penick Date: Tue, 5 Apr 2016 14:20:47 -0700 Subject: [PATCH 1/3] Added custom type bind/set/append functions --- include/cassandra.h | 296 ++++++++++++++++++++++++++++++++++++---- src/abstract_data.hpp | 1 + src/collection.cpp | 23 +++- src/collection.hpp | 1 + src/data_type.hpp | 11 ++ src/encode.hpp | 13 ++ src/statement.cpp | 43 ++++++ src/tuple.cpp | 27 +++- src/tuple.hpp | 1 + src/types.hpp | 11 ++ src/user_type_value.cpp | 43 ++++++ 11 files changed, 438 insertions(+), 32 deletions(-) diff --git a/include/cassandra.h b/include/cassandra.h index a6f5f6c84..6ea9096c4 100644 --- a/include/cassandra.h +++ b/include/cassandra.h @@ -3924,7 +3924,7 @@ cass_statement_bind_null(CassStatement* statement, * Binds a null to all the values with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -3976,9 +3976,6 @@ cass_statement_bind_int8(CassStatement* statement, * * @cassandra{2.2+} * - * This can only be used with statements created by - * cass_prepared_bind(). - * * @public @memberof CassStatement * * @param[in] statement @@ -4035,9 +4032,6 @@ cass_statement_bind_int16(CassStatement* statement, * * @cassandra{2.2+} * - * This can only be used with statements created by - * cass_prepared_bind(). - * * @public @memberof CassStatement * * @param[in] statement @@ -4091,7 +4085,7 @@ cass_statement_bind_int32(CassStatement* statement, * Binds an "int" to all the values with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4147,9 +4141,6 @@ cass_statement_bind_uint32(CassStatement* statement, * * @cassandra{2.2+} * - * This can only be used with statements created by - * cass_prepared_bind(). - * * @public @memberof CassStatement * * @param[in] statement @@ -4205,7 +4196,7 @@ cass_statement_bind_int64(CassStatement* statement, * with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4258,7 +4249,7 @@ cass_statement_bind_float(CassStatement* statement, * Binds a "float" to all the values with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4311,7 +4302,7 @@ cass_statement_bind_double(CassStatement* statement, * Binds a "double" to all the values with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4364,7 +4355,7 @@ cass_statement_bind_bool(CassStatement* statement, * Binds a "boolean" to all the values with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4440,7 +4431,7 @@ cass_statement_bind_string_n(CassStatement* statement, * with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4500,7 +4491,7 @@ cass_statement_bind_bytes(CassStatement* statement, * specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4539,6 +4530,94 @@ cass_statement_bind_bytes_by_name_n(CassStatement* statement, const cass_byte_t* value, size_t value_size); +/** + * Binds a "custom" to a query or bound statement at the specified index. + * + * @public @memberof CassStatement + * + * @param[in] statement + * @param[in] index + * @param[in] class_name + * @param[in] value The value is copied into the statement object; the + * memory pointed to by this parameter can be freed after this call. + * @param[in] value_size + * @return CASS_OK if successful, otherwise an error occurred. + */ +CASS_EXPORT CassError +cass_statement_bind_custom(CassStatement* statement, + size_t index, + const char* class_name, + const cass_byte_t* value, + size_t value_size); +/** + * Same as cass_statement_bind_custom(), but with lengths for string + * parameters. + * + * @public @memberof CassStatement + * + * @param[in] statement + * @param[in] index + * @param[in] class_name + * @param[in] class_name_length + * @param[in] value The value is copied into the statement object; the + * memory pointed to by this parameter can be freed after this call. + * @param[in] value_size + * @return CASS_OK if successful, otherwise an error occurred. + */ +CASS_EXPORT CassError +cass_statement_bind_custom_n(CassStatement* statement, + size_t index, + const char* class_name, + size_t class_name_length, + const cass_byte_t* value, + size_t value_size); + +/** + * Binds a "custom" to all the values with the specified name. + * + * This can only be used with statements created by + * cass_prepared_bind() when using Cassandra 2.0 or earlier. + * + * @public @memberof CassStatement + * + * @param[in] statement + * @param[in] name + * @param[in] value The value is copied into the statement object; the + * memory pointed to by this parameter can be freed after this call. + * @param[in] value_size + * @return CASS_OK if successful, otherwise an error occurred. + */ +CASS_EXPORT CassError +cass_statement_bind_custom_by_name(CassStatement* statement, + const char* name, + const char* class_name, + const cass_byte_t* value, + size_t value_size); + +/** + * Same as cass_statement_bind_custom_by_name(), but with lengths for string + * parameters. + * + * @public @memberof CassStatement + * + * @param[in] statement + * @param[in] name + * @param[in] name_length + * @param[in] value + * @param[in] value_size + * @return same as cass_statement_bind_custom_by_name() + * + * @see cass_statement_bind_custom_by_name() + */ +CASS_EXPORT CassError +cass_statement_bind_custom_by_name_n(CassStatement* statement, + 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); + /** * Binds a "uuid" or "timeuuid" to a query or bound statement at the specified index. * @@ -4559,7 +4638,7 @@ cass_statement_bind_uuid(CassStatement* statement, * with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4612,7 +4691,7 @@ cass_statement_bind_inet(CassStatement* statement, * Binds an "inet" to all the values with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4670,7 +4749,7 @@ cass_statement_bind_decimal(CassStatement* statement, * Binds a "decimal" to all the values with the specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4734,7 +4813,7 @@ cass_statement_bind_collection(CassStatement* statement, * specified name. * * This can only be used with statements created by - * cass_prepared_bind(). + * cass_prepared_bind() when using Cassandra 2.0 or earlier. * * @public @memberof CassStatement * @@ -4790,9 +4869,6 @@ cass_statement_bind_tuple(CassStatement* statement, * * @cassandra{2.1+} * - * This can only be used with statements created by - * cass_prepared_bind(). - * * @public @memberof CassStatement * * @param[in] statement @@ -5751,6 +5827,46 @@ cass_collection_append_bytes(CassCollection* collection, const cass_byte_t* value, size_t value_size); +/** + * Appends a "custom" to the collection. + * + * @public @memberof CassCollection + * + * @param[in] collection + * @param[in] class_name + * @param[in] value The value is copied into the collection object; the + * memory pointed to by this parameter can be freed after this call. + * @param[in] value_size + * @return CASS_OK if successful, otherwise an error occurred. + */ +CASS_EXPORT CassError +cass_collection_append_custom(CassCollection* collection, + const char* class_name, + const cass_byte_t* value, + size_t value_size); + +/** + * Same as cass_collection_append_custom(), but with lengths for string + * parameters. + * + * @public @memberof CassCollection + * + * @param[in] collection + * @param[in] class_name + * @param[in] class_name_length + * @param[in] value + * @param[in] value_length + * @return same as cass_collection_append_custom() + * + * @see cass_collection_append_custom() + */ +CASS_EXPORT CassError +cass_collection_append_custom_n(CassCollection* collection, + const char* class_name, + size_t class_name_length, + const cass_byte_t* value, + size_t value_size); + /** * Appends a "uuid" or "timeuuid" to the collection. * @@ -6111,6 +6227,50 @@ cass_tuple_set_bytes(CassTuple* tuple, const cass_byte_t* value, size_t value_size); +/** + * Sets a "custom" in a tuple at the specified index. + * + * @public @memberof CassTuple + * + * @param[in] tuple + * @param[in] index + * @param[in] class_name + * @param[in] value The value is copied into the tuple object; the + * memory pointed to by this parameter can be freed after this call. + * @param[in] value_size + * @return CASS_OK if successful, otherwise an error occurred. + */ +CASS_EXPORT CassError +cass_tuple_set_custom(CassTuple* tuple, + size_t index, + const char* class_name, + const cass_byte_t* value, + size_t value_size); + +/** + * Same as cass_tuple_set_custom(), but with lengths for string + * parameters. + * + * @public @memberof CassTuple + * + * @param[in] tuple + * @param[in] index + * @param[in] class_name + * @param[in] class_name_length + * @param[in] value + * @param[in] value_length + * @return same as cass_tuple_set_custom() + * + * @see cass_tuple_set_custom() + */ +CASS_EXPORT CassError +cass_tuple_set_custom_n(CassTuple* tuple, + size_t index, + const char* class_name, + size_t class_name_length, + const cass_byte_t* value, + size_t value_size); + /** * Sets a "uuid" or "timeuuid" in a tuple at the specified index. * @@ -6911,6 +7071,94 @@ cass_user_type_set_bytes_by_name_n(CassUserType* user_type, const cass_byte_t* value, size_t value_size); +/** + * Sets a "custom" in a user defined type at the specified index. + * + * @public @memberof CassUserType + * + * @param[in] user_type + * @param[in] index + * @param[in] class_name + * @param[in] value + * @param[in] value_size + * @return CASS_OK if successful, otherwise an error occurred. + */ +CASS_EXPORT CassError +cass_user_type_set_custom(CassUserType* user_type, + size_t index, + const char* class_name, + const cass_byte_t* value, + size_t value_size); + +/** + * Same as cass_user_type_set_custom(), but with lengths for string + * parameters. + * + * @public @memberof CassUserType + * + * @param[in] user_type + * @param[in] index + * @param[in] class_name + * @param[in] class_name_length + * @param[in] value + * @param[in] value_size + * @return same as cass_user_type_set_custom() + * + * @see cass_user_type_set_custom() + */ +CASS_EXPORT CassError +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); + +/** + * Sets a "custom" in a user defined type at the specified name. + * + * @public @memberof CassUserType + * + * @param[in] user_type + * @param[in] name + * @param[in] class_name + * @param[in] value + * @param[in] value_size + * @return CASS_OK if successful, otherwise an error occurred. + */ +CASS_EXPORT CassError +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); + +/** + * Same as cass_user_type_set_custom_by_name(), but with lengths for string + * parameters. + * + * @public @memberof CassUserType + * + * @param[in] user_type + * @param[in] name + * @param[in] name_length + * @param[in] class_name + * @param[in] class_name_length + * @param[in] value + * @param[in] value_size + * @return same as cass_user_type_set_custom_by_name() + * + * @see cass_user_type_set_custom_by_name() + */ +CASS_EXPORT CassError +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); + /** * Sets a "uuid" or "timeuuid" in a user defined type at the specified index. * diff --git a/src/abstract_data.hpp b/src/abstract_data.hpp index 40518132c..3d15a37be 100644 --- a/src/abstract_data.hpp +++ b/src/abstract_data.hpp @@ -108,6 +108,7 @@ class AbstractData { SET_TYPE(cass_bool_t) SET_TYPE(CassString) SET_TYPE(CassBytes) + SET_TYPE(CassCustom) SET_TYPE(CassUuid) SET_TYPE(CassInet) SET_TYPE(CassDecimal) diff --git a/src/collection.cpp b/src/collection.cpp index 1069eb75d..dc075aab8 100644 --- a/src/collection.cpp +++ b/src/collection.cpp @@ -82,15 +82,30 @@ CASS_COLLECTION_APPEND(decimal, CassError cass_collection_append_string(CassCollection* collection, const char* value) { - collection->append(cass::CassString(value, strlen(value))); - return CASS_OK; + return collection->append(cass::CassString(value, strlen(value))); } CassError cass_collection_append_string_n(CassCollection* collection, const char* value, size_t value_length) { - collection->append(cass::CassString(value, value_length)); - return CASS_OK; + return collection->append(cass::CassString(value, value_length)); +} + +CassError cass_collection_append_custom(CassCollection* collection, + const char* class_name, + const cass_byte_t* value, + size_t value_size) { + return collection->append(cass::CassCustom(cass::StringRef(class_name), + value, value_size)); +} + +CassError cass_collection_append_custom_n(CassCollection* collection, + const char* class_name, + size_t class_name_length, + const cass_byte_t* value, + size_t value_size) { + return collection->append(cass::CassCustom(cass::StringRef(class_name, class_name_length), + value, value_size)); } } // extern "C" diff --git a/src/collection.hpp b/src/collection.hpp index 7406952ed..ed1e99599 100644 --- a/src/collection.hpp +++ b/src/collection.hpp @@ -71,6 +71,7 @@ class Collection : public RefCounted { APPEND_TYPE(cass_bool_t) APPEND_TYPE(CassString) APPEND_TYPE(CassBytes) + APPEND_TYPE(CassCustom) APPEND_TYPE(CassUuid) APPEND_TYPE(CassInet) APPEND_TYPE(CassDecimal) diff --git a/src/data_type.hpp b/src/data_type.hpp index d9a51bf18..b20bad91d 100644 --- a/src/data_type.hpp +++ b/src/data_type.hpp @@ -148,6 +148,8 @@ class DataType : public RefCounted { class CustomType : public DataType { public: + typedef SharedRefPtr ConstPtr; + CustomType() : DataType(CASS_VALUE_TYPE_CUSTOM) { } @@ -533,6 +535,15 @@ struct IsValidDataType { } }; +template<> +struct IsValidDataType { + bool operator()(const CassCustom& custom, const DataType::ConstPtr& data_type) const { + if (!data_type->is_custom()) return false; + CustomType::ConstPtr custom_type(data_type); + return custom.class_name == custom_type->class_name(); + } +}; + template<> struct IsValidDataType { bool operator()(CassUuid, const DataType::ConstPtr& data_type) const { diff --git a/src/encode.hpp b/src/encode.hpp index 6ec40c5f9..729ab3349 100644 --- a/src/encode.hpp +++ b/src/encode.hpp @@ -104,6 +104,13 @@ inline Buffer encode_with_length(CassBytes value) { return buf; } +inline Buffer encode_with_length(CassCustom value) { + Buffer buf(sizeof(int32_t) + value.size); + size_t pos = buf.encode_int32(0, value.size); + buf.copy(pos, reinterpret_cast(value.data), value.size); + return buf; +} + inline Buffer encode_with_length(CassUuid value) { Buffer buf(sizeof(int32_t) + sizeof(CassUuid)); size_t pos = buf.encode_int32(0, sizeof(CassUuid)); @@ -186,6 +193,12 @@ inline Buffer encode(CassBytes value) { return buf; } +inline Buffer encode(CassCustom value) { + Buffer buf(value.size); + buf.copy(0, reinterpret_cast(value.data), value.size); + return buf; +} + inline Buffer encode(CassUuid value) { Buffer buf(sizeof(CassUuid)); buf.encode_uuid(0, value); diff --git a/src/statement.cpp b/src/statement.cpp index 9de50bb38..5fdac1096 100644 --- a/src/statement.cpp +++ b/src/statement.cpp @@ -182,6 +182,49 @@ CassError cass_statement_bind_string_by_name_n(CassStatement* statement, cass::CassString(value, strlen(value))); } +CassError cass_statement_bind_custom(CassStatement* statement, + size_t index, + const char* class_name, + const cass_byte_t* value, + size_t value_size) { + return statement->set(index, + cass::CassCustom(cass::StringRef(class_name), + value, value_size)); +} + +CassError cass_statement_bind_custom_n(CassStatement* statement, + size_t index, + const char* class_name, + size_t class_name_length, + const cass_byte_t* value, + size_t value_size) { + return statement->set(index, + cass::CassCustom(cass::StringRef(class_name, class_name_length), + value, value_size)); +} + +CassError cass_statement_bind_custom_by_name(CassStatement* statement, + const char* name, + const char* class_name, + const cass_byte_t* value, + size_t value_size) { + return statement->set(cass::StringRef(name), + cass::CassCustom(cass::StringRef(class_name), + value, value_size)); +} + +CassError cass_statement_bind_custom_by_name_n(CassStatement* statement, + 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) { + return statement->set(cass::StringRef(name, name_length), + cass::CassCustom(cass::StringRef(class_name, class_name_length), + value, value_size)); +} + } // extern "C" namespace cass { diff --git a/src/tuple.cpp b/src/tuple.cpp index 78659e674..5f8579292 100644 --- a/src/tuple.cpp +++ b/src/tuple.cpp @@ -78,16 +78,35 @@ CASS_TUPLE_SET(decimal, CassError cass_tuple_set_string(CassTuple* tuple, size_t index, const char* value) { - tuple->set(index, cass::CassString(value, strlen(value))); - return CASS_OK; + return tuple->set(index, cass::CassString(value, strlen(value))); } CassError cass_tuple_set_string_n(CassTuple* tuple, size_t index, const char* value, size_t value_length) { - tuple->set(index, cass::CassString(value, value_length)); - return CASS_OK; + return tuple->set(index, cass::CassString(value, value_length)); +} + +CassError cass_tuple_set_custom(CassTuple* tuple, + size_t index, + const char* class_name, + const cass_byte_t* value, + size_t value_size) { + return tuple->set(index, + cass::CassCustom(cass::StringRef(class_name), + value, value_size)); +} + +CassError cass_tuple_set_custom_n(CassTuple* tuple, + size_t index, + const char* class_name, + size_t class_name_length, + const cass_byte_t* value, + size_t value_size) { + return tuple->set(index, + cass::CassCustom(cass::StringRef(class_name, class_name_length), + value, value_size)); } } // extern "C" diff --git a/src/tuple.hpp b/src/tuple.hpp index 56c9f2ccb..ea3ba145c 100644 --- a/src/tuple.hpp +++ b/src/tuple.hpp @@ -64,6 +64,7 @@ class Tuple { SET_TYPE(cass_bool_t) SET_TYPE(CassString) SET_TYPE(CassBytes) + SET_TYPE(CassCustom) SET_TYPE(CassUuid) SET_TYPE(CassInet) SET_TYPE(CassDecimal) diff --git a/src/types.hpp b/src/types.hpp index d889e8d13..7ba2e2e78 100644 --- a/src/types.hpp +++ b/src/types.hpp @@ -18,6 +18,7 @@ #define __CASS_TYPES_HPP_INCLUDED__ #include "cassandra.h" +#include "string_ref.hpp" namespace cass { @@ -32,6 +33,16 @@ struct CassBytes { size_t size; }; +struct CassCustom { + CassCustom(StringRef class_name, + const cass_byte_t* data, size_t size) + : class_name(class_name) + , data(data), size(size) { } + StringRef class_name; + const cass_byte_t* data; + size_t size; +}; + struct CassString { CassString(const char* data, size_t length) : data(data), length(length) { } diff --git a/src/user_type_value.cpp b/src/user_type_value.cpp index e9930daaf..ddfad02b5 100644 --- a/src/user_type_value.cpp +++ b/src/user_type_value.cpp @@ -109,4 +109,47 @@ CassError cass_user_type_set_string_by_name_n(CassUserType* user_type, cass::CassString(value, value_length)); } +CassError cass_user_type_set_custom(CassUserType* user_type, + size_t index, + const char* class_name, + const cass_byte_t* value, + size_t value_size) { + return user_type->set(index, + cass::CassCustom(cass::StringRef(class_name), + value, value_size)); +} + +CassError 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) { + return user_type->set(index, + cass::CassCustom(cass::StringRef(class_name, class_name_length), + value, value_size)); +} + +CassError 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) { + return user_type->set(cass::StringRef(name), + cass::CassCustom(cass::StringRef(class_name), + value, value_size)); +} + +CassError 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) { + return user_type->set(cass::StringRef(name, name_length), + cass::CassCustom(cass::StringRef(class_name, class_name_length), + value, value_size)); +} + } // extern "C" From 444d7bc8628700a6b71d697c073a761f2382f016 Mon Sep 17 00:00:00 2001 From: Michael Penick Date: Mon, 11 Apr 2016 16:40:34 -0700 Subject: [PATCH 2/3] Fix: Use const for data_type parameter of cass_data_type_class_name() --- include/cassandra.h | 2 +- src/data_type.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/cassandra.h b/include/cassandra.h index 6ea9096c4..26d31f91e 100644 --- a/include/cassandra.h +++ b/include/cassandra.h @@ -5376,7 +5376,7 @@ cass_data_type_set_keyspace_n(CassDataType* data_type, * @return CASS_OK if successful, otherwise an error occurred. */ CASS_EXPORT CassError -cass_data_type_class_name(CassDataType* data_type, +cass_data_type_class_name(const CassDataType* data_type, const char** class_name, size_t* class_name_length); diff --git a/src/data_type.cpp b/src/data_type.cpp index 8bf4c1ac7..679628cc1 100644 --- a/src/data_type.cpp +++ b/src/data_type.cpp @@ -205,15 +205,15 @@ CassError cass_data_type_set_keyspace_n(CassDataType* data_type, return CASS_OK; } -CassError cass_data_type_class_name(CassDataType* data_type, +CassError cass_data_type_class_name(const CassDataType* data_type, const char** class_name, size_t* class_name_length) { if (!data_type->is_custom()) { return CASS_ERROR_LIB_INVALID_VALUE_TYPE; } - cass::CustomType* custom_type - = static_cast(data_type->from()); + const cass::CustomType* custom_type + = static_cast(data_type->from()); *class_name = custom_type->class_name().data(); *class_name_length = custom_type->class_name().size(); From 8f44fa8a96187b5222430d2984c2b1dedfef2ec6 Mon Sep 17 00:00:00 2001 From: Michael Penick Date: Tue, 12 Apr 2016 15:12:42 -0700 Subject: [PATCH 3/3] Added errors for geotypes --- include/cassandra.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/cassandra.h b/include/cassandra.h index 26d31f91e..8b06ba81d 100644 --- a/include/cassandra.h +++ b/include/cassandra.h @@ -653,6 +653,11 @@ typedef enum CassErrorSource_ { XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_PARAMETER_UNSET, 25, "Parameter unset") \ XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_INVALID_ERROR_RESULT_TYPE, 26, "Invalid error result type") \ XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_INVALID_FUTURE_TYPE, 27, "Invalid future type") \ + XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_INTERNAL_ERROR, 28, "Internal error") \ + XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_INVALID_CUSTOM_TYPE, 29, "Invalid custom type") \ + XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_INVALID_DATA, 30, "Invalid data") \ + XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_NOT_ENOUGH_DATA, 31, "Not enough data") \ + XX(CASS_ERROR_SOURCE_LIB, CASS_ERROR_LIB_INVALID_STATE, 32, "Invalid state") \ XX(CASS_ERROR_SOURCE_SERVER, CASS_ERROR_SERVER_SERVER_ERROR, 0x0000, "Server error") \ XX(CASS_ERROR_SOURCE_SERVER, CASS_ERROR_SERVER_PROTOCOL_ERROR, 0x000A, "Protocol error") \ XX(CASS_ERROR_SOURCE_SERVER, CASS_ERROR_SERVER_BAD_CREDENTIALS, 0x0100, "Bad credentials") \