Problema con Berkeley DB y C ++
-
21-09-2019 - |
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?
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);
}
Otros consejos
Yo creo que hay que crear un href="http://pybsddb.sourceforge.net/ref/am/second.html" rel="nofollow noreferrer"> índice secundario
Había intentado dormir gato Berkeley base de datos (debido al mantenimiento del código) pero no trate de índices secundarios.
Si perfomance de no es tan crítica y se puede cambiar la base de datos del motor, recomiendo SQLite : -)