В драйвере DataStax C ++ я пытаюсь установить тип пользователя для другого типа пользователя (вложенный UDT).
Однако по какой-то причине я получаю сообщение об ошибке при попытке задать поле пользовательского типа с другим пользовательским типом.
CassDataType* outerDataType = cass_data_type_new_udt(1);
cass_data_type_add_sub_value_type_by_name(outerDataType, "OUTER_FIELD", CASS_VALUE_TYPE_UDT);
CassUserType* outerUserType = cass_user_type_new_from_data_type(outerDataType);
CassDataType* innerDataType = cass_data_type_new_udt(1);
cass_data_type_add_sub_value_type_by_name(innerDataType, "INNER_FIELD", CASS_VALUE_TYPE_INT);
CassUserType* innerUserType = cass_user_type_new_from_data_type(innerDataType);
// Bind values to user type fields
// No error, CASS_OK
CassError err = cass_user_type_set_int32_by_name(innerUserType, "INNER_FIELD", 32);
// CASS_ERROR_LIB_INVALID_VALUE_TYPE
err = cass_user_type_set_user_type_by_name(outerUserType, "OUTER_FIELD", innerUserType);
// Error: Invalid value type
printf(cass_error_desc(err));
cass_data_type_free(innerDataType);
cass_data_type_free(outerDataType);
cass_user_type_free(innerUserType);
cass_user_type_free(outerUserType);
Кто-нибудь знает, почему это так? Сама Кассандра, кажется, допускает вложенные UDT.
Я изменил вышеупомянутое, чтобы вместо этого получить определяемый пользователем тип из схемы Cassandra. Моя первоначальная проблема заключалась в использовании такого типа.
Проблема в конечном итоге стала проблемой чувствительности к регистру.
По некоторым причинам некоторые вызовы в драйвере DataStax C ++ чувствительны к регистру, например, cass_keyspace_meta_user_type_by_name, в то время как некоторые не такие как cass_user_type_set_user_type_by_name.
DataStax C ++ действительно допускает вложенные UDT. Просто будьте осторожны с их именами при определении их в Кассандре.
Других решений пока нет …