Problema com Berkeley DB e C ++
-
21-09-2019 - |
Pergunta
Estou tentando escrever um programa C ++ simples que usa o Berkeley DB para armazenamento. A chave do banco de dados é do tipo time_t
e os dados são um integer
.
Preciso levar a diferença entre dois dados adjacentes em uma chave entre duas. Abro um cursor com o sinalizador db_set_range e depois uso db_next para iterar.
Meu problema é que o cursor retorna dados não classificados. Existe uma maneira de especificar uma função de classificador personalizada para o cursor?
Solução
Algumas das razões pelas quais você pode fornecer uma função de classificação personalizada são:
Você está usando um sistema pouco endiano (como x86) e está usando números inteiros como chaves do seu banco de dados. O Berkeley DB armazena as teclas como cordas de bytes e números inteiros endianos não se classificam bem quando vistos como cordas de bytes. Existem várias soluções para esse problema, uma sendo uma função de comparação personalizada. Ver http://www.oracle.com/technology/documentation/berkeley-db/db/ref/am_misc/faq.html Para maiores informações.
Você define a função de comparação de uma BTTEE usando db-> set_bt_compare ().
Por exemplo, uma rotina de exemplo que é usada para classificar as teclas inteiras no banco de dados é:
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);
}
Outras dicas
Eu acho que você tem que criar um Índice Secundário para seus dados.
Eu tentei o Banco de Dados Berkeley para Cat Berkeley (devido à manutenção do código), mas não tentei índices secundários.
Se o perfoma não for tão crítico e você pode trocar de mecanismo de banco de dados, eu recomendo Sqlite :-)