-1

私はCassandraのライブラリを使い始めましC++ libcqlた.libcqlライブラリでC++を使用してCassandraからデータを取得しようとしています..

を使用してコマンドラインに移動し、cqlshこのように選択するたびに-

select record_name, record_value from profile_user where user_id = '1';

私は常にcqlコマンドラインで以下の出力を取得します。その中でrecord_name、record_valueは実際にはTEXT datatype which is UTF-8 encoded string.

 record_name | record_value
-------------+--------------
          e1 |        hello
          e2 |        hello

C++ の世界にやってくる -

今、私はから同じものを取得しようとしています...C++ libcql library上記の同じ選択クエリを C++ で実行します。e1, e2 as the keyHELLO as there value inside that map

/**
 * This method will retrieve the data from Cassandra..
 * And then call print_rows method to print it out on the console
 */
void get_attributes(string id){
    try{

        // some code

        //Connection open
        connection_open();

        execute_query("USE testks;");

        //this will give me the result back of the select query
        cql_result_t& result = execute_query("select * from profile_user where key ='"+id+"';");

        // and this is printing it out on the console
        print_rows(result);

        // some code
    } catch (int e){
        // some code here
    }
}

以下は、私のC++プログラムを実行した後にコンソールに結果を出力する方法です -

/**
 * This method prints out the result on the console..    *
 *
 */
void print_rows(cql::cql_result_t& result) {
    while (result.next()) {
        for (size_t i = 0; i < result.column_count(); ++i) {
            cql::cql_byte_t* data = NULL;
            cql::cql_int_t size = 0;
            result.get_data(i, &data, size);
            std::cout.write(reinterpret_cast<char*>(data), size);
            std::cout << " | ";
        }
        std::cout << std::endl;
    }
}

上記の C++ プログラムを実行した後にコンソールに表示される結果は、次のようなものです -

e1 | hello |
e2 | hello |

しかし、私が探しているのは、キーがマップにあるように、結果をC++のマップに保存することe1 and e2です..そして、それらの値HELLOは同じマップにある必要があります...そして、マップを繰り返します結果をC++で出力しますか?これは私が持っている現在のコードで行うことができますか?

はいの場合、誰かがこれに関する簡単な例を提供できますか? ありがとう...

それは基本的にC++の質問だと思います..データを取得してマップに入れるだけです. ..

コレクションを使用する代わりに、この質問のテーブル設計を元の質問に少し変更しました。現在、複合キーを使用しています..

しかし、前の質問の解決策を理解できる場合は、そのアプローチを使用します。それ以外の場合は、このアプローチを使用します..

助けてくれてありがとう...

更新コード:-

以下の変更により、常に最初の結果が 2 回出力されますか? なぜかわからない?

void print_rows(cql::cql_result_t& result){
    while (result.next()) {
        for (size_t i = 0; i < result.column_count(); ++i) {
            cql::cql_byte_t* data = NULL;
            cql::cql_int_t size = 0;
            result.get_data(i, &data, size);
          //  std::cout.write(reinterpret_cast<char*>(data), size);
          //  std::cout << " | ";

        if(!flag) {

        key = reinterpret_cast<char*>(data);
        flag = true;

        } else if(flag) {

        value = reinterpret_cast<char*>(data);
        m[key] = value;
        flag = false;
        }

        }

        std:map<std::string, std::string>::const_iterator it = m.begin();

        for (;it!=m.end(); ++it ) {

        std::cout << it->first << " : " << it->second << std::endl;
        }

        std::cout << std::endl;
    }
}

e1 : hello

e1 : hello
e2 : hello

ここで何か間違ったことはありますか?

4

1 に答える 1

1

キーと値が各パスで交互になっているように見えますが、

あなたはこのようなものを持つことができます:

bool flag=false;
std::map<std::string, std::string> m;
std::string key,value;

void print_rows(cql::cql_result_t& result) {
    while (result.next()) {
         //...
            if(!flag)
            {
                key=reinterpret_cast<char*>(data);
                flag= true;   
            }
            else if(flag)
            {
                value=reinterpret_cast<char*>(data);
                m[key] = value;
                flag = false;
            }
           // ....
        }
        //...
    }

次に、マップを横断します。

std::map<std::string, std::string>::const_iterator it=m.begin();

for(;it!=m.end();++it)
  std::cout << it->first << " : " << it->second << std::endl;

または、C++11 を使用している場合:

for(const auto &it:m)
  std::cout << it.first << " : "<< it.second << std::endl;
于 2013-10-13T06:37:22.500 に答える