Question

* --- Edit - maintenant toute sourse *

Quand je debug sur la fin, « get » et « valeur » ont des valeurs différentes! Probablement, je convertir en void * et retour à l'utilisateur dans le mauvais sens?

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

solution

créer une sorte de « serializator » ce qui convertirait de tous les POD dans le vide de * et unira ces pièces

PS Ou je serais réécrivent l'utilisateur dans le type POD et tout ira bien, je l'espère.

Ajouter

Il est étrange, mais ... Je jette un defenetly objet non-pod pour annuler * et le dos (il a std :: string à l'intérieur) et il est tout droit (sans l'envoyer à la db et retour). Comment est-ce possible? Et après que je CAST et envoie « creux » db objet defenetly pod (aucune méthode supplémentaire, tous les membres sont pod, il est un simple struct {int a, int b, ...}) je reviens dirted un. Quel est le problème avec mon approche?

Ajouter environ une semaine après la première 'ajouter'

Merde ... Je l'ai compilé les, juste pour jeter un oeil à quel genre de saleté il returnes, et oh! il est bien! ... Je ne peux pas! ! ... .. AAh Seigneur ... Une question raisonnable (à 99,999 pour cent des situations bonne réponse est « mon », mais ... ici ...) - Whos est ce défaut? Mon ou VSs?

Était-ce utile?

La solution

À moins User est un POD ce n'est pas défini en C ++.

Edit:

db_cxx.h , vous n'êtes pas censé faire appel get_doff() , get_dlen() et get_data() ou quelque chose sur Dbt au lieu de simplement coulée (et l'affectation) au type d'utilisateur?

Autres conseils

Comme il n'y a pas de contrôle de la valeur de retour de vente (), il pourrait bien être il y a une erreur qui a empêché la mise à jour. La documentation indique un certain nombre condtions d'erreur:

Vous êtes presque certainement pas censé jeter « get » à un utilisateur. Au lieu de cela, extraire les données stockées, puis jeté ça. Nous ne pouvons pas savoir à coup sûr, à moins que vous partagez avec nous la définition de Debt. Faire une estimation, basée sur ce que nous peut voir:

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

Dites-nous plus d'informations Debt et nous pouvons probablement vous aider à en savoir plus.

Je ferais quelque chose comme ceci:

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

Ensuite, l'extraire ressemblerait à ceci:

//// Get from DB

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

 dbStoreStream >> outUSer;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top