Dear Wiki user, You have subscribed to a wiki page or wiki category on "Cassandra Wiki" for change notification.
The "ThriftExamples" page has been changed by ChrisLarsen: http://wiki.apache.org/cassandra/ThriftExamples?action=diff&rev1=87&rev2=88 Comment: Added a CPP example for Thrift ## page was copied from ClientExamples - '''If you are new to Cassandra and just want to get started, take a look at the available clients [[ClientOptions06|ClientOptions (v0.6)]] instead.''' <<TableOfContents()>> - - - This page shows examples of using the low-level [[http://incubator.apache.org/thrift/|Thrift]] interface, primarily intended for client library developers. + This page shows examples of using the low-level [[http://incubator.apache.org/thrift/|Thrift]] interface, primarily intended for client library developers. - - To generate the bindings for a particular language, first find out if Thrift supports that language. If it does, you can run "thrift --gen XYZ interface/cassandra.thrift" for whatever XYZ you fancy. @@ -556, +551 @@ } } }}} + == C++ == + This is for Cassandra version 0.7 or later + + {{{#!c + #include "Thrift.h" + #include "transport/TSocket.h" + #include "transport/TTransport.h" + #include "transport/TBufferTransports.h" + #include "protocol/TProtocol.h" + #include "protocol/TBinaryProtocol.h" + #include "Cassandra.h" + + using namespace apache::thrift; + using namespace apache::thrift::transport; + using namespace apache::thrift::protocol; + using namespace org::apache::cassandra; + + int main(int argc, char *argv[]){ + try{ + boost::shared_ptr<TTransport> socket = boost::shared_ptr<TSocket>(new TSocket("127.0.0.1", 9160)); + boost::shared_ptr<TTransport> tr = boost::shared_ptr<TFramedTransport>(new TFramedTransport (socket)); + boost::shared_ptr<TProtocol> p = boost::shared_ptr<TBinaryProtocol>(new TBinaryProtocol(tr)); + CassandraClient cass(p); + tr->open(); + + cass.set_keyspace("Keyspace1"); + + string key = "1"; + ColumnParent cparent; + cparent.column_family = "Standard1"; + Column c; + c.name = "name"; + c.value = "John Smith"; + + // have to go through all of this just to get the timestamp in ms + struct timeval td; + gettimeofday(&td, NULL); + int64_t ms = td.tv_sec; + ms = ms * 1000; + int64_t usec = td.tv_usec; + usec = usec / 1000; + ms += usec; + c.timestamp = ms; + + // insert the "name" column + cass.insert(key, cparent, c, ConsistencyLevel::ONE); + + // insert another column, "age" + c.name = "age"; + c.value = "42"; + cass.insert(key, cparent, c, ConsistencyLevel::ONE); + + // get a single cell + ColumnPath cp; + cp.__isset.column = true; // this must be set of you'll get an error re: Padraig O'Sullivan + cp.column = "name"; + cp.column_family = "Standard1"; + cp.super_column = ""; + ColumnOrSuperColumn sc; + + cass.get(sc, key, cp, ConsistencyLevel::ONE); + printf("Column [%s] Value [%s] TS [%lld]\n", + sc.column.name.c_str(), sc.column.value.c_str(), sc.column.timestamp); + + // get the entire row for a key + SliceRange sr; + sr.start = ""; + sr.finish = ""; + + SlicePredicate sp; + sp.slice_range = sr; + sp.__isset.slice_range = true; // set __isset for the columns instead if you use them + + KeyRange range; + range.start_key = key; + range.end_key = ""; + range.__isset.start_key = true; + range.__isset.end_key = true; + + vector<KeySlice> results; + cass.get_range_slices(results, cparent, sp, range, ConsistencyLevel::ONE); + for(size_t i=0; i<results.size(); i++){ + printf("Key: %s\n", results[i].key.c_str()); + for(size_t x=0; x<results[i].columns.size(); x++){ + printf("Column: %s Value: %s\n", results[i].columns[x].column.name.c_str(), + results[i].columns[x].column.value.c_str()); + } + } + + tr->close(); + }catch(TTransportException te){ + printf("Exception: %s [%d]\n", te.what(), te.getType()); + }catch(InvalidRequestException ire){ + printf("Exception: %s [%s]\n", ire.what(), ire.why.c_str()); + }catch(NotFoundException nfe){ + printf("Exception: %s\n", nfe.what()); + } + printf("Done!!!\n"); + return; + } + }}} == Notes == The Cassandra.Client object is always sending its request to the same Cassandra node in the cluster. The server then determines if and where the request should be routed to (Server-based routing). DNS Round Robin or a Cassandra.Client object pool connected to several servers in the cluster can be used to get higher throughput and availability.
