void DatabaseManager::deleteRecordRange(const StringPimpl &key, const StringPimpl &range) { Dbc *cursor = NULL; try { Dbt dbKey((void *)key.c_str(), key.size() + 1); Dbt dbData((void *) range.c_str(), range.size() + 1); m_pimpl->checkTSSInit(); m_pimpl->m_database->cursor(&(**m_pimpl->m_transaction), &cursor, m_pimpl->m_cursorFlags); int ret = cursor->get(&dbKey, &dbData, DB_GET_BOTH_RANGE); while(ret != DB_NOTFOUND) { cursor->del(0); ret = cursor->get(&dbKey, &dbData, DB_NEXT); } cursor->close(); } catch (DbException &e) { std::cerr << "Error in addRecord: " << e.what() << e.get_errno() << std::endl; if(cursor != NULL) { cursor->close(); } } }
bool DatabaseManager::getRecord(const StringPimpl &key, StringPimpl &data, bool caseSensitive) { Dbt dbKey, dbData; StringPimpl caseInsensitive; if(!caseSensitive) { caseInsensitive = key; caseInsensitive.transformToUpperCase(); dbKey.set_data((void *)caseInsensitive.c_str()); dbKey.set_size((caseInsensitive.size() + 1) * sizeof(char)); } else { dbKey.set_data((void *)key.c_str()); dbKey.set_size((key.size() + 1) * sizeof(char)); } Dbc *cursor = NULL; try { m_pimpl->checkTSSInit(); m_pimpl->m_database->cursor(&(**m_pimpl->m_transaction), &cursor, m_pimpl->m_cursorFlags); int ret = cursor->get(&dbKey, &dbData, DB_SET); cursor->close(); if(ret != DB_NOTFOUND) { data = StringPimpl((char *) dbData.get_data()); return true; } else { return false; } } catch (DbException &e) { std::cerr << "Error in getDatabaseRecord transaction: " << e.what() << e.get_errno() << std::endl; if(cursor != NULL) { cursor->close(); } return false; } }
bool DatabaseManager::recordExists(const StringPimpl &key) { Dbt dbKey, dbData; dbKey.set_data((void *)key.c_str()); dbKey.set_size((key.size() + 1) * sizeof(char)); Dbc *cursor = NULL; try { m_pimpl->checkTSSInit(); m_pimpl->m_database->cursor(&(**m_pimpl->m_transaction), &cursor, m_pimpl->m_cursorFlags); int ret = cursor->get(&dbKey, &dbData, DB_SET); cursor->close(); if(ret != DB_NOTFOUND) { return true; } else { return false; } } catch (DbException &e) { std::cerr << "Error in databse recordExists" << e.what() << e.get_errno() << std::endl; if(cursor != NULL) { cursor->close(); } return false; } }
void DatabaseManager::addRecord(const StringPimpl &key, const StringPimpl &value) { //Set up the key Dbt dbKey; dbKey.set_data((void *)key.c_str()); dbKey.set_size((key.size() + 1) * sizeof(char)); //Set up the data to insert Dbt dbData; dbData.set_data((void *)value.c_str()); dbData.set_size((value.size() + 1) * sizeof(char)); try { m_pimpl->checkTSSInit(); int ret = m_pimpl->m_database->put(&(**m_pimpl->m_transaction), &dbKey, &dbData, 0); } catch (DbException &e) { std::cerr << "Error in addRecord: " << e.what() << e.get_errno() << std::endl; } }
bool DatabaseManager::recordRangeExists(const StringPimpl &key) { //Go through the range of the existence keys and //add them to the list Dbc *cursor = NULL; try { Dbt dbKey((void *)key.c_str(), key.size() + 1); Dbt dbData; m_pimpl->checkTSSInit(); m_pimpl->m_database->cursor(&(**m_pimpl->m_transaction), &cursor, m_pimpl->m_cursorFlags); int ret = cursor->get(&dbKey, &dbData, DB_SET_RANGE); while(ret != DB_NOTFOUND) { StringPimpl dataString = StringPimpl((char *) dbData.get_data()); StringPimpl keyString = StringPimpl((char *) dbKey.get_data()); if(!keyString.startsWith(key) || keyString == key) { //We are at the end of the range break; } else { cursor->close(); return true; } } cursor->close(); return false; } catch (DbException &e) { std::cerr << "Error in deleteRecordRange: " << e.what() << e.get_errno() << std::endl; if(cursor != NULL) { cursor->close(); } return false; } }
void DatabaseManager::deleteRecordRange(const StringPimpl &key) { Dbc *cursor = NULL; try { Dbt dbKey((void *)key.c_str(), key.size() + 1); Dbt dbData; m_pimpl->checkTSSInit(); m_pimpl->m_database->cursor(&(**m_pimpl->m_transaction), &cursor, m_pimpl->m_cursorFlags); int ret = cursor->get(&dbKey, &dbData, DB_SET_RANGE); while(ret != DB_NOTFOUND) { StringPimpl dataString = StringPimpl((char *) dbData.get_data()); StringPimpl keyString = StringPimpl((char *) dbKey.get_data()); if(!keyString.startsWith(key)) { //We are at the end of the range break; } cursor->del(0); ret = cursor->get(&dbKey, &dbData, DB_NEXT); } cursor->close(); } catch (DbException &e) { std::cerr << "Error in deleteRecordRange: " << e.what() << e.get_errno() << std::endl; if(cursor != NULL) { cursor->close(); } } }