スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに


Apache Cassandra の 1.2.1 がリリースされてました。
C++ で Cassandra を触ってみようと思って、試してみました。

FreeBSD でやってたんですが、thrift で生成したC++のコードをコンパイルするのに、苦労しました。
Linux だと苦労しないのかもしれませんが、まだ、試してません。

Cのソースの生成


本件とは関係ないけど、メモ。

% /usr/local/bin/thrift --gen c_glib cassandra.thrift
% ls -1 gen-c_glib/
cassandra.c
cassandra.h
cassandra_types.c
cassandra_types.h

Cのソースのコンパイル


gcc -c `pkg-config --cflags thrift_c_glib` -I . *.c

C++のソースの生成


/usr/local/bin/thrift --gen cpp ./cassandra.thrift

% ls -1 gen-cpp/
Cassandra.cpp
Cassandra.h
Cassandra_server.skeleton.cpp
cassandra_constants.cpp
cassandra_constants.h
cassandra_types.cpp
cassandra_types.h


C++のソースのコンパイル


FreeBSD 9.0だと thrift で作ったソースがそのままコンパイルできないので、失敗します。
g++ -Wall *.cpp -lthrift -c -I /usr/local/include/thrift/ -I . -I /usr/local/include/ -L/usr/local/lib -lboost 

ソースコードがよろしくないらしい。

いろいろ置換するとコンパイルできるようになるので、くじけないでください。
:argdo %s/[[:space:]]apache::/::apache::/g
:argdo %s/<apache/< ::apache/g
:argdo %s/(apache/( ::apache/g

テストコード


g++ -Wall -lthrift -I /usr/local/include/thrift/ -I . -I /usr/local/include/ -L/usr/local/lib  Cassandra.o cassandra_constants.o cassandra_types.o main.cpp

cassandra に keyspace と column family を作っておきます。

% cassandra-cli
[default@unknown] create keyspace ks1;
ff3bf1ab-0b4f-3a01-ba7f-dda5b7336c50
[default@unknown] use ks1;
Authenticated to keyspace: ks1
[default@ks1] create column family cf1;
54290f95-6390-3a33-b837-63adc91ae73a

[default@ks1] set cf1[utf8('foo')][utf8('bar')] =utf8('hoge');
Value inserted.
Elapsed time: 85 msec(s).


main.c


#include "Cassandra.h"

#include <protocol/TBinaryProtocol.h>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TTransportUtils.h>

using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using namespace org::apache::cassandra;
using namespace boost;

static string host("127.0.0.1");
static int port= 9160;

int64_t getTS(){
	/* If you're doing things quickly, you may want to make use of tv_usec
	 * or something here instead
	 */
	time_t ltime;
	ltime=time(NULL);
	return (int64_t)ltime;

}


int main(){
	shared_ptr<TSocket> socket(new TSocket(host, port));
	shared_ptr<TFramedTransport> transport(new TFramedTransport(socket));
	shared_ptr<TBinaryProtocol> protocol(new TBinaryProtocol(transport));
	CassandraClient client(protocol);

	const string& key="foo";

	ColumnPath cpath;
	ColumnParent cp;

	ColumnOrSuperColumn csc;
	Column c;

	c.name.assign("bar2");
	c.value.assign("hogehoge");
	c.timestamp = getTS();
	c.ttl = 300;

	string cf = "cf1";

	cp.column_family.assign(cf);
	cp.super_column.assign("");

	cpath.column_family.assign(cf);
	/* This is required - thrift 'feature' */
	cpath.__isset.column = true;
	cpath.column="column_name";
	cpath.column_family = cf;

	try {
		transport->open();
		cout << "Set keyspace to 'ks1'.." << endl;
		client.set_keyspace("ks1");


		ColumnOrSuperColumn ret_val;
		cpath.column="bar";
		client.get(ret_val, "foo", cpath, ConsistencyLevel::ONE);

		cout << "name: " << ret_val.column.name << endl;
		cout << "value: " << ret_val.column.value << endl;

		cpath.column="bar2";

		c.value = "metameta";
		// InvalidRequest ERROR: Column value is required
		c.__isset.timestamp = true;
		c.__isset.value = true;

		cout << "Insert key '" << key << "' in column '" << c.name << "' in column family '" << cp.column_family << "' with timestamp " << c.timestamp << "..." << endl;
		client.insert(key, cp, c, org::apache::cassandra::ConsistencyLevel::ONE);


		cout << "Retrieve key '" << key << "' from column '" << cpath.column << "' in column family '" << cpath.column_family << "' again..." << endl;
		client.get(csc, key, cpath, org::apache::cassandra::ConsistencyLevel::ONE);
		cout << "Value read is '" << csc.column.value << "'..." << endl;

		c.timestamp++;
		c.value.assign("Updated data going into column_name");
		cout << "Update key '" << key << "' in column with timestamp " << c.timestamp << "..." << endl;
		client.insert(key, cp, c, org::apache::cassandra::ConsistencyLevel::ONE);

		cout << "Retrieve updated key '" << key << "' from column '" << cpath.column << "' in column family '" << cpath.column_family << "' again..." << endl;
		client.get(csc, key, cpath, org::apache::cassandra::ConsistencyLevel::ONE);
		cout << "Updated value is: '" << csc.column.value << "'" << endl;

		cout << "Remove the key '" << key << "' we just retrieved. Value '" << csc.column.value << "' timestamp " << csc.column.timestamp << " ..." << endl;
		client.remove(key, cpath, csc.column.timestamp, org::apache::cassandra::ConsistencyLevel::ONE);

		transport->close();
	}
	catch (NotFoundException &nf){
		cerr << "NotFoundException ERROR: "<< nf.what() << endl;
	}
	catch (InvalidRequestException &re) {
		cerr << "InvalidRequest ERROR: " << re.why << endl;
	}
	catch (TException &tx) {
		cerr << "TException ERROR: " << tx.what() << endl;
	}

	return 0;
}

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー