Modem Manager创建一个名为sms.gdbm的数据库来存储所有SMS详细信息。目前,Modem Manager GUI没有提供简单删除所有接收/发送的消息的功能。因此,我试图创建一个程序,从它的数据库(sms.gdbm)中删除这些记录。但首先,我想知道sms.gdbm数据库的结构。它所包含的数据库、表和它们的列名是什么。那么,是否有任何CLI或GUI程序来显示*.gdbm文件的结构?
发布于 2015-07-18 18:18:27
GDBM数据库可以通过GDBM读取。它们基本上是存储任何类型的简单键值对的一种方法。没有像传统DBMSes那样的“结构”:没有表,没有列.只有钥匙和价值。
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)的指针,但是如何处理它取决于您(或者至少是Modem Manager )。
找到要删除的条目后,只需调用gdbm_delete:
gdbm_delete(database, key);不要忘记当你做完所有的事情时,都要关闭;)
gdbm_close(database);我不知道已经有任何GDBM读取器程序可用,但是编写GDBM阅读器程序并不需要花费太多的精力。不要忘记在编译时包括GDBM (gdbm.h)和链接库:
gcc reader.c -o reader -lgdbmhttps://unix.stackexchange.com/questions/216941
复制相似问题