Pregunta

* --- Edición - ahora todo el sourse *

Cuando depurarlo en el extremo, "get" y "valor" tener valores diferentes! Probablemente, convierto a la manera incorrecta void * y de vuelta al usuario?

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

solución

crear una especie de "serializator" lo que sería convertir todos los de dentro void * y luego se unirá a estas piezas POD

PS O me gustaría reescribir usuario en tipo POD y todo va a estar bien, espero.

Añadir

Es extraño, pero ... yo echo un objeto defenetly no pod a void * y la espalda (se ha std :: string dentro) y que está bien (sin enviarlo a la db y la espalda). ¿Como puede ser? Y después yo echo y enviar 'artesa' db objeto defenetly vaina (no hay métodos adicionales, todos los miembros son vaina, que es una estructura sencilla {int a; int b;} ...) yo vuelva dirted uno. ¿Qué le pasa a mi enfoque?

Añadir alrededor semanas después de la primera 'complemento'

Maldición ... he compiló queridos, sólo para echar un vistazo a qué tipo de suciedad que returnes, y oh! que está bien! ... ¡No puedo! ! ... .. AAh Señor ... Una pregunta razonable (en 99,999 por ciento de las situaciones respuesta correcta es 'mi', pero ... aquí ...) - cuyo es este fallo? Mi o VS?

¿Fue útil?

Solución

A menos User es un POD este no está definido en C ++.

Editar:

En cuanto a db_cxx.h , ¿No se supone que ver get_doff() llamada , get_dlen() y get_data() o algo en lugar de sólo Dbt fundición (y la asignación) para el tipo de usuario?

Otros consejos

Dado que no hay ninguna comprobación del valor de retorno de put (), que bien podría ser que hay un error que impedía la actualización. La documentación indica un buen número condtions de error:

Usted está casi seguro que no se supone que fundido 'llegar' directamente a un usuario. En su lugar, extraer los datos se almacenarán y luego echado eso. No podemos saber con seguridad a menos que comparta con nosotros la definición de Dbt. Hacer una conjetura, en base a lo que puede ver:

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

Cuéntanos más sobre Dbt y que probablemente le puede ayudar más.

Me gustaría hacer algo como esto:

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

A continuación, la extracción se vería así:

//// Get from DB

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

 dbStoreStream >> outUSer;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top