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?

Foi útil?

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 :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top