質問

*---編集-現在の出所*

私はデバッグで、"get"と"価値"の価値観も違い!もっ換void*に戻りユーザーの間違ったそうです。

#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();
}

の作成のような"serializator"どのように変換すべてのポッドの入void*そのスタッフ一同これらの作品

PSたい書き換えユーザーへのポッド型すべてのもの"といわれることがありますが、私の願いです。

追加

不思議だが---私はキャストdefenetly非ポッドのオブジェクトvoid*バでは、std::string内で適度なしに送信するdbます。どうなるのでしょうか?とった後、キャストで送谷"'db defenetlyポッドのオブジェクト(追加方法は、全て会員のポッドは、単純なstruct{int a;int b;...})バdirtedます。何が悪いのかという私のアプローチを考えていますか。

追加約週間後に"追加"

気...私はれもの、しているような汚れでreturnes、oh!で大丈夫!...できます。...AAh!..藩主...合理的な設問には99.999%の状況を正解は"私の"ですが---こちらで---)-対象はこの断層?私はVSs?

役に立ちましたか?

解決

Userがある場合を除き、A POD に、これはC ++で定義されています。

編集:

db_cxx.h のを見ると、あなたがコールget_doff()を行うことになっていませんユーザータイプに、get_dlen()、およびget_data()かだけでなく、鋳造(および割り当て)のDbtに何かそれは?

他のヒント

PUT()、それも可能性の戻り値の検査は行われませんので、

は更新を妨げたエラーがあります。 ドキュメントには、かなりの数を示し、エラーcondtionsます:

はあなたが、ほぼ間違いなくキャストユーザーに直接「取得」に想定されていません。代わりに、あなたが保存されたデータを抽出し、そのキャストします。あなたは私たちとDBTの定義を共有しない限り、我々は確実に知ることができません。

:私たちのことができます参照してくださいに基づいて、推測を作ります
datab->get(txn, &key, &get, 0);
void* data = get.get_data();
User g = *((User*)data);

DBTについて詳しく教えてください、私たちは、おそらくより多くのあなたを助けることができます。

私はこのような何かをするだろう

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top