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?

È stato utile?

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 : -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top