Como obter a estrutura de um banco de dados GDBM

1

A GUI do Modem Manager cria um banco de dados chamado sms.gdbm para armazenar todos os detalhes do SMS. Atualmente, a GUI do Modem Manager não está fornecendo um recurso para simplesmente excluir todas as mensagens recebidas / enviadas. Então, estou tentando criar um programa para remover esses registros de seu banco de dados ( sms.gdbm ). Mas primeiro eu quero saber a estrutura do banco de dados sms.gdbm . Quais são os bancos de dados que contém, também tabela e seus nomes de coluna. Então, há algum programa CLI ou GUI para exibir a estrutura de um arquivo *.gdbm ?

    
por DScript 18.07.2015 / 17:52

1 resposta

3

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
    
por 18.07.2015 / 20:18