Frage

* --- Bearbeiten - jetzt ist die ganze sourse *

Wenn ich debuggen es am Ende, „get“ und „Wert“ haben unterschiedliche Werte! Wahrscheinlich, wandle ich auf void * und zurück auf Benutzer der falsche Weg?

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

Lösung

erstellen eine Art „serializator“, was alle in void * POD umwandeln würde und dann werden diese Stücke

vereinigen

PS Oder würde ich umschreiben Benutzer in POD-Typ und alles wird gut sein, hoffe ich.

Hinzufügen

Es ist seltsam, aber ... Ich warf ein defenetly nicht-pod Objekt void * und zurück (es hat std :: string innen) und es ist alles in Ordnung (ohne es an die DB und zurückschicken). Wie könnte es sein? Und nachdem ich gegossen und senden ‚Trog‘ db defenetly pod Objekt (keine zusätzlichen Methoden, alle Mitglieder sind pod, es ist eine einfache struct {int a; int b; ...}) ich wieder ein dirted bekommen. Was ist los mit meinem Ansatz?

In etwa Woche nach dem ersten 'add'

Verdammt ... ich habe es diejenigen zusammengestellt, für nur einen Blick auf, welche Art von Schmutz es returnes, und oh! es ist in Ordnung! ... ich kann nicht! ! ... AAh .. Herr ... Eine vernünftige Frage (in 99,999 Prozent der Situationen richtige Antwort ist ‚mein‘, aber ... hier ...) - whos dieser Fehler ist? Mein oder VSs?

War es hilfreich?

Lösung

Es sei denn, User ist ein POD dies ist nicht definiert, in C ++.

Edit:

Mit Blick auf db_cxx.h , nicht wahr angenommen Anruf get_doff() zu tun , get_dlen() und get_data() oder etwas auf Dbt statt nur Gießen (und Zuweisen), um es dem Benutzer Typ?

Andere Tipps

Da es keine Überprüfung des Rückgabewertes von put () ist, könnte es gut sein, es ist ein Fehler, die Aktualisierung verhindert. Die Dokumentation gibt eine ganze Reihe von Fehler condtions:

Sie sind fast auf jeden Fall nicht zu Cast soll ‚get‘ direkt an einen Benutzer. Stattdessen extrahieren Sie die von Ihnen gespeicherten Daten und warf dann das. Wir können nicht sicher wissen, wenn Sie mit uns die Definition von Dbt teilen. Eine Vermutung, auf dem, was wir kann sehen:

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

Bitte geben Sie uns mehr über Dbt und wir können Ihnen wahrscheinlich mehr helfen.

Ich würde so etwas tun:

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

Dann Extrahieren es würde wie folgt aussehen:

//// Get from DB

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

 dbStoreStream >> outUSer;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top