调制解调器管理器GUI创建一个名称sms.gdbm
为存储所有SMS详细信息的数据库。当前,调制解调器管理器GUI不提供简单删除所有已接收/已发送消息的功能。因此,我试图创建一个程序以从数据库(sms.gdbm
)中删除这些记录。但是首先我想知道sms.gdbm
数据库的结构。它包含哪些数据库,还有表及其列名。那么,是否有任何CLI或GUI程序来显示*.gdbm
文件的结构?
通过GDBM API可以读取GDBM数据库。去年我写了一篇关于它的小文章。它们基本上是一种存储任何类型的简单键/值对的方法。没有传统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
),但是如何处理它取决于您(或者至少取决于您的Modem Manager GUI)。
找到要删除的条目后,只需致电gdbm_delete
:
gdbm_delete(database, key);
并且不要忘记在完成后关闭所有内容;)
gdbm_close(database);
我不知道已经有任何GDBM读取器程序可用,但是编写一个并不需要太多的努力。不要忘了包括GDBM标头(gdbm.h
)并在编译时链接库:
gcc reader.c -o reader -lgdbm
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句