You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by Chris Beaumont <dr...@yahoo.com> on 2010/04/06 18:36:16 UTC

odd problem retrieving binary values using C++

Hi all...

I am having a pretty tough time retrieving binary values out of my DB...
I am using cassandra 0.5.1 on Centos 5.4 with java 1.6.0-19

Here is the simple test I am trying to run in C++

/* snip initialization */
 {
    transport->open();
 
    ColumnPath new_col;
    new_col.__isset.column = true; /* this is required! */
    new_col.column_family.assign("Standard2");
    new_col.super_column.assign("");
    new_col.column.assign("testing");

    char *data_cstr="this\0 is\0 data!";
    std::string data;
    data.assign(data_cstr, 15);

    printf("Data '%s' has length %lu\n", data.c_str(), data.length());
    // This properly returns 15
 
    client.insert("Keyspace1","newone",new_col,data,55,ONE);
 
    ColumnOrSuperColumn ret_val;
 
    client.get(ret_val,"Keyspace1","newone",new_col,ONE);
 
    printf("Column name retrieved is: %s\n", ret_val.column.name.c_str());
    printf("Value in column retrieved is: %s\n", ret_val.column.value.c_str());
    // This only ever returns  'this'  (i.e., everything before the first \0)
    // I understand null termination in %s... see below
    printf("Value has length %lu\n", ret_val.column.value.length());
    // and this gives me 4
 
    transport->close();
  }
/* snip the rest too! */

Am I missing something major in proceeding this way? 

I have tried GDB and eventually all I get back is a string containing 'this'.
Here is the dumped content of Keyspace1/Standard2-1-Data.db...
od -c /u01/cassandra/data/Keyspace1/Standard2-1-Data.db

0000000  \0   -   1   1   5   5   7   1   6   5   7   6   3   3   4   2
0000020   7   0   7   9   0   1   4   5   2   8   3   5   8   0   2   3
0000040   7   5   1   9   9   5   2   8   :   n   e   w   o   n   e  \0
0000060  \0  \0 264  \0  \0  \0   U  \0  \0  \0 003 254 355  \0 005   s
0000100   r  \0 020   j   a   v   a   .   u   t   i   l   .   B   i   t
0000120   S   e   t   n 375 210   ~   9   4 253   ! 003  \0 001   [  \0
0000140 004   b   i   t   s   t  \0 002   [   J   x   p   u   r  \0 002
0000160   [   J   x     004 265 022 261   u 223 002  \0  \0   x   p  \0
0000200  \0  \0 001  \0 202  \b  \0  \0  \0  \0  \0   x  \0  \0  \0   "
0000220  \0  \a   t   e   s   t   i   n   g  \0  \a   t   e   s   t   i
0000240   n   g  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000260  \0   % 200  \0  \0  \0 200  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000300  \0 001  \0  \a   t   e   s   t   i   n   g  \0  \0  \0  \0  \0
0000320  \0  \0  \0   7  \0  \0  \0 017   t   h   i   s  \0       i   s
0000340  \0       d   a   t   a   !
0000347

This shows that the data is stored properly to the db file.

# bin/cassandra-cli -host localhost
Connected to localhost/9160
Welcome to cassandra CLI.
cassandra> get Keyspace1.Standard2['newone'] 
=> (column=testing, value=this is data!, timestamp=55)
Returned 1 results.

Shows the same thing! It's there !!!

I would lean towards a Thrift interface problem... 

In any case... I'd be thankful if someone had a pointer/workaround to this show-stopper
of mine...

Best

Chris.



      


Re: odd problem retrieving binary values using C++

Posted by Jonathan Ellis <jb...@gmail.com>.
Glad it's working now! :)

On Tue, Apr 6, 2010 at 12:14 PM, Chris Beaumont <dr...@yahoo.com> wrote:
> mmmh...  well... wasn't long before I figured out the problem sits between
> the chair and the keyboard!!!
>
> I had a bad case of copy/paste dealing with super-columns and multiple
> rows in the actual code (original post was wayyyyyyy stripped).
>
> Everything is fine and returning the proper buffer size (as long as I refer to
> the right variable that was !)
>
> Apologies for the long and silly original post...
>
> Chris.
>
>
>
> ----- Original Message ----
> From: Chris Beaumont <dr...@yahoo.com>
> To: user@cassandra.apache.org
> Sent: Tue, April 6, 2010 9:36:16 AM
> Subject: odd problem retrieving binary values using C++
>
> Hi all...
>
> I am having a pretty tough time retrieving binary values out of my DB...
> I am using cassandra 0.5.1 on Centos 5.4 with java 1.6.0-19
>
> Here is the simple test I am trying to run in C++
>
> /* snip initialization */
> {
>    transport->open();
>
>    ColumnPath new_col;
>    new_col.__isset.column = true; /* this is required! */
>    new_col.column_family.assign("Standard2");
>    new_col.super_column.assign("");
>    new_col.column.assign("testing");
>
>    char *data_cstr="this\0 is\0 data!";
>    std::string data;
>    data.assign(data_cstr, 15);
>
>    printf("Data '%s' has length %lu\n", data.c_str(), data.length());
>    // This properly returns 15
>
>    client.insert("Keyspace1","newone",new_col,data,55,ONE);
>
>    ColumnOrSuperColumn ret_val;
>
>    client.get(ret_val,"Keyspace1","newone",new_col,ONE);
>
>    printf("Column name retrieved is: %s\n", ret_val.column.name.c_str());
>    printf("Value in column retrieved is: %s\n", ret_val.column.value.c_str());
>    // This only ever returns  'this'  (i.e., everything before the first \0)
>    // I understand null termination in %s... see below
>    printf("Value has length %lu\n", ret_val.column.value.length());
>    // and this gives me 4
>
>    transport->close();
>  }
> /* snip the rest too! */
>
> Am I missing something major in proceeding this way?
>
> I have tried GDB and eventually all I get back is a string containing 'this'.
> Here is the dumped content of Keyspace1/Standard2-1-Data.db...
> od -c /u01/cassandra/data/Keyspace1/Standard2-1-Data.db
>
> 0000000  \0   -   1   1   5   5   7   1   6   5   7   6   3   3   4   2
> 0000020   7   0   7   9   0   1   4   5   2   8   3   5   8   0   2   3
> 0000040   7   5   1   9   9   5   2   8   :   n   e   w   o   n   e  \0
> 0000060  \0  \0 264  \0  \0  \0   U  \0  \0  \0 003 254 355  \0 005   s
> 0000100   r  \0 020   j   a   v   a   .   u   t   i   l   .   B   i   t
> 0000120   S   e   t   n 375 210   ~   9   4 253   ! 003  \0 001   [  \0
> 0000140 004   b   i   t   s   t  \0 002   [   J   x   p   u   r  \0 002
> 0000160   [   J   x     004 265 022 261   u 223 002  \0  \0   x   p  \0
> 0000200  \0  \0 001  \0 202  \b  \0  \0  \0  \0  \0   x  \0  \0  \0   "
> 0000220  \0  \a   t   e   s   t   i   n   g  \0  \a   t   e   s   t   i
> 0000240   n   g  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
> 0000260  \0   % 200  \0  \0  \0 200  \0  \0  \0  \0  \0  \0  \0  \0  \0
> 0000300  \0 001  \0  \a   t   e   s   t   i   n   g  \0  \0  \0  \0  \0
> 0000320  \0  \0  \0   7  \0  \0  \0 017   t   h   i   s  \0       i   s
> 0000340  \0       d   a   t   a   !
> 0000347
>
> This shows that the data is stored properly to the db file.
>
> # bin/cassandra-cli -host localhost
> Connected to localhost/9160
> Welcome to cassandra CLI.
> cassandra> get Keyspace1.Standard2['newone']
> => (column=testing, value=this is data!, timestamp=55)
> Returned 1 results.
>
> Shows the same thing! It's there !!!
>
> I would lean towards a Thrift interface problem...
>
> In any case... I'd be thankful if someone had a pointer/workaround to this show-stopper
> of mine...
>
> Best
>
> Chris.
>
>
>
>
>

Re: odd problem retrieving binary values using C++

Posted by Chris Beaumont <dr...@yahoo.com>.
mmmh...  well... wasn't long before I figured out the problem sits between
the chair and the keyboard!!!

I had a bad case of copy/paste dealing with super-columns and multiple
rows in the actual code (original post was wayyyyyyy stripped).

Everything is fine and returning the proper buffer size (as long as I refer to
the right variable that was !)

Apologies for the long and silly original post... 

Chris.



----- Original Message ----
From: Chris Beaumont <dr...@yahoo.com>
To: user@cassandra.apache.org
Sent: Tue, April 6, 2010 9:36:16 AM
Subject: odd problem retrieving binary values using C++

Hi all...

I am having a pretty tough time retrieving binary values out of my DB...
I am using cassandra 0.5.1 on Centos 5.4 with java 1.6.0-19

Here is the simple test I am trying to run in C++

/* snip initialization */
{
    transport->open();

    ColumnPath new_col;
    new_col.__isset.column = true; /* this is required! */
    new_col.column_family.assign("Standard2");
    new_col.super_column.assign("");
    new_col.column.assign("testing");

    char *data_cstr="this\0 is\0 data!";
    std::string data;
    data.assign(data_cstr, 15);

    printf("Data '%s' has length %lu\n", data.c_str(), data.length());
    // This properly returns 15

    client.insert("Keyspace1","newone",new_col,data,55,ONE);

    ColumnOrSuperColumn ret_val;

    client.get(ret_val,"Keyspace1","newone",new_col,ONE);

    printf("Column name retrieved is: %s\n", ret_val.column.name.c_str());
    printf("Value in column retrieved is: %s\n", ret_val.column.value.c_str());
    // This only ever returns  'this'  (i.e., everything before the first \0)
    // I understand null termination in %s... see below
    printf("Value has length %lu\n", ret_val.column.value.length());
    // and this gives me 4

    transport->close();
  }
/* snip the rest too! */

Am I missing something major in proceeding this way? 

I have tried GDB and eventually all I get back is a string containing 'this'.
Here is the dumped content of Keyspace1/Standard2-1-Data.db...
od -c /u01/cassandra/data/Keyspace1/Standard2-1-Data.db

0000000  \0   -   1   1   5   5   7   1   6   5   7   6   3   3   4   2
0000020   7   0   7   9   0   1   4   5   2   8   3   5   8   0   2   3
0000040   7   5   1   9   9   5   2   8   :   n   e   w   o   n   e  \0
0000060  \0  \0 264  \0  \0  \0   U  \0  \0  \0 003 254 355  \0 005   s
0000100   r  \0 020   j   a   v   a   .   u   t   i   l   .   B   i   t
0000120   S   e   t   n 375 210   ~   9   4 253   ! 003  \0 001   [  \0
0000140 004   b   i   t   s   t  \0 002   [   J   x   p   u   r  \0 002
0000160   [   J   x     004 265 022 261   u 223 002  \0  \0   x   p  \0
0000200  \0  \0 001  \0 202  \b  \0  \0  \0  \0  \0   x  \0  \0  \0   "
0000220  \0  \a   t   e   s   t   i   n   g  \0  \a   t   e   s   t   i
0000240   n   g  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000260  \0   % 200  \0  \0  \0 200  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000300  \0 001  \0  \a   t   e   s   t   i   n   g  \0  \0  \0  \0  \0
0000320  \0  \0  \0   7  \0  \0  \0 017   t   h   i   s  \0       i   s
0000340  \0       d   a   t   a   !
0000347

This shows that the data is stored properly to the db file.

# bin/cassandra-cli -host localhost
Connected to localhost/9160
Welcome to cassandra CLI.
cassandra> get Keyspace1.Standard2['newone'] 
=> (column=testing, value=this is data!, timestamp=55)
Returned 1 results.

Shows the same thing! It's there !!!

I would lean towards a Thrift interface problem... 

In any case... I'd be thankful if someone had a pointer/workaround to this show-stopper
of mine...

Best

Chris.