Problema con Berkeley DB e C ++
-
21-09-2019 - |
Domanda
Sto cercando di scrivere un semplice programma C ++ che utilizza Berkeley DB per la conservazione. La chiave della banca dati è di tipo time_t
e dei dati è un integer
.
ho bisogno di prendere la differenza tra due dati adiacenti in una tra due chiave. Apro un cursore con la DB_SET_RANGE bandiera e poi uso DB_NEXT iterare.
Il mio problema è che il cursore restituisce i dati non ordinati. C'è un modo per specificare una funzione selezionatrice personalizzata per il cursore?
Soluzione
Alcuni dei motivi per cui si consiglia di fornire una funzione di ordinamento personalizzato sono:
Si sta utilizzando un sistema little-endian (come x86) e si utilizza interi come le chiavi del vostro database. Berkeley DB memorizza le chiavi come stringhe di byte e interi little-endian non sorta bene quando visti come stringhe di byte. Ci sono diverse soluzioni a questo problema, un essere per fornire una funzione di confronto personalizzato. Vedere http://www.oracle.com /technology/documentation/berkeley-db/db/ref/am_misc/faq.html per ulteriori informazioni.
È possibile impostare la funzione di confronto chiave di un BTree utilizzando DB-> set_bt_compare ().
Per esempio, una routine di esempio che viene utilizzato per ordinare chiavi intere nel database è:
int
compare_int(DB *dbp, const DBT *a, const DBT *b)
{
int ai, bi;
/*
* Returns:
* < 0 if a < b
* = 0 if a = b
* > 0 if a > b
*/
memcpy(&ai, a->data, sizeof(int));
memcpy(&bi, b->data, sizeof(int));
return (ai - bi);
}
Altri suggerimenti
Credo che bisogna creare un indice secondario per i dati.
Avevo provato Gatto di sonno Berkeley Database (a causa di manutenzione del codice), ma non ho provato indici secondari.
Se perfomance non è così critica e si può cambiare motore di database, vi consiglio SQLite : -)