我已经开始为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
和{的地图{1}} ...可以在C ++中完成吗?
HELLO as there value inside that map
下面是在运行我的C ++程序后将在控制台上打印出结果的方法 -
/**
* 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 ++中的Map中,使得Map中的键应为e1 | hello |
e2 | hello |
..并且它们的值应为{ {1}}在同一个Map中...然后迭代Map并用C ++打印出结果?这可能与我当前的代码有关吗?
如果是,有人可以提供一个简单的例子吗?感谢...
这基本上是一个C ++问题我想..只是检索数据并将其放入Map ...但我面临的问题是我的背景完全是Java,所以有点难以弄清楚如何那样做......
我已将此问题中的表格设计略微更改为原始问题here而不是使用集合,现在我正在使用复合键..
但是,如果我能找出上一个问题的解决方案,那么我将采用这种方法,否则我将采用这种方法..
感谢您的帮助...
更新代码: -
通过以下更改,它总是打印出第一个结果两次?不确定为什么?
e1 and e2
我在这里做错了吗?
答案 0 :(得分: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;