Я начал работать с C++ libcql
библиотека для Cassandra .. Я пытаюсь получить данные из Cassandra, используя C ++ с библиотекой libcql ..
Всякий раз, когда я иду в командной строке, используя 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
… можно это сделать в 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 |
Но то, что я ищу, — Сохраните результат в Map в C ++ таким образом, чтобы ключ был e1 and e2
на карте .. И значение для них должно быть HELLO
в той же карте … а затем итерации карты и распечатать результат в 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
Что-то не так я здесь делаю?
Похоже, что ваши ключи и значения чередуются на каждом проходе,
Вы можете иметь что-то вроде этого:
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;
Других решений пока нет …