Компиляция программы на C ++ с использованием Thrift и Cassandra - PullRequest
2 голосов
/ 07 января 2012

Я пытался скомпилировать простой пример для подключения к экземпляру Кассандры с использованием интерфейса Thrift.Как примечание, я делаю все это без доступа к привилегиям суперпользователя на машине с Linux.

Я установил thrift и генератор c ++, поместил заголовки include в мою переменную CPLUS_INCLUDE_PATH, а каталог lib - в мою LIBRARY_PATH и LD_LIBRARY_PATH.Cassandra также установлена, и я запустил thrift --gen cpp cassandra.thrift для генерации заголовочных файлов cassandra.

Используя те, которые я скомпилировал, мой пример выглядит примерно так:
g++ -Wall run_measure.cpp cassandra_constants.cpp Cassandra.cpp cassandra_types.cpp -lthrift -o cassandra_example

Программа выглядит в основном так

#include "Cassandra.h"

#include <protocol/TBinaryProtocol.h>
#include <transport/TSocket.h>
#include <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;

int main(int argc, const char* argv[]) {
    shared_ptr socket(new TSocket(host, port));
    shared_ptr transport(new TFramedTransport(socket));
    shared_ptr protocol(new TBinaryProtocol(transport));
    CassandraClient client(protocol);

    const string& key="your_key";

    ColumnPath cpath;
    ColumnParent cp;

    ColumnOrSuperColumn csc;
    Column c;

    c.name.assign("column_name");
    c.value.assign("Data for our key to go into column_name");
    c.timestamp = getTS();
    c.ttl = 300;

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

    cpath.column_family.assign("nm_cfamily");
    /* This is required - thrift 'feature' */
    cpath.__isset.column = true;
    cpath.column="column_name";
    try {
            transport->open();
            cout << "Set keyspace to 'dpdns'.." << endl;
            client.set_keyspace("nm_example");

            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;
}

Я получаю

ошибки
In file included from run_measure.cpp:13:
Cassandra.h:4289: error: ‘org::apache::thrift’ has not been declared
Cassandra.h:4289: error: expected ‘,’ or ‘...’ before ‘*’ token
Cassandra.h:4291: error: cannot declare pointer to ‘void’ member
Cassandra.h:4291: error: template argument 2 is invalid
Cassandra.h:4291: error: template argument 4 is invalid
Cassandra.h:4292: error: ‘org::apache::thrift’ has not been declared
Cassandra.h:4292: error: expected ‘,’ or ‘...’ before ‘*’ token
Cassandra.h:4293: error: ‘org::apache::thrift’ has not been declared
Cassandra.h:4293: error: expected ‘,’ or ‘...’ before ‘*’ token
Cassandra.h:4294: error: ‘org::apache::thrift’ has not been declared
Cassandra.h:4294: error: expected ‘,’ or ‘...’ before ‘*’ token
Cassandra.h:4295: error: ‘org::apache::thrift’ has not been declared
Cassandra.h:4295: error: expected ‘,’ or ‘...’ before ‘*’ token

Жаловаться в основном на вещи в сгенерированных файлах, поэтому я не уверен, смогу ли я изменить их или сделал что-то другое неправильно.В качестве справки я рекомендую установить $HOME/thrift, поэтому путь включения немного странный, он выглядит как $HOME/thrift/include/thrift, но я не думаю, что это приведет к этой ошибке.Если у кого-то есть опыт использования cassandra в c ++, я был бы очень признателен за помощь.

Вот строки, на которые есть ссылки в ошибке

  while (true)
  {
    xfer += iprot->readFieldBegin(fname, ftype, fid);
    if (ftype == ::apache::thrift::protocol::T_STOP) {
      break;
    }
    switch (fid)
    {
      default:
        xfer += iprot->skip(ftype);
        break;
    }
    xfer += iprot->readFieldEnd();
  }

  xfer += iprot->readStructEnd();

  return xfer;
}

Full Cassandra.cpp
Полная ошибка

Еще раз спасибо!

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

У меня та же проблема, и я ее исправил:
для gcc вы должны добавить изменения в Cassandra.h, Cassandra.cpp.

заменить apache::thrift -> ::apache::thrift

1 голос
/ 09 мая 2012

Я думаю, что в патре Пьера не было одного исправленияЯ сделал небольшое изменение, и оно доступно на pastebin .

Возможно, я ошибаюсь, и если я поправлю меня, пожалуйста, я впервые играю с патчами.

0 голосов
/ 30 апреля 2012

, если вы не хотите заменять все apache -> ::apache, примените этот патч к генератору thrift-0.8.http://pastebin.com/Sjhhiffm

перекомпилируйте утилиту и используйте новый двоичный файл.

...