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データの先頭 ( ) へのポインタを提供しますが、これを使用して行うことはユーザー次第です。モデム管理者GUI)。

削除したいものが見つかったら、次のように呼び出しますgdbm_delete

gdbm_delete(database, key);

作業が終わったら、すべて閉じることを忘れないでください。 ;)

gdbm_close(database);

私は利用可能なGDBMリーダープログラムを知りませんが、プログラムを書くのに多くの努力は必要ありません。gdbm.hコンパイル時にGDBMヘッダー()を含めてライブラリをリンクすることを忘れないでください。

gcc reader.c -o reader -lgdbm

関連情報