나는 CQL3.0을위한 Cassandra cppdriver에 대한 래퍼를 작성해 왔으며 이상한 행동을 보았습니다. 일반적인 버그인지 확실하지 않습니다. 참고로 Cassandra cppdriver 쿼리 문자열 버퍼 오버플로?
, 나는 (저장소에서) 4- 9 월 cppdriver 코드 릴리스, libuv0.10와 함께하고 datastax 웹 사이트 ( http://www.datastax.com/documentation/cql/3.1/cql/ddl/ddl_music_service_c.html)문제에 게시 된 곡/재생 목록의 예를 떨어져 있어요 내가 가지고있는 것은 쿼리 문자열을 실행하는 것입니다. 카산드라에게 보내지는 질의 문자열이 쓰레기가되는 문자의 임계 값이있는 것으로 보입니다. 문자열을 생성하고 cppdriver 라이브러리에 보내고 결과를 파싱하는 데 사용하는 코드는 아래에 제공됩니다. 생성 된 명령문을 출력하기 위해 cassandra.h와 session.cpp 파일에 함수 (cass_session_print_query)를 추가했습니다. 이와
map<string, vector<string> > retresults;
int i = 0, ccount;
stringstream ss;
vector<string> keys = get.GetList();
vector<string>::iterator kit = keys.begin();
map<int, pair<string, string> > primkeys = get.GetMap();
map<int, pair<string, string> >::iterator mit = primkeys.begin();
if (!keys.empty())
{
ss << "SELECT " << (*kit);
++kit;
for (; kit != keys.end(); ++kit)
ss << "," << (*kit);
ss << " FROM " << tablename;
if (!primkeys.empty())
{
ss << " WHERE ";
ss << mit->second.first << " = ?";
++mit;
for (; mit != primkeys.end(); ++mit)
ss << " and " << mit->second.first << " = ?";
mit = primkeys.begin();
}
ss << ";";
cass_bool_t has_more_pages = cass_false;
const CassResult* result = NULL;
CassString query = cass_string_init(ss.str().c_str());
CassStatement* statement = cass_statement_new(query, primkeys.size());
for (; mit != primkeys.end(); ++mit)
cass_statement_bind_string(statement, i++, cass_string_init(mit->second.second.c_str()));
cass_statement_set_paging_size(statement, 100);
do
{
cass_session_print_query(statement);
CassIterator* iterator;
CassFuture* future = cass_session_execute(session_, statement);
if (cass_future_error_code(future) != 0)
{
CassString message = cass_future_error_message(future);
fprintf(stderr, "Error: %.*s\n", (int)message.length, message.data);
break;
}
result = cass_future_get_result(future);
ccount = cass_result_column_count(result);
vector<string> cnames;
for (i = 0; i < ccount; i++)
cnames.push_back(cass_result_column_name(result, i).data);
iterator = cass_iterator_from_result(result);
ListVector::iterator vit;
while (cass_iterator_next(iterator))
{
const CassRow* row = cass_iterator_get_row(iterator);
for (vit = cnames.begin(); vit != cnames.end(); ++vit)
{
CassString value;
char value_buffer[256];
cass_value_get_string(cass_row_get_column_by_name(row, (*vit).c_str()), &value);
if (value.length == 0 || value.data == NULL)
continue;
memcpy(value_buffer, value.data, value.length);
value_buffer[value.length] = '\0';
retresults[(*vit)].push_back(value_buffer);
}
}
has_more_pages = cass_result_has_more_pages(result);
if (has_more_pages)
cass_statement_set_paging_state(statement, result);
cass_iterator_free(iterator);
cass_result_free(result);
} while (has_more_pages);
}
return retresults;
, SELECT id,album,title,artist,data FROM songs;
의 카산드라의 쿼리 문자열에 SELECT id,album,title,artist,data FROM songs;
결과의 초기 쿼리 문자열. 그러나 하나의 열을 SELECT 부분에 추가하면 SELECT id,album,title,artist,data,tags FROM songs;
Cassandra cppdriver 라이브러리의 쿼리 문자열은 ,ar����,dat�� jOM songX
이됩니다. Cassandra/library에서 다음과 같은 오류가 발생합니다 : Error: line 1:49 no viable alternative at character '�'
.
또한 적은 수의 열을 시도했지만 WHERE 절을 사용하면 동일한 문제가 발생합니다.
이것은 버그입니까? 아니면 건물 및 cppdriver 라이브러리에 문자열을 잘못 보내고 있습니까?
나는 당신이보고있는 문제에 대해 잘 모릅니다. 그러나 한 가지주의해야 할 점은 오류 코드를 테스트하기 전에 미래에 cass_future_wait()를 사용해야한다는 것입니다. 또한 해명해야 할 몇 가지가 있습니다 (미래, 성명). 그러나 간결하게하기 위해 생략 된 것으로 가정합니다. –
cass_future_wait (미래) 문제가있었습니다. 감사! 이 질문을 답안에 쓰고 싶으면 그 답으로 표시 할 것입니다. – AeroBuffalo