"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 <kevin@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 ---