Question

Je suis en train d'écrire simple programme C ++ qui utilise Berkeley DB pour le stockage. La clé de la base de données est de type time_t et les données est un integer.

Je dois prendre la différence entre deux données adjacentes dans un entre deux clés. J'ouvre un curseur avec le drapeau DB_SET_RANGE puis-je utiliser DB_NEXT itérer.

Mon problème est que le curseur renvoie des données non triées. Y at-il un moyen de spécifier une fonction de tri personnalisé pour le curseur?

Était-ce utile?

La solution

Certaines des raisons pour lesquelles vous voudrez peut-être fournir une fonction de tri personnalisée sont:

  

Vous utilisez un système little-endian (par exemple x86) et que vous utilisez des entiers comme les clés de votre base de données. clés Berkeley DB stocke sous forme de chaînes d'octets et des entiers little-endian ne trie pas bien quand considérés comme des chaînes d'octets. Il existe plusieurs solutions à ce problème, un être de fournir une fonction de comparaison personnalisée. Voir http://www.oracle.com /technology/documentation/berkeley-db/db/ref/am_misc/faq.html pour plus d'informations.

Vous définissez la fonction de comparaison clé d'un BTree en utilisant DB-> set_bt_compare ().

Par exemple, une routine d'exemple qui est utilisé pour trier les clés entiers dans la base de données est:

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

Autres conseils

Je pense que vous devez créer un index secondaire pour vos données.

Je l'avais essayé de dormir Cat Berkeley Base de données (en raison de la maintenance du code) mais je ne l'ai pas essayer indices secondaires.
Si perfomance est pas si critique et vous pouvez changer de moteur de base de données, je vous recommande SQLite : -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top