You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by Padraig O'Sullivan <os...@gmail.com> on 2009/12/11 05:26:39 UTC

C++ Interface Issues

Hi!

I was curious if anyone has had success using the C++ interface to
Cassandra? I've been having some difficulties and just wanted to check
if I was doing something wrong before debugging further or if there
was any known issues with C++ interface.

I have a simple test program to demonstrate my issue (headers and
using namespace declarations omitted for clarity):

int main()
{
  shared_ptr<TTransport> socket(new TSocket(host, port));
  shared_ptr<TTransport> transport(new TBufferedTransport(socket));
  shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
  CassandraClient client(protocol);
  try
  {
    transport->open();
    ColumnPath old_col;
    old_col.column_family.assign("Data");
    old_col.super_column.assign("");
    old_col.column.assign("first");
    ColumnOrSuperColumn ret_val;
    client.get(ret_val,
               "drizzle",
               "padraig",
               old_col,
               ZERO);
    transport->close();
  }
  catch (InvalidRequestException &re)
  {
    printf("ERROR: %s\n", re.why.c_str());
  }
  catch (TException &tx)
  {
    printf("ERROR: %s\n", tx.what());
  }
}

Now, when I run this, I get the following (from the InvalidRequestException):

$ ./simple_get
ERROR: column parameter is not optional for standard CF Data
$

When I look at the relevant piece of code in the method
validateColumnPath() in ThriftValidation.java, I see the following:

if (column_path.column == null)
{
  throw new InvalidRequestException("column parameter is not optional
for standard CF " + column_path.column_family);
}

and I can confirm that the super_column and column members of the
ColumnPath object are appearing as null strings in this method but the
column parameter is not being passed as a null parameter from my C++
program.

So basically, I'm just wondering if anyone has successfully used the
C++ interface generated by thrift to Cassandra? Are there any issues
with it that I am not aware of? Has anyone else encountered this
problem?

I should mention that I checked out the latest version of thrift from
SVN and used that to generate the C++ files for interfacing with
cassandra and I used git to clone the latest version of Cassandra (the
output of show version from the CLI shows the Cassandra version as
0.5-beta1).

Thanks,
Padraig

Re: C++ Interface Issues

Posted by Jonathan Ellis <jb...@gmail.com>.
I think you are seeing the behavior described at in
http://issues.apache.org/jira/browse/THRIFT-455, where "In C++,
optional fields require applications to manually set __isset fields,
otherwise they are not serialized on writing."  Apparently this is
considered a "feature."

-Jonathan

On Thu, Dec 10, 2009 at 10:26 PM, Padraig O'Sullivan
<os...@gmail.com> wrote:
> Hi!
>
> I was curious if anyone has had success using the C++ interface to
> Cassandra? I've been having some difficulties and just wanted to check
> if I was doing something wrong before debugging further or if there
> was any known issues with C++ interface.
>
> I have a simple test program to demonstrate my issue (headers and
> using namespace declarations omitted for clarity):
>
> int main()
> {
>  shared_ptr<TTransport> socket(new TSocket(host, port));
>  shared_ptr<TTransport> transport(new TBufferedTransport(socket));
>  shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
>  CassandraClient client(protocol);
>  try
>  {
>    transport->open();
>    ColumnPath old_col;
>    old_col.column_family.assign("Data");
>    old_col.super_column.assign("");
>    old_col.column.assign("first");
>    ColumnOrSuperColumn ret_val;
>    client.get(ret_val,
>               "drizzle",
>               "padraig",
>               old_col,
>               ZERO);
>    transport->close();
>  }
>  catch (InvalidRequestException &re)
>  {
>    printf("ERROR: %s\n", re.why.c_str());
>  }
>  catch (TException &tx)
>  {
>    printf("ERROR: %s\n", tx.what());
>  }
> }
>
> Now, when I run this, I get the following (from the InvalidRequestException):
>
> $ ./simple_get
> ERROR: column parameter is not optional for standard CF Data
> $
>
> When I look at the relevant piece of code in the method
> validateColumnPath() in ThriftValidation.java, I see the following:
>
> if (column_path.column == null)
> {
>  throw new InvalidRequestException("column parameter is not optional
> for standard CF " + column_path.column_family);
> }
>
> and I can confirm that the super_column and column members of the
> ColumnPath object are appearing as null strings in this method but the
> column parameter is not being passed as a null parameter from my C++
> program.
>
> So basically, I'm just wondering if anyone has successfully used the
> C++ interface generated by thrift to Cassandra? Are there any issues
> with it that I am not aware of? Has anyone else encountered this
> problem?
>
> I should mention that I checked out the latest version of thrift from
> SVN and used that to generate the C++ files for interfacing with
> cassandra and I used git to clone the latest version of Cassandra (the
> output of show version from the CLI shows the Cassandra version as
> 0.5-beta1).
>
> Thanks,
> Padraig
>