Berkeley DB에서 Dbt::get_data() 호출 시 오류가 발생합니다.
조회수 1827회
현재 Berkeley DB C++ API를 사용 중입니다.
DB에서 key 값이 있는지 확인하고 없으면 새 값을, 있으면 업데이트하는 프로그램입니다. 해당 key 값의 data 크기를 알 수 없습니다. 그래서 data의 flag를 DB_DBT_MALLOC으로 설정한 뒤, 해당 data를 data.get_data(); 으로 읽어 캐스팅하여 사용하려고 합니다. 그런데, 캐스팅하는 과정 (2)에서 실행 도중 오류가 발생하는데, 감을 잡을 수가 없습니다. DB_DBT_MALLOC 이나 Dbt::get_data() 함수를 제대로 사용한 것인지도 궁금합니다.
void MyDb::insertTerm(char* term, int doc_id)
{
Dbt key, data;
pair_int putData; // std::vector<std::pair<int,int>>
key.set_data(term);
key.set_size(strlen(term) + 1);
key.set_flags(DB_DBT_USERMEM);
int ret = getDb().get(NULL, &key, &data, 0);
if (ret < 0) // key가 존재 하지 않을 때
{
putData.push_back(std::make_pair(doc_id, 1));
// data를 저장할 땐, putData의 크기를 알기에 아래와 같이 설정.
data.set_data(&putData);
data.set_size(sizeof(putData) + (sizeof(std::pair<int, int>) * putData.capacity()));
data.set_flags(DB_DBT_USERMEM);
ret = getDb().put(NULL, &key, &data, DB_NOOVERWRITE);
}
else
{
data.set_flags(DB_DBT_MALLOC); // (1)
putData = *((pair_int*)data.get_data()); // (2)
bool c = false;
auto it = putData.begin();
for (; it != putData.end(); it++)
{
if (it->first == doc_id)
{
it->second++;
c = true;
break;
}
}
// key값이 존재하지만, doc_id는 새로운 값일 경우.
if (c != true)
putData.push_back(std::make_pair(doc_id, 1));
data.set_data(&putData);
ret = getDb().put(NULL, &key, &data, 0); //데이터 쓰기
}
}
댓글 입력