Frage

Ich versuche, ein einfaches C ++ Programm zu schreiben, die Berkeley DB für die Lagerung verwendet. Der Schlüssel der Datenbank ist vom Typ time_t und die Daten sind ein integer.

Ich muß die Differenz zwischen zwei benachbarten Daten in einem zwischen zwei Schlüsseln nehmen. Ich öffne einen Cursor mit der Flagge DB_SET_RANGE und dann verwende ich DB_NEXT iterieren.

Mein Problem ist, dass der Cursor unsortierte Daten zurückgibt. Gibt es eine Möglichkeit, eine benutzerdefinierte Funktion Sortierer für den Cursor angeben?

War es hilfreich?

Lösung

Einige der Gründe, warum Sie möchten eine benutzerdefinierte bieten Sortierfunktion sind:

  

Sie verwenden ein Little-Endian-System (wie zB x86) und Sie sind mit ganzen Zahlen als Datenbank der Schlüssel. Berkeley DB speichert Schlüssel als Byte-Strings und Little-Endian-Zahlen nicht gut sortieren, wenn sie als Byte-Strings betrachtet. Es gibt mehrere Lösungen für dieses Problem, von denen eine eine eigene Vergleichsfunktion bereitzustellen. Siehe http://www.oracle.com /technology/documentation/berkeley-db/db/ref/am_misc/faq.html für weitere Informationen.

Sie setzen einen Schlüsselvergleich der BTree Funktion DB-> set_bt_compare ().

Zum Beispiel kann eine Beispiel-Routine, die Integer-Schlüssel in der Datenbank zu sortieren verwendet wird, ist:

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); 
} 

Andere Tipps

Ich glaube, Sie erstellen müssen, um einen Sekundärindex für Ihre Daten.

hatte ich versucht, Cat Berkeley Datenbank Schlafen (aufgrund Code Wartung), aber ich habe nicht versucht, Sekundärindizes.
Wenn perfomance nicht so kritisch ist, und können Sie Datenbank-Engine wechseln, empfehle ich SQLite : -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top