モデム管理者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
データの先頭 ( ) へのポインタを提供しますが、これを使用して行うことはユーザー次第です。モデム管理者GUI)。
削除したいものが見つかったら、次のように呼び出しますgdbm_delete
。
gdbm_delete(database, key);
作業が終わったら、すべて閉じることを忘れないでください。 ;)
gdbm_close(database);
私は利用可能なGDBMリーダープログラムを知りませんが、プログラムを書くのに多くの努力は必要ありません。gdbm.h
コンパイル時にGDBMヘッダー()を含めてライブラリをリンクすることを忘れないでください。
gcc reader.c -o reader -lgdbm