如何获取GDBM数据库的结构

如何获取GDBM数据库的结构

调制解调器管理器 GUI 创建一个名为sms.gdbm存储所有 SMS 详细信息的数据库。目前调制解调器管理器 GUI 不提供简单删除所有接收/发送消息的功能。所以我试图创建一个程序来从数据库中删除这些记录(sms.gdbm)。但首先我想知道数据库的结构sms.gdbm。它包含哪些数据库,以及表及其列名称。那么有没有 CLI 或 GUI 程序可以显示文件的结构呢*.gdbm

答案1

GDBM 数据库可通过 GDBM API 读取。它们基本上是存储任何类型的简单键值对的一种方法。没有传统 DBMS 中的“结构”:没有表,没有列......只有键和值。

该API定义了以下函数:

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

基本上,您所要做的就是通过 API 打开文件......

GDBM_FILE database = gdbm_open("sms.gdbm", 512, GDBM_READER, 0, NULL);

并开始阅读:

#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;
}

请注意,数据库中存储的数据类型并不确定。在这里,我假设会有字符串,但也可能是任何事物。数据以二进制形式存储,唯一可以确定的是大小 ( data.dsize)。 API 将为您提供一个指向数据开头 ( data.dptr) 的指针,但如何处理它取决于您(或者至少取决于您的调制解调器管理器图形用户界面)。

找到要删除的条目后,只需调用gdbm_delete

gdbm_delete(database, key);

完成后不要忘记关闭所有内容;)

gdbm_close(database);

我不知道有任何可用的 GDBM 阅读器程序,但是编写一个程序并不需要太多的努力。不要忘记gdbm.h在编译时包含 GDBM 标头 ( ) 并链接库:

gcc reader.c -o reader -lgdbm

相关内容