Pergunta

* --- Editar -agora o Sourse inteiro*

Quando eu depurar no final, "Get" e "Value" têm valores diferentes! Provavelmente, eu converti para void* e volto ao usuário da maneira errada?

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

solução

Crie um tipo de "serializador" o que converteria todos os pods em vazio* e depois unirá essas peças

PS ou eu reescreveria o usuário no tipo POD e tudo ficará bem, espero.

Adicionar

É estranho, mas ... eu lancei um objeto não-pod para anular* e traseiro (ele tem std :: string dentro) e está tudo bem (sem enviá-lo para o banco de dados e as costas). Como isso poderia ser? E depois que eu lanço e envio o objeto 'DB' de vagem de 'DB' (sem métodos extras, todos os membros são pod, é uma estrutura simples {int a; int b; ...}) eu volto a ser direto. O que há de errado com minha abordagem?

Adicione uma semana após o primeiro 'add'

Droga ... eu compilei, apenas para dar uma olhada em que tipo de sujeira ele retorna, e oh! Está tudo bem! ... eu não posso! ... aah! .. Senhor ... uma pergunta razoável (em 99,999 % das situações, a resposta certa é 'meu', mas ... aqui ...) - Quem é essa culpa? Meu ou VSS?

Foi útil?

Solução

A não ser que User é um Pod Isso é indefinido em C ++.

Editar:

Olhando para db_cxx.h, você não deveria ligar get_doff(), get_dlen(), e get_data() ou algo em Dbt Em vez de apenas lançar (e atribuí -lo) ao tipo de usuário?

Outras dicas

Como não há verificação do valor de retorno de put (), pode muito bem ser um erro que impediu a atualização. A documentação indica algumas condições de erro:

Você quase definitivamente não deve ser lançado diretamente para um usuário. Em vez disso, extraia os dados que você armazenou e, em seguida, faça isso. Não podemos saber com certeza, a menos que você compartilhe conosco a definição de DBT. Fazendo um palpite, com base no que nós posso Vejo:

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

Conte -nos mais sobre o DBT e provavelmente podemos ajudá -lo mais.

Eu faria algo assim:

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

Em seguida, extrair seria assim:

//// Get from DB

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

 dbStoreStream >> outUSer;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top