Pregunta

Estoy tratando de escribir un simple programa en C ++ que utiliza Berkeley DB para el almacenamiento. La clave de la base de datos es de tipo time_t y los datos es un integer.

necesito tomar la diferencia entre los dos datos adyacentes en una clave entre dos. Abro un cursor con el DB_SET_RANGE bandera y luego i uso DB_NEXT para iterar.

Mi problema es que el cursor vuelve datos no ordenados. ¿Hay una manera de especificar una función clasificadora personalizado para el cursor?

¿Fue útil?

Solución

Algunas de las razones por las que puede proporcionar una costumbre función de clasificación son:

  

Está utilizando un sistema ascendente hacia la izquierda (como x86) y está utilizando números enteros como claves de su base de datos. Berkeley DB almacena claves como cadenas de caracteres y números enteros ascendente hacia la izquierda no se ordenan bien cuando se ve como cadenas de bytes. Hay varias soluciones a este problema, un ser para proporcionar una función de comparación personalizado. Ver http://www.oracle.com /technology/documentation/berkeley-db/db/ref/am_misc/faq.html para más información.

Se establece función de comparación clave de un BTree utilizando DB> set_bt_compare ().

Por ejemplo, una rutina de ejemplo que se utiliza para ordenar número entero teclas en la base de datos es:

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); 
} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top