2016-09-04 23 views
1

私はバークレーDBを使用して単純なキー/データペアを格納して取得しようとしていますが、期待通りに動作しません。 データベースにキー/データのペアを入れるための関数(putdb())と、このペアを取得するための別の(getdb())関数を作成します。Berkeley DBはdbを閉じることなくデータにアクセスできません

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <db.h> 
DB *dbp; 
void opendb(void) 
{ 
     int ret; 
     if ((ret = db_create(&dbp, NULL, 0)) != 0) 
       exit(EXIT_FAILURE); 
     if ((ret = dbp->open(dbp, NULL, "db.db", NULL,DB_BTREE, DB_CREATE, 0664)) != 0) 
       exit(EXIT_FAILURE); 
} 


void putdb(const char *key, const char *value) 
{ 
    DBT keyValue, dataValue; 
    memset(&keyValue, 0, sizeof(keyValue)); 
    memset(&dataValue, 0, sizeof(dataValue)); 

    keyValue.size = sizeof(key); 
    dataValue.size = sizeof(value); 

    keyValue.data = malloc(keyValue.size); 
    strcpy(keyValue.data,key); 

    dataValue.data = malloc(dataValue.size); 
    strcpy(dataValue.data,value); 

    if ((ret = dbp->put(dbp, NULL, &keyValue, &dataValue, 0)) == 0) 
      printf("db: %s: key stored.\n", (char *)keyValue.data); 
    else { 
      dbp->err(dbp, ret, "DB->put"); 
    } 
    dbp->sync(dbp, 0); 
} 

void getdb(const char *key,const char *value) 
{ 
    DBT keyValue, dataValue; 
    memset(&keyValue, 0, sizeof(keyValue)); 
    memset(&dataValue, 0, sizeof(dataValue)); 

    keyValue.size = sizeof(key); 
    dataValue.size = sizeof(value); 

    keyValue.data = malloc(keyValue.size); 
    strcpy(keyValue.data,key); 

    dataValue.data = malloc(dataValue.size); 
    strcpy(dataValue.data,value); 

    if ((ret = dbp->get(dbp, NULL, &keyValue, &dataValue, 0)) == 0) 
      printf("db: %s: key retrieved: data was %s.\n", 
       (char *)keyValue.data, (char *)dataValue.data); 
    else { 
      dbp->err(dbp, ret, "DB->get"); 
    } 
} 
void closedb(void) 
{ 
    dbp->close(dbp, 0); 
    //TODO : error code return check 
} 

とメインファイル:

int main() 
{ 
    opendb(); 
    putdb("toto","titi"); 
    getdb("toto","titi"); 
    closedb(); 
} 

と私が手:

db: toto: key stored. 
DB->get: BDB0073 DB_NOTFOUND: No matching key/data pair found 

あなたは理由を説明することはできますか?私は私の主な機能を変更した場合

お知らせ:

int main() 
{ 
    opendb(); 
    putdb("toto","titi"); 
    closedb(); 
    opendb(); 
    getdb("toto","titi"); 
    closedb(); 
} 

が、それは動作します! :

db: toto: key stored. 
db: toto: key retrieved: data was titi. 
+0

いかなる理由でstrlen(key)を使用する必要がありますか? – Olaf

+1

32ビットプラットフォームを使用している場合は、割り当ての範囲外で書かれています。これは未定義の動作です。 64ビットアーキテクチャでは、UBでもある初期化されていないメモリを読み込んでおり、キーが見つからないエラーが発生する可能性があります。すべての場合、あなたは記憶を漏らしています。たとえ問題が解決できない場合でも、問題を解決したいかもしれません。 – rici

答えて

3

チュートリアルからあまりにも多くのコピーをしました。彼らはsizeof("a string")使用できますが、あなたがC++タグを追加し、両方のputdbgetdb

keyValue.size = strlen(key); 
dataValue.size = strlen(value); 
+1

通常は、*キーを取得するとき*データ値を提供しません。 'getdb(" key "、" value ")'は、OPがデータストアについてもう少し詳しく知っていることを示唆しています。 :) – rici

+1

@rici yepp、 "私はチュートリアルからあまりにも多くをコピーしました"と述べました。それはちょっと微妙でしたか? – deamentiaemundi

+1

私はあなたが何を指しているのかわかりませんが、たとえばmalloc snd strcpyがコピーされた場合、非常に悪いチュートリアルであり、可能な限り早い時期に悲惨さから取り除かなければなりません。悲しいことに、そのような反ユダヤ教は存在しますが、これは過度のコピーではなく、むしろ以前は同化された貨物カルトに基づいていると思われます。いずれの場合でも、解毒剤の最小限はおそらく単純なコピー可能な例です。 – rici

関連する問題