/** Erases a key/record pair. */ void erase(txn *t, key *k, uint32_t flags = 0) { ham_status_t st = ham_db_erase(m_db, t ? t->get_handle() : 0, k ? k->get_handle() : 0, flags); if (st) throw error(st); }
BOOL CDbxKV::MetaSplitHistory(DBCachedContact *ccMeta, DBCachedContact *ccSub) { DBEventSortingKey keyVal = { ccSub->contactID, 0, 0 }, delVal = { ccMeta->contactID, 0, 0 }; ham_key_t key = { sizeof(keyVal), &keyVal }, key2 = { sizeof(delVal), &delVal }; ham_record_t data = { 0 }; cursor_ptr cursor(m_dbEventsSort); if (ham_cursor_find(cursor, &key, &data, HAM_FIND_GT_MATCH) != HAM_SUCCESS) return 0; do { DBEventSortingKey *pKey = (DBEventSortingKey*)key.data; if (pKey->dwContactId != ccSub->contactID) break; delVal.ts = pKey->ts; delVal.dwEventId = pKey->dwEventId; ham_db_erase(m_dbEventsSort, NULL, &key2, 0); ccMeta->dbc.dwEventCount--; } while (ham_cursor_move(cursor, &key, &data, HAM_CURSOR_NEXT) == HAM_SUCCESS); // now update the number of events in a metacontact ham_key_t keyc = { sizeof(int), &ccMeta->contactID }; ham_record_t datac = { sizeof(ccMeta->dbc), &ccMeta->dbc }; ham_db_insert(m_dbContacts, NULL, &keyc, &datac, HAM_OVERWRITE); return 0; }
STDMETHODIMP_(LONG) CDbxKV::DeleteContact(MCONTACT contactID) { if (contactID == 0) // global contact cannot be removed return 1; // call notifier while outside mutex NotifyEventHooks(hContactDeletedEvent, contactID, 0); // delete mir_cslock lck(m_csDbAccess); ham_key_t key = { sizeof(MCONTACT), &contactID }; ham_db_erase(m_dbContacts, NULL, &key, 0); return 0; }
STDMETHODIMP_(BOOL) CDbxKV::DeleteContactSetting(MCONTACT contactID, LPCSTR szModule, LPCSTR szSetting) { if (!szModule || !szSetting) return 1; // the db format can't tolerate more than 255 bytes of space (incl. null) for settings+module name int settingNameLen = (int)strlen(szSetting); int moduleNameLen = (int)strlen(szModule); if (settingNameLen > 0xFE) { #ifdef _DEBUG OutputDebugStringA("DeleteContactSetting() got a > 255 setting name length. \n"); #endif return 1; } if (moduleNameLen > 0xFE) { #ifdef _DEBUG OutputDebugStringA("DeleteContactSetting() got a > 255 module name length. \n"); #endif return 1; } MCONTACT saveContact = contactID; { mir_cslock lck(m_csDbAccess); char *szCachedSettingName = m_cache->GetCachedSetting(szModule, szSetting, moduleNameLen, settingNameLen); if (szCachedSettingName[-1] == 0) { // it's not a resident variable DBSettingSortingKey keySearch; keySearch.dwContactID = contactID; keySearch.dwOfsModule = GetModuleNameOfs(szModule); strncpy_s(keySearch.szSettingName, szSetting, _TRUNCATE); ham_key_t key = { 2 * sizeof(DWORD) + settingNameLen, &keySearch }; if (ham_db_erase(m_dbSettings, NULL, &key, 0) != HAM_SUCCESS) return 1; } m_cache->GetCachedValuePtr(saveContact, szCachedSettingName, -1); } // notify DBCONTACTWRITESETTING dbcws = { 0 }; dbcws.szModule = szModule; dbcws.szSetting = szSetting; dbcws.value.type = DBVT_DELETED; NotifyEventHooks(hSettingChangeEvent, saveContact, (LPARAM)&dbcws); return 0; }
int main(int argc, char **argv) { int i; ham_status_t st; /* status variable */ ham_env_t *env; /* hamsterdb Environment object */ ham_db_t *db; /* hamsterdb Database object */ ham_key_t key = {0}; /* the structure for a key */ ham_record_t record = {0}; /* the structure for a record */ /* * Connect to the server which should listen at 8080. The server is * implemented in server1.c. */ st = ham_env_create(&env, "ham://localhost:8080/env1.db", 0, 0, 0); if (st != HAM_SUCCESS) error("ham_env_create", st); /* now open a Database in this Environment */ st = ham_env_open_db(env, &db, 13, 0, 0); if (st != HAM_SUCCESS) error("ham_env_open_db", st); /* now we can insert, delete or lookup values in the database */ for (i = 0; i < LOOP; i++) { key.data = &i; key.size = sizeof(i); record.size = key.size; record.data = key.data; st = ham_db_insert(db, 0, &key, &record, 0); if (st != HAM_SUCCESS) error("ham_db_insert", st); } /* now lookup all values */ for (i = 0; i < LOOP; i++) { key.data = &i; key.size = sizeof(i); st = ham_db_find(db, 0, &key, &record, 0); if (st != HAM_SUCCESS) error("ham_db_find", st); /* check if the value is ok */ if (*(int *)record.data != i) { printf("ham_db_find() ok, but returned bad value\n"); return (-1); } } /* erase everything */ for (i = 0; i < LOOP; i++) { key.data = &i; key.size = sizeof(i); st = ham_db_erase(db, 0, &key, 0); if (st != HAM_SUCCESS) error("ham_db_erase", st); } /* and make sure that the database is empty */ for (i = 0; i < LOOP; i++) { key.data = &i; key.size = sizeof(i); st = ham_db_find(db, 0, &key, &record, 0); if (st != HAM_KEY_NOT_FOUND) error("ham_db_find", st); } /* close the database handle */ st = ham_db_close(db, 0); if (st != HAM_SUCCESS) error("ham_db_close", st); /* close the environment handle */ st = ham_env_close(env, 0); if (st != HAM_SUCCESS) error("ham_env_close", st); printf("success!\n"); return (0); }
int main(int argc, char **argv) { uint32_t i; ham_status_t st; /* status variable */ ham_env_t *env; /* hamsterdb environment object */ ham_db_t *db; /* hamsterdb database object */ ham_key_t key = {0}; /* the structure for a key */ ham_record_t record = {0}; /* the structure for a record */ ham_parameter_t params[] = { /* parameters for ham_env_create_db */ {HAM_PARAM_KEY_TYPE, HAM_TYPE_UINT32}, {HAM_PARAM_RECORD_SIZE, sizeof(uint32_t)}, {0, } }; /* First create a new hamsterdb Environment */ st = ham_env_create(&env, "test.db", 0, 0664, 0); if (st != HAM_SUCCESS) error("ham_create", st); /* And in this Environment we create a new Database for uint32-keys * and uint32-records. */ st = ham_env_create_db(env, &db, DATABASE_NAME, 0, ¶ms[0]); if (st != HAM_SUCCESS) error("ham_create", st); /* * now we can insert, delete or lookup values in the database * * for our test program, we just insert a few values, then look them * up, then delete them and try to look them up again (which will fail). */ for (i = 0; i < LOOP; i++) { key.data = &i; key.size = sizeof(i); record.size = key.size; record.data = key.data; st = ham_db_insert(db, 0, &key, &record, 0); if (st != HAM_SUCCESS) error("ham_db_insert", st); } /* * now lookup all values * * for ham_db_find(), we could use the flag HAM_RECORD_USER_ALLOC, if WE * allocate record.data (otherwise the memory is automatically allocated * by hamsterdb) */ for (i = 0; i < LOOP; i++) { key.data = &i; key.size = sizeof(i); st = ham_db_find(db, 0, &key, &record, 0); if (st != HAM_SUCCESS) error("ham_db_find", st); /* * check if the value is ok */ if (*(int *)record.data != i) { printf("ham_db_find() ok, but returned bad value\n"); return (-1); } } /* * close the database handle, then re-open it (to demonstrate how to open * an Environment and a Database) */ st = ham_db_close(db, 0); if (st != HAM_SUCCESS) error("ham_db_close", st); st = ham_env_close(env, 0); if (st != HAM_SUCCESS) error("ham_env_close", st); st = ham_env_open(&env, "test.db", 0, 0); if (st != HAM_SUCCESS) error("ham_env_open", st); st = ham_env_open_db(env, &db, DATABASE_NAME, 0, 0); if (st != HAM_SUCCESS) error("ham_env_open_db", st); /* now erase all values */ for (i = 0; i < LOOP; i++) { key.size = sizeof(i); key.data = &i; st = ham_db_erase(db, 0, &key, 0); if (st != HAM_SUCCESS) error("ham_db_erase", st); } /* * once more we try to find all values... every ham_db_find() call must * now fail with HAM_KEY_NOT_FOUND */ for (i = 0; i < LOOP; i++) { key.size = sizeof(i); key.data = &i; st = ham_db_find(db, 0, &key, &record, 0); if (st != HAM_KEY_NOT_FOUND) error("ham_db_find", st); } /* we're done! close the handles. HAM_AUTO_CLEANUP will also close the * 'db' handle */ st = ham_env_close(env, HAM_AUTO_CLEANUP); if (st != HAM_SUCCESS) error("ham_env_close", st); printf("success!\n"); return (0); }