Domanda

* --- Modifica - ora tutto il sourse *

Quando il debug che alla fine, "get" e "valore" hanno valori diversi! Probabilmente, converto a void * e di nuovo a utente nel modo sbagliato?

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

soluzione

creare una sorta di "serializator" cosa sarebbe convertire tutti di POD in void * e quindi unirà questi pezzi

PS Oppure mi piacerebbe riscrivere l'utente in tipo POD e tutto sarà a posto, spero.

Aggiungi

E 'strano, ma ... ho gettato un oggetto generosi non-pod a void * e ritorno (è std :: string all'interno) e va tutto bene (senza inviarlo al db e ritorno). Come potrebbe essere? E dopo ho lanciato e mando 'depressione' db oggetto generosi pod (nessun metodo in più, tutti i membri sono pod, si tratta di una semplice struct {int a; int b;} ...) mi rimetto dirted uno. Cosa c'è di sbagliato con il mio approccio?

Aggiungi settimana circa dopo il primo 'aggiungere'

Accidenti ... ho compilato quelli, solo per dare un'occhiata a che tipo di sporco che returnes, e oh! va bene! ... non posso! ! ... .. AAh Signore ... Una domanda ragionevole (in 99,999 per cento delle situazioni risposta giusta è 'mio', ma ... qui ...) - whos è questo difetto? La mia o Vss?

È stato utile?

Soluzione

A meno che User è un POD questo non è definito in C ++.

Modifica:

db_cxx.h , non si fa a fare chiamata get_doff() , get_dlen() e get_data() o qualcosa sul Dbt anziché la trasmissione (e l'assegnazione) al tipo di utente?

Altri suggerimenti

Poiché non v'è alcun controllo del valore di ritorno di put (), esso potrebbe essere c'è un errore che ha impedito l'aggiornamento. La documentazione indica un bel po ' condtions errore:

Si è quasi sicuramente non suppone di lanciare 'get' direttamente a un utente. Invece, estrarre i dati memorizzati e poi gettato quello. Non possiamo sapere con certezza a meno che non si condivide con noi la definizione di Dbt. Fare una supposizione, basata su ciò che possono vedi:

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

Dicci di più su Dbt e possiamo probabilmente aiutare di più.

vorrei fare qualcosa di simile a questo:

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

Quindi l'estrazione sarebbe simile a questa:

//// Get from DB

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

 dbStoreStream >> outUSer;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top