2013-10-13 2 views
0
난 ... libcql 라이브러리와 C++를 사용하여 카산드라에서 데이터를 검색하는 것을 시도하고있다 카산드라에 대한 C++ libcql 라이브러리 작업을 시작했습니다

..결과를 C++의 Map에 저장 한 다음 반복하여 인쇄하십시오.

내가 cqlsh를 사용하여 명령 줄에 가서 같이 선택 할 때마다 -

select records from profile_user where user_id = '1'; 

난 항상 records 열이 map가있는 키 e1이고 값이 HELLO입니다 실제로있는 CQL 명령 행에와있는 아래의 출력을 얻을. 내가 CQL 테이블을 만들 때 내가

records 
-------------------------------- 
{'e1': 'HELLO', 'e2': 'HELLO'} 

지금 C 오는 .. CQL의 수집 기능을 사용 된 것과 동일한 방법으로 키가 e2이며 값이 다시 HELLO이다가 .. 나는지도로 기록을 만들어 ++

세계적 지금 내가 C++에서 선택 쿼리 위와 같은 실행됩니다 ... C++ libcql library에서 같은 일을 검색하려고 내가 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를 실행 한 후 콘솔에서 볼 수있는 결과 ++ 프로그램은 같은 것입니다 이 -

e1HELLOe2HELLO | 

하지만 내가 찾고 있어요 것은 - 스토어 C++에서지도의 결과, 같은 방법으로 이러한에게 키해야한다고지도에서 .. 그리고 그 값은 HELLO 같은지도에 있어야합니다 ... 그리고지도를 반복하고 C에서 결과를 인쇄 + +? 내가 가지고있는 현재 코드로이 작업을 수행 할 수 있습니까?

예인 경우 누구나 간단한 예제를 제공 할 수 있습니까? 고마워요 ...

기본적으로 C++ 질문입니다. 데이터를 검색하여지도에 넣으십시오.하지만 제가 직면 한 문제는 제 배경이 완전히 자바에 불과하므로 조금 힘든 시간을 보내고 있습니다. 그것을하는 방법을 알아 내기 위해 ...

+0

'std :: map'을 고려해야합니다. 맞습니까? –

+0

그래 .. 그게 내가 생각했거나 효율적이지 않은지도를 읽었을 때 효율이 좋지 않다는 것입니다 ... – ferhan

+0

유일한 문제는'print_rows'에 오는'result'를'std :: map '맞지? – P0W

답변

1

나는 libcql을 모른다. 그리고 어떤 문서를 찾는데 실패했다. cql_result_t의 헤더를 보면 얼마나 많은 열이 있는지와 액세스하는 방법을 알 수 있습니다. 그 모습에서, 당신은 단순히 좋은 데모가 아닌 데모 예제를 복사했습니다. 나는 print_result() 함수를 수정하여 아래와 같이 보이고 내가 무엇을 얻을 수 있는지 보았습니다. 내 추측 당신이 쿼리에서 "지도"유형을 얻는다면, 당신은 헤더를 파헤어 해당 표현을 추출하고 사용하는 방법을 알아야합니다 (어떤 문서가없는 한). 이 각각의 유형의 처리를 처리 할 필요가 대부분 단순한 추출물 몇 가지 유형 및 인쇄 아래의 코드 (실제로 가정 컴파일) :

void print_result(cql::cql_result_t& result) 
{ 
    std::size_t const columns(result.column_count()); 
    while (result.next()) { 
     for (std::size_t column(0); column != columns; ++column) { 
      cql::cql_column_type_enum type; 
      if (result.column_type(column, type)) { 
       switch (type) { 
       case cql::CQL_COLUMN_TYPE_CUSTOM: 
        std::cout << "todo: process custom type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_ASCII: 
        std::cout << "todo: process ascii type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_BIGINT: 
        std::cout << "todo: process bigint type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_BLOB: 
        std::cout << "todo: process blob type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_BOOLEAN: 
        std::cout << "todo: process boolean type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_COUNTER: 
        std::cout << "todo: process counter type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_DECIMAL: 
        std::cout << "todo: process decimal type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_DOUBLE: { 
        double value; 
        if (result.get_double(column, value)) { 
         std::cout << "column=" << column << " " 
            << "double=" << value << "\n"; 
        } 
        else { 
         std::cout << "failed to extract double for column " 
            << column << "\n"; 
        } 
        break; 
       case cql::CQL_COLUMN_TYPE_FLOAT: { 
        float value; 
        if (result.get_float(column, value)) { 
         std::cout << "column=" << column << " " 
            << "float=" << value << "\n"; 
        } 
        else { 
         std::cout << "failed to extract float for column " 
            << column << "\n"; 
        } 
        break; 
       case cql::CQL_COLUMN_TYPE_INT: { 
        int value; 
        if (result.get_int(column, value)) { 
         std::cout << "column=" << column << " " 
            << "int=" << value << "\n"; 
        } 
        else { 
         std::cout << "failed to extract int for column " 
            << column << "\n"; 
        } 
        break; 
       case cql::CQL_COLUMN_TYPE_TEXT: { 
        std::string value; 
        if (result.get_string(column, value)) { 
         std::cout << "column=" << column << " " 
            << "text='" << value << "'\n"; 
        } 
        else { 
         std::cout << "failed to extract text for column " 
            << column << "\n"; 
        } 
        break; 
       case cql::CQL_COLUMN_TYPE_TIMESTAMP: 
        std::cout << "todo: process timestamp type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_UUID: 
        std::cout << "todo: process uiid type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_VARCHAR: 
        std::cout << "todo: process varchar type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_VARINT: 
        std::cout << "todo: process varint type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_TIMEUUID: 
        std::cout << "todo: process timeuuid type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_INET: 
        std::cout << "todo: process inet type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_LIST: 
        std::cout << "todo: process list type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_MAP: 
        std::cout << "todo: process map type\n"; 
        break; 
       case cql::CQL_COLUMN_TYPE_SET: 
        std::cout << "todo: process set type\n"; 
        break; 
       } 
      } 
     } 
    } 
} 
+0

그렇습니다. 많은 문서가 없습니다. 그러나 이것은 동일한 libcql 라이브러리에 대한 github [link] (https://github.com/mstump/libcql)입니다. 이들을 컴파일하여 어떻게 보이는지 .. – ferhan

0

cql_result_t는 방법 get_map 있습니다.get_data 대신 get_map을 사용하십시오 :

cql::cql_result_t *r; 
cql::cql_map_t *props = 0; 
if (!r->get_map("records", &props)) { 
    delete props; 
    // throw an error 
} 

std::auto_ptr<cql::cql_map_t> p(props); 
std::map<std::string, std::string> m; 
for (std::size_t i = 0; i < p->size(); ++i) { 
    std::string key; 
    if (!p->get_key_string(i, key)) 
     // throw an error 
    std::string value; 
    if (!p->get_value_string(i, value)) 
     // throw an error 
    m.insert(std::make_pair(key, value)); 
}