Os bancos de dados do GDBM são legíveis por meio da API do GDBM. Eu escrevi um pequeno artigo sobre isso no ano passado . Eles são basicamente uma maneira de armazenar pares simples de valor-chave de qualquer tipo. Não há "estrutura" como nos DBMSs tradicionais: sem tabelas, sem colunas ... Apenas chaves e valores.
A API define as seguintes funções:
GDBM_FILE gdbm_open (const char *name, int block_size, int flags, int mode, void (*fatal_func)(const char *));
void gdbm_close (GDBM_FILE dbf);
typedef struct {
char *dptr;
int dsize;
} datum;
int gdbm_store (GDBM_FILE dbf, datum key, datum content, int flag);
datum gdbm_fetch (GDBM_FILE dbf, datum key);
int gdbm_delete (GDBM_FILE dbf, datum key);
datum gdbm_firstkey (GDBM_FILE dbf);
datum datum gdbm_nextkey (GDBM_FILE dbf, datum prev);
const char * gdbm_strerror (gdbm_error errno);
Basicamente, tudo o que você precisa fazer é abrir o arquivo por meio da API ...
GDBM_FILE database = gdbm_open("sms.gdbm", 512, GDBM_READER, 0, NULL);
E comece a ler:
#include <stdio.h>
#include <stdlib.h>
#include <gdbm.h>
int main(int argc, char** argv)
{
GDBM_FILE database = gdbm_open("sms.gdbm", 512, GDBM_READER, 0, NULL);
datum key, data;
for(key = gdbm_firstkey(database); /* get the first key */
key.dptr != NULL; /* keep going until the end */
key = gdbm_nextkey(database, key)) /* next key */
{
/* fetch data associated to key */
data = gdbm_fetch(database, key);
if(data.dptr != NULL)
printf("Entry found (%d bytes) : %s.\n", data.dsize, data.dptr);
}
gdbm_close(database);
return EXIT_SUCCESS;
}
Tenha cuidado para que não haja certeza quanto ao tipo de dados armazenados no banco de dados. Aqui, eu presumi que haveria strings, mas poderia ser qualquer coisa . Os dados são armazenados em formato binário e a única coisa que você pode ter certeza é o tamanho ( data.dsize
). A API fornecerá um ponteiro para o início dos dados ( data.dptr
), mas a maneira como você processa depende de você (ou, pelo menos, até a sua GUI do Modem Manager ).
Depois de encontrar a entrada que deseja excluir, basta ligar para gdbm_delete
:
gdbm_delete(database, key);
E não se esqueça de fechar tudo quando terminar;)
gdbm_close(database);
Não tenho conhecimento de nenhum programa leitor GDBM já disponível, mas escrever um não requer muito esforço. Não esqueça de incluir o cabeçalho do GDBM ( gdbm.h
) e vincular a biblioteca ao compilar:
gcc reader.c -o reader -lgdbm