Unable to retrive list of UDT

31 views
Skip to first unread message

Kumar

unread,
Dec 31, 2017, 6:44:39 AM12/31/17
to DataStax C++ Driver for Apache Cassandra User Mailing List
Hi All,

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

Kumar

unread,
Jan 1, 2018, 5:21:42 AM1/1/18
to DataStax C++ Driver for Apache Cassandra User Mailing List


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.

Michael Penick

unread,
Jan 9, 2018, 8:51:43 AM1/9/18
to cpp-dri...@lists.datastax.com
The "ssid" column is a `list<ssid>` so you need to iterate the list first before the fields of the UDT.

    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.

Reply all
Reply to author
Forward
0 new messages