-1

我已经开始使用C++ libcqlCassandra 库了。我正在尝试使用 C++ 和 libcql 库从 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...可以在 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++ 程序后,我在控制台上看到的结果是这样的 -

e1 | hello |
e2 | hello |

但我正在寻找的是 -将结果存储在 C++ 中的 Map 中,这样键应该e1 and e2在 Map 中......并且它们的值应该HELLO在同一个 Map 中......然后迭代 Map并用 C++ 打印出结果?这可能与我拥有的当前代码有关吗?

如果是,任何人都可以提供一个简单的例子吗?谢谢...

我猜这基本上是一个 C++ 问题。只需检索数据并将其放入地图中...但我面临的问题是我的背景完全是 Java,所以很难弄清楚如何做到这一点。 ..

我在这个问题中稍微改变了我的表格设计,而不是使用集合,而不是使用集合,现在我使用复合键..

但是,如果我能找出我之前问题的解决方案,那么我将采用这种方法,否则我将采用这种方法..

谢谢您的帮助...

更新代码:-

通过以下更改,它总是打印两次第一个结果?不知道为什么?

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 回答