You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by Kevin Withnall <ke...@ilb.com.au> on 2010/10/04 06:02:40 UTC

PHP access to get or get_slice

I've just installed the latest version of cassandra (0.7.0 beta 2) and
re-made the relevant thrift libraries.

There doesn't seem to be many php examples around so i'm struggling to
get something basic to work. I had it working under 0.6.0 but had
other issues hence the upgrade.

I've tried to execute 'get' as well as get_slice but theres something
im missing i think. the cassandra cli will show the data thats
inserted as the first part of this but I can't read it back.

[default@Keyspace1] get Standard1['1']
=> (column=656d61696c, value=foo@bar.com, timestamp=1286162622)
Returned 1 results.

The error I get from php is
exception 'TProtocolException' with message 'Bad type in structure.'

Any ideas would be really appreciated.

--- cut here ---
    $GLOBALS['THRIFT_ROOT'] = '/var/www/cassandra';
    require_once $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/Cassandra.php';
    require_once
$GLOBALS['THRIFT_ROOT'].'/packages/cassandra/cassandra_types.php';
    require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
    require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
    require_once $GLOBALS['THRIFT_ROOT'].'/transport/TFramedTransport.php';
    require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';

    // Make a connection to the Thrift interface to Cassandra
    $socket = new TSocket("127.0.0.1", 9160);
    $socket->setSendTimeout("10000");
    $socket->setRecvTimeout("10000");
    $transport = new TFramedTransport($socket, 10240, 10240);
    $protocol = new TBinaryProtocolAccelerated($transport);
    $client = new CassandraClient($protocol);
    $transport->open();
    $client->set_keyspace("Keyspace1");


    $col = new cassandra_Column();
    $col->name="email";
    $col->timestamp=time();
    $col->value="foo@bar.com";

    $columnParent = new cassandra_ColumnParent();
    $columnParent->column_family = "Standard1";
    $columnParent->super_column = NULL;

    $consistency_level = cassandra_ConsistencyLevel::ZERO;
    $key=1;
    $retval=$client->insert($key, $columnParent, $col, $consistency_level);


    $sliceRange = new cassandra_SliceRange();
    $sliceRange->start = '';
    $sliceRange->finish = '';
    $predicate = new cassandra_SlicePredicate();
    $predicate->slice_range = $sliceRange;
    $consistency_level = cassandra_ConsistencyLevel::ONE;
    $result = $client->get_slice("Keyspace1", $key, $columnParent,
$predicate, $consistency_level);
--- cut here ---

Re: PHP access to get or get_slice

Posted by Kevin Withnall <ke...@ilb.com.au>.
Thanks guys,

In the end I don't know what solved it, I had changed too much code to know
for sure and too many other things at the same time. I did however find
tcpdump useful as a debug tool as the error messages don't always seem to
make it back up the stack into php. I could read them in plain text in the
network packets.

Thanks again.

Re: PHP access to get or get_slice

Posted by chris h <ch...@gmail.com>.
The Clock was dropped in beta2, timestamps are back to Int64.

Ahh, my mistake!  Thanks for the correction Aaron.

Chris.

On Mon, Oct 4, 2010 at 12:29 AM, Aaron Morton <aa...@thelastpickle.com>wrote:

> The Clock was dropped in beta2, timestamps are back to Int64.
>
> As Chris says something is not getting what it expected. I'd double check
> you are using the latest generated interface, and check the exception stack
> to see if it's when the client is sending or receiving the message .
>
> If you turn logging up to DEBUG on the server you can see if your request
> makes it that far.
>
> Aaron
>
>
> On 04 Oct, 2010,at 05:17 PM, chris h <ch...@gmail.com> wrote:
>
>
> "Bad type in structure" means that some property/parameter is of an invalid
> type. e.g. a string instead of an object, an object of the wrong class, etc.
>
> One thing that jumps out at me is this line...
>
> $col->timestamp=time();
>
> I believe that all timestamps must now be defined by an instance of the cassandra_Clock
> class instead of just a raw timestamp.
>
> Try this..
>
> $clock = new cassandra_Clock();
> $clock->timestamp = time();
> $col->timestamp=$clock;
>
>
> I just got done making a little PHP high level client for Cassandra .7; a
> big help to me was to open up the various files under the $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/
> directory.  These files contain all the cassanda_* classes, so you can see
> explicitly how they work, and what they need to work.  Also the cassandra
> wiki on the API07 is a great tool.
> http://wiki.apache.org/cassandra/API07
> http://wiki.apache.org/cassandra/API
>
>
> Any problems you run into I've probably just ran into myself! :-)
>
>
> Chris.
>
>
> On Mon, Oct 4, 2010 at 12:02 AM, Kevin Withnall <ke...@ilb.com.au> wrote:
>
>> I've just installed the latest version of cassandra (0.7.0 beta 2) and
>> re-made the relevant thrift libraries.
>>
>> There doesn't seem to be many php examples around so i'm struggling to
>> get something basic to work. I had it working under 0.6.0 but had
>> other issues hence the upgrade.
>>
>> I've tried to execute 'get' as well as get_slice but theres something
>> im missing i think. the cassandra cli will show the data thats
>> inserted as the first part of this but I can't read it back.
>>
>> [default@Keyspace1] get Standard1['1']
>> => (column=656d61696c, value=foo@bar.com, timestamp=1286162622)
>> Returned 1 results.
>>
>> The error I get from php is
>> exception 'TProtocolException' with message 'Bad type in structure.'
>>
>> Any ideas would be really appreciated.
>>
>> --- cut here ---
>>     $GLOBALS['THRIFT_ROOT'] = '/var/www/cassandra';
>>     require_once
>> $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/Cassandra.php';
>>     require_once
>> $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/cassandra_types.php';
>>     require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
>>     require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
>>     require_once
>> $GLOBALS['THRIFT_ROOT'].'/transport/TFramedTransport.php';
>>     require_once
>> $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';
>>
>>     // Make a connection to the Thrift interface to Cassandra
>>     $socket = new TSocket("127.0.0.1", 9160);
>>     $socket->setSendTimeout("10000");
>>     $socket->setRecvTimeout("10000");
>>     $transport = new TFramedTransport($socket, 10240, 10240);
>>     $protocol = new TBinaryProtocolAccelerated($transport);
>>     $client = new CassandraClient($protocol);
>>     $transport->open();
>>     $client->set_keyspace("Keyspace1");
>>
>>
>>     $col = new cassandra_Column();
>>     $col->name="email";
>>     $col->timestamp=time();
>>     $col->value="foo@bar.com";
>>
>>     $columnParent = new cassandra_ColumnParent();
>>     $columnParent->column_family = "Standard1";
>>     $columnParent->super_column = NULL;
>>
>>     $consistency_level = cassandra_ConsistencyLevel::ZERO;
>>     $key=1;
>>     $retval=$client->insert($key, $columnParent, $col,
>> $consistency_level);
>>
>>
>>     $sliceRange = new cassandra_SliceRange();
>>     $sliceRange->start = '';
>>     $sliceRange->finish = '';
>>     $predicate = new cassandra_SlicePredicate();
>>     $predicate->slice_range = $sliceRange;
>>     $consistency_level = cassandra_ConsistencyLevel::ONE;
>>     $result = $client->get_slice("Keyspace1", $key, $columnParent,
>> $predicate, $consistency_level);
>> --- cut here ---
>>
>
>

Re: PHP access to get or get_slice

Posted by Aaron Morton <aa...@thelastpickle.com>.
The Clock was dropped in beta2, timestamps are back to Int64. 

As Chris says something is not getting what it expected. I'd double check you are using the latest generated interface, and check the exception stack to see if it's when the client is sending or receiving the message .

If you turn logging up to DEBUG on the server you can see if your request makes it that far. 

Aaron


On 04 Oct, 2010,at 05:17 PM, chris h <ch...@gmail.com> wrote:


"Bad type in structure" means that some property/parameter is of an invalid type. e.g. a string instead of an object, an object of the wrong class, etc.

One thing that jumps out at me is this line...

$col->timestamp=time();

I believe that all timestamps must now be defined by an instance of the cassandra_Clock class instead of just a raw timestamp.

Try this..

$clock = new cassandra_Clock();
$clock->timestamp = time();
$col->timestamp=$clock;


I just got done making a little PHP high level client for Cassandra .7; a big help to me was to open up the various files under the $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/ directory.  These files contain all the cassanda_* classes, so you can see explicitly how they work, and what they need to work.  Also the cassandra wiki on the API07 is a great tool.
http://wiki.apache.org/cassandra/API07
http://wiki.apache.org/cassandra/API


Any problems you run into I've probably just ran into myself! :-)


Chris.


On Mon, Oct 4, 2010 at 12:02 AM, Kevin Withnall <ke...@ilb.com.au> wrote:
I've just installed the latest version of cassandra (0.7.0 beta 2) and
re-made the relevant thrift libraries.

There doesn't seem to be many php examples around so i'm struggling to
get something basic to work. I had it working under 0.6.0 but had
other issues hence the upgrade.

I've tried to execute 'get' as well as get_slice but theres something
im missing i think. the cassandra cli will show the data thats
inserted as the first part of this but I can't read it back.

[default@Keyspace1] get Standard1['1']
=> (column=656d61696c, value=foo@bar.com, timestamp=1286162622)
Returned 1 results.

The error I get from php is
exception 'TProtocolException' with message 'Bad type in structure.'

Any ideas would be really appreciated.

--- cut here ---
    $GLOBALS['THRIFT_ROOT'] = '/var/www/cassandra';
    require_once $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/Cassandra.php';
    require_once
$GLOBALS['THRIFT_ROOT'].'/packages/cassandra/cassandra_types.php';
    require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
    require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
    require_once $GLOBALS['THRIFT_ROOT'].'/transport/TFramedTransport.php';
    require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransportphp';

    // Make a connection to the Thrift interface to Cassandra
    $socket = new TSocket("127.0.0.1", 9160);
    $socket->setSendTimeout("10000");
    $socket->setRecvTimeout("10000");
    $transport = new TFramedTransport($socket, 10240, 10240);
    $protocol = new TBinaryProtocolAccelerated($transport);
    $client = new CassandraClient($protocol);
    $transport->open();
    $client->set_keyspace("Keyspace1");


    $col = new cassandra_Column();
    $col->name="email";
    $col->timestamp=time();
    $col->value="foo@bar.com";

    $columnParent = new cassandra_ColumnParent();
    $columnParent->column_family = "Standard1";
    $columnParent->super_column = NULL;

    $consistency_level = cassandra_ConsistencyLevel::ZERO;
    $key=1;
    $retval=$client->insert($key, $columnParent, $col, $consistency_level);


    $sliceRange = new cassandra_SliceRange();
    $sliceRange->start = '';
    $sliceRange->finish = '';
    $predicate = new cassandra_SlicePredicate();
    $predicate->slice_range = $sliceRange;
    $consistency_level = cassandra_ConsistencyLevel::ONE;
    $result = $client->get_slice("Keyspace1", $key, $columnParent,
$predicate, $consistency_level);
--- cut here ---


Re: PHP access to get or get_slice

Posted by chris h <ch...@gmail.com>.
"Bad type in structure" means that some property/parameter is of an invalid
type. e.g. a string instead of an object, an object of the wrong class, etc.

One thing that jumps out at me is this line...

$col->timestamp=time();

I believe that all timestamps must now be defined by an instance of
the cassandra_Clock
class instead of just a raw timestamp.

Try this..

$clock = new cassandra_Clock();
$clock->timestamp = time();
$col->timestamp=$clock;


I just got done making a little PHP high level client for Cassandra .7; a
big help to me was to open up the various files under the
$GLOBALS['THRIFT_ROOT'].'/packages/cassandra/
directory.  These files contain all the cassanda_* classes, so you can see
explicitly how they work, and what they need to work.  Also the cassandra
wiki on the API07 is a great tool.
http://wiki.apache.org/cassandra/API07
http://wiki.apache.org/cassandra/API


Any problems you run into I've probably just ran into myself! :-)


Chris.


On Mon, Oct 4, 2010 at 12:02 AM, Kevin Withnall <ke...@ilb.com.au> wrote:

> I've just installed the latest version of cassandra (0.7.0 beta 2) and
> re-made the relevant thrift libraries.
>
> There doesn't seem to be many php examples around so i'm struggling to
> get something basic to work. I had it working under 0.6.0 but had
> other issues hence the upgrade.
>
> I've tried to execute 'get' as well as get_slice but theres something
> im missing i think. the cassandra cli will show the data thats
> inserted as the first part of this but I can't read it back.
>
> [default@Keyspace1] get Standard1['1']
> => (column=656d61696c, value=foo@bar.com, timestamp=1286162622)
> Returned 1 results.
>
> The error I get from php is
> exception 'TProtocolException' with message 'Bad type in structure.'
>
> Any ideas would be really appreciated.
>
> --- cut here ---
>     $GLOBALS['THRIFT_ROOT'] = '/var/www/cassandra';
>     require_once
> $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/Cassandra.php';
>     require_once
> $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/cassandra_types.php';
>     require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
>     require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
>     require_once $GLOBALS['THRIFT_ROOT'].'/transport/TFramedTransport.php';
>     require_once
> $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';
>
>     // Make a connection to the Thrift interface to Cassandra
>     $socket = new TSocket("127.0.0.1", 9160);
>     $socket->setSendTimeout("10000");
>     $socket->setRecvTimeout("10000");
>     $transport = new TFramedTransport($socket, 10240, 10240);
>     $protocol = new TBinaryProtocolAccelerated($transport);
>     $client = new CassandraClient($protocol);
>     $transport->open();
>     $client->set_keyspace("Keyspace1");
>
>
>     $col = new cassandra_Column();
>     $col->name="email";
>     $col->timestamp=time();
>     $col->value="foo@bar.com";
>
>     $columnParent = new cassandra_ColumnParent();
>     $columnParent->column_family = "Standard1";
>     $columnParent->super_column = NULL;
>
>     $consistency_level = cassandra_ConsistencyLevel::ZERO;
>     $key=1;
>     $retval=$client->insert($key, $columnParent, $col, $consistency_level);
>
>
>     $sliceRange = new cassandra_SliceRange();
>     $sliceRange->start = '';
>     $sliceRange->finish = '';
>     $predicate = new cassandra_SlicePredicate();
>     $predicate->slice_range = $sliceRange;
>     $consistency_level = cassandra_ConsistencyLevel::ONE;
>     $result = $client->get_slice("Keyspace1", $key, $columnParent,
> $predicate, $consistency_level);
> --- cut here ---
>