2013-10-13 8 views
-1

Я начал работать с C++ libcql библиотеки для Кассандры .. Я пытаюсь получить данные из Cassandra с помощью C++ с libcql библиотеки ..Как сохранить результат на карте в C++, а затем перебрать его, а затем распечатать результат?

Всякий раз, когда я иду в командной строке с помощью 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 | 

Но то, что я ищу, - магазин результат в карте в C++, таким образом, что ключ должен быть e1 and e2 на карте .. И значение для них должно быть HELLO на той же карте ... И затем перебрать карту и распечатать результат на C++? Возможно ли это с текущим кодом, который у меня есть?

Если да, может ли кто-нибудь предоставить простой пример по этому вопросу? Спасибо ...

Это, по сути, вопрос на C++, я думаю .. Просто извлеките данные и поместите их в карту ... Но проблема, с которой я столкнулся, - это мой фон полностью в Java, поэтому с небольшим трудным временем чтобы выяснить, как это сделать ...

я слегка изменил свой дизайн таблицы в этом вопросе к моему первоначальному вопросу here вместо использования коллекции, теперь я использую составные ключи ..

Но если я могу выясните решение моего предыдущего вопроса, тогда я пойду с этим подходом, иначе я пойду с этим подходом.

Спасибо за помощь ...

Update Код: -

С ниже изменения, всегда распечатать первый результат в два раза? Не знаете почему?

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 

Есть ли что-то не так, что я здесь делаю?

+0

Моя единственная проблема заключается в том, как вытащить результат, поступающий на print_rows, в std :: map или unorderedmap в зависимости от того, что эффективнее, а затем повторить его и распечатать результаты. !! – ferhan

+0

Возможный дубликат [Сохранить результат на карте в C++, а затем повторить его, а затем распечатать?] (Http://stackoverflow.com/questions/19341994/store-the-result-in-a-map-in- c-and-then-iterate-it-and-then-print-out) – Raedwald

ответ

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; 
+0

@POW: Спасибо за предложение и помощь. Но в вашем примере, что является ключевым и ценным? Они никогда не объявлялись ..? И после того, как все на карте будет показано, как мы будем итерировать карту? Простите мое невежество, поскольку мой фон не в C++ .. Спасибо за понимание – ferhan

+0

@TechGeeky Opps .. обновлено – P0W

+0

@POW: Я обновил свой вопрос .. Все работает нормально, но единственная проблема в том, что первая пара значений ключа печатается дважды .. Не знаете, почему? Есть предположения? – ferhan

Смежные вопросы