私は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 key
HELLO 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
ここで何か間違ったことはありますか?