I have created UDT through cqlsh
cqlsh> DESCRIBE TYPE example.ssid ;
CREATE TYPE example.ssid (
mac_address text,
channel_id int,
essid text,
frequency text,
quality text
);
created table with list of UDT
CREATE TABLE example.ssid ( user_id text PRIMARY KEY , ssid frozen <list <ssid >>);
inserted with following values
INSERT INTO example.ssid (user_id , ssid ) VALUES ( 'd0a2b28c6247452fad515e3a904241ba' , [ {mac_address: '54:67:51:E0:C9:97', channel_id: 1, essid: '9AD2E47', frequency: '2.412 GHz', quality: '62/70'}, {mac_address: '54:67:51:E0:C9:98', channel_id: 1, essid: '9AD2E47', frequency: '2.412 GHz', quality: '62/70'}, {mac_address: '54:67:51:E0:C9:99', channel_id: 1, essid: '9AD2E47', frequency: '2.412 GHz', quality: '62/70'} ]);
select * FROM example.ssid ;
user_id | ssid
----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
d0a2b28c6247452fad515e3a904241ba | [{mac_address: '54:67:51:E0:C9:97', channel_id: 1, essid: '9AD2E47', frequency: '2.412 GHz', quality: '62/70'}, {mac_address: '54:67:51:E0:C9:98', channel_id: 1, essid: '9AD2E47', frequency: '2.412 GHz', quality: '62/70'}, {mac_address: '54:67:51:E0:C9:99', channel_id: 1, essid: '9AD2E47', frequency: '2.412 GHz', quality: '62/70'}]
(1 rows)
Tyring to retive UDT from my cpp applicatoin. field_name * field_value is displying junk value.
const char* query = "SELECT * FROM example.ssid WHERE user_id = ?;";
CassStatement* statement = cass_statement_new(query, 1);
cass_statement_bind_string_by_name(statement, "user_id", uId.c_str());
CassFuture* query_future = cass_session_execute(session, statement);
if (cass_future_error_code(query_future) == CASS_OK)
{
// Retrieve result set and get the first row
const CassResult* result = cass_future_get_result(query_future);
const CassRow* row = cass_result_first_row(result);
const CassValue *userId, *udtValue;
/* Retrieve UDT value from column */
userId = cass_row_get_column_by_name(row, "user_id");
udtValue = cass_row_get_column_by_name(row, "ssid");
const char* strValue;
size_t strValueLen;
/* Create an iterator for the UDT value */
CassIterator* udt_iterator = cass_iterator_from_collection(udtValue);
while (cass_iterator_next(udt_iterator))
{
ngrest::LogDebug() << "inside while ";
const char* field_name;
size_t field_name_length;
/* Get UDT field name */
cass_iterator_get_user_type_field_name(udt_iterator,
&field_name, &field_name_length);
ngrest::LogDebug() << "field name - " << field_name;
/* Get UDT field value */
const CassValue* field_value =
cass_iterator_get_user_type_field_value(udt_iterator);
cass_value_get_string(field_value, &strValue, &strValueLen);
ngrest::LogDebug() << "field value - " << strValue;
}
cass_result_free(result);
Is the used API's calls is correct to retrive list of UDT's. If not please help on correct approach.
Thanks
Kuamr
And I tried the following approach, getting fields as NULL
if(rc == CASS_OK)
{
CassFuture* close_future = NULL;
const char* query = "SELECT * FROM ziggo.ssid WHERE user_id = ?;";
CassStatement* statement = cass_statement_new(query, 1);
cass_statement_bind_string_by_name(statement, "user_id", uId.c_str());
CassFuture* query_future = cass_session_execute(session, statement);
if (cass_future_error_code(query_future) == CASS_OK)
{
// Retrieve result set and get the first row
const CassResult* result = cass_future_get_result(query_future);
CassIterator *rows = cass_iterator_from_result(result);
while(cass_iterator_next(rows))
{
ngrest::LogDebug() << "inside while" ;
const CassRow* row = cass_iterator_get_row(rows);
const CassValue* udt_value = cass_row_get_column_by_name(row, "ssid");
CassIterator* fields = cass_iterator_fields_from_user_type(udt_value);
while(fields != NULL && cass_iterator_next(fields))
{
ngrest::LogDebug() << "inner while" ;
const char* field_name;
size_t field_name_length;
const CassValue* field_value = NULL;
cass_iterator_get_user_type_field_name(fields, &field_name, &field_name_length);
ngrest::LogDebug() << "field_name = " << field_name;
field_value = cass_iterator_get_user_type_field_value(fields);
const char* text;
size_t text_length;
cass_int32_t intValue;
if (cass_value_type(field_value) == CASS_VALUE_TYPE_VARCHAR)
{
cass_value_get_string(field_value, &text, &text_length);
ngrest::LogDebug() << "field_value = " << text;
sObj.mac_address = text;
}
else if(cass_value_type(field_value) == CASS_VALUE_TYPE_INT && !strcmp(field_name, "channel_id")){
cass_value_get_int32(field_value, &intValue);
ngrest::LogDebug() << "field_value = " << intValue;
sObj.channel_id = (int)intValue;
}
}
}
cass_result_free(result);
cass_iterator_free(rows);
}
Please suggest me regarding this issue.
const char* query = "SELECT * FROM example.ssid WHERE user_id = ?;";
CassStatement* statement = cass_statement_new(query, 1);
cass_statement_bind_string_by_name(statement, "user_id", "d0a2b28c6247452fad515e3a904241ba");
CassFuture* query_future = cass_session_execute(session, statement);
if (cass_future_error_code(query_future) == CASS_OK)
{
// Retrieve result set and get the first row
const CassResult* result = cass_future_get_result(query_future);
CassIterator *rows = cass_iterator_from_result(result);
while(cass_iterator_next(rows))
{
//ngrest::LogDebug() << "inside while" ;
const CassRow* row = cass_iterator_get_row(rows);
const CassValue* ssid_value = cass_row_get_column_by_name(row, "ssid");
CassIterator* list_iterator = cass_iterator_from_collection(ssid_value);
while (list_iterator && cass_iterator_next(list_iterator))
{
const CassValue* udt_value = cass_iterator_get_value(list_iterator);
CassIterator* fields = cass_iterator_fields_from_user_type(udt_value);
printf("Iterator %p\n", fields);
while(fields != NULL && cass_iterator_next(fields))
{
//ngrest::LogDebug() << "inner while" ;
const char* field_name;
size_t field_name_length;
const CassValue* field_value = NULL;
cass_iterator_get_user_type_field_name(fields, &field_name, &field_name_length);
printf("Field: %.*s\n", (int)field_name_length, field_name);
field_value = cass_iterator_get_user_type_field_value(fields);
const char* text;
size_t text_length;
cass_int32_t intValue;
if (cass_value_type(field_value) == CASS_VALUE_TYPE_VARCHAR)
{
cass_value_get_string(field_value, &text, &text_length);
printf("Field value: %.*s\n", (int)text_length, text);
//ngrest::LogDebug() << "field_value = " << text;
//sObj.mac_address = text;
}
else if(cass_value_type(field_value) == CASS_VALUE_TYPE_INT && !strcmp(field_name, "channel_id")){
cass_value_get_int32(field_value, &intValue);
printf("Field value: %d\n", intValue);
//ngrest::LogDebug() << "field_value = " << intValue;
//sObj.channel_id = (int)intValue;
}
}
}
cass_iterator_free(list_iterator);
}
cass_result_free(result);
cass_iterator_free(rows);
--
You received this message because you are subscribed to the Google Groups "DataStax C++ Driver for Apache Cassandra User Mailing List" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cpp-driver-user+unsubscribe@lists.datastax.com.