3

* ---編集 - ソース全体*

最後にデバッグすると、「get」と「value」の値が違う!おそらく、間違った方法で void* に変換して User に戻しますか?

#include <db_cxx.h>
#include <stdio.h>

struct User{
User(){}
int name;
int town;
User(int a){};
inline int get_index(int a){
    return town;
} //for another stuff
};
int main(){ 
try {
DbEnv* env = new DbEnv(NULL);
env->open("./", 
    DB_CREATE | DB_INIT_MPOOL | DB_THREAD | 
DB_INIT_LOCK | DB_INIT_TXN | DB_RECOVER | DB_INIT_LOG, 0);
Db* datab = new Db(env, 0);
datab->open(NULL, "db.dbf", NULL, DB_BTREE, DB_CREATE | DB_AUTO_COMMIT, 0);

Dbt key, value, get;
char a[10] = "bbaaccd";
User u;
u.name = 1;
u.town = 34;
key.set_data(a);
key.set_size(strlen(a) + 1 );
value.set_data((void*)&u);
value.set_size(sizeof(u));
get.set_flags(DB_DBT_MALLOC);

DbTxn* txn;
env->txn_begin(NULL, &txn, 0);
datab->put(txn, &key, &value, 0);
datab->get(txn, &key, &get, 0);
txn->commit(0);
User g;
g = *((User*)&get);
printf("%d", g.town);
getchar();
return 0;
}catch (DbException &e){
    printf("%s", e.what());
    getchar();
}

解決

すべてのPODをvoid *に変換し、これらの部分を結合する一種の「シリアライザ」を作成します

PS または、User を POD タイプに書き換えると、すべてがうまくいくと思います。

追加

それは奇妙ですが...私はdefenetly非podオブジェクトをvoid *にキャストして戻し(内部にstd::stringがあります)、それで問題ありません(dbに送信して戻す必要はありません)。どうしてですか?そして、'trough' db defenetly pod オブジェクトをキャストして送信した後 (追加のメソッドはありません。すべてのメンバーはポッドです。単純な構造体 {int a; int b; ...} です)。私のアプローチの何が問題になっていますか?

最初の「追加」の約 1 週間後に追加

くそー...私はそれをコンパイルしました。それが返す汚れの種類を見てください。大丈夫!・・・無理!... ああ!. 主よ... 合理的な質問 (状況の 99.999% で正しい答えは「私の」ですが... ここでは...) - これは誰のせいですか? 私またはVS?

4

4 に答える 4

7

PODでない限りUser、これはC++では定義されていません。

編集:

db_cxx.hを見ると、ユーザータイプにキャスト(および割り当て)するのではなくget_doff()、、、、または何かをget_dlen()呼び出すことになっているのではないでしょうか。get_data()Dbt

于 2010-01-20T18:31:21.790 に答える
1

「get」をユーザーに直接キャストすることは、ほぼ確実に想定されていません。代わりに、保存したデータを抽出してキャストします。Dbt の定義を私たちと共有しない限り、私たちは確かに知ることができません. 私たちが見ることができるものに基づいて、推測を行います:

datab->get(txn, &key, &get, 0);
void* data = get.get_data();
User g = *((User*)data);

Dbt について詳しく教えてください。おそらくもっと役立つことができます。

于 2010-01-20T18:49:40.733 に答える
1

put() の戻り値のチェックがないため、更新を妨げるエラーが発生している可能性があります。 ドキュメントには、かなりの数のエラー状態が示されています。

于 2010-01-20T18:46:58.667 に答える
0

私はこのようなことをします:

User               user;
std::stringstream  dbStotrStream;

dbStoreStream << user;  // Serialize user
std::string        dbStore(bdStoreStream.str());
value.set_data(dbStore.c_str());  
value.set_size(dbStore.lenght());

////  Put in DB

次に、それを抽出すると、次のようになります。

//// Get from DB

std::string        dbStore(get.get_data(),get.get_date() + get.get_size());
std::stringstream  dbStoreStream(dbStore);
User              outUser;

 dbStoreStream >> outUSer;
于 2010-01-20T19:17:33.403 に答える