首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取GDBM数据库的结构

如何获取GDBM数据库的结构
EN

Unix & Linux用户
提问于 2015-07-18 15:52:28
回答 1查看 1.4K关注 0票数 2

Modem Manager创建一个名为sms.gdbm的数据库来存储所有SMS详细信息。目前,Modem Manager GUI没有提供简单删除所有接收/发送的消息的功能。因此,我试图创建一个程序,从它的数据库(sms.gdbm)中删除这些记录。但首先,我想知道sms.gdbm数据库的结构。它所包含的数据库、表和它们的列名是什么。那么,是否有任何CLI或GUI程序来显示*.gdbm文件的结构?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2015-07-18 18:18:27

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

API定义了以下函数:

代码语言:javascript
复制
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打开文件.

代码语言:javascript
复制
GDBM_FILE database = gdbm_open("sms.gdbm", 512, GDBM_READER, 0, NULL);

开始阅读:

代码语言:javascript
复制
#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)的指针,但是如何处理它取决于您(或者至少是Modem Manager )。

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

代码语言:javascript
复制
gdbm_delete(database, key);

不要忘记当你做完所有的事情时,都要关闭;)

代码语言:javascript
复制
gdbm_close(database);

我不知道已经有任何GDBM读取器程序可用,但是编写GDBM阅读器程序并不需要花费太多的精力。不要忘记在编译时包括GDBM (gdbm.h)和链接库:

代码语言:javascript
复制
gcc reader.c -o reader -lgdbm
票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/216941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档