2016-12-28 3 views
0

ich eine DLL gebaut haben, die eine Klasse umfasst replicaset die mongoDB Durchführung der Vorhaben betraut. Hier ist eine Zusammenfassung der Klasse.C++ Legacy-Treiber mongoDB Replicaset in der Klasse einer DLL

#include "mongo/client/dbclient.h" 

mongoimp::mongoimp() { 
    mongo::client::initialize(); 
} 

mongoimp::~mongoimp() { 
    mongo::client::shutdown(); 
} 

int mongoimp::queryTRecords() { 
    string errmsg; 
    vector<mongo::HostAndPort> hosts = { mongo::HostAndPort("xx-a0.yyyy.com:xxxxx"), mongo::HostAndPort("xx-a1.yyyy.com:xxxxx") }; 
    static mongo::DBClientReplicaSet con("xx", hosts, 0); 
    con.connect(); 
    con.auth("dbname", "username", "password", errmsg); 
    auto_ptr<DBClientCursor> cursor = con.query("dbname.t", BSONObj()); 
    BSONObj response; 
    con.logout("xx", response); 
    if (cursor->more()) { 
     BSONObj recordnm = cursor->nextSafe(); 
     return(recordnm.getIntField("lastid")); 
    } else return(-1); 
} 

Der obige Code funktioniert. Aber hier sind meine Fragen:

1) Mit der obigen Einstellung kann ich normale MongoDB-Operationen mit der DLL, aber da meine Anwendung muss ständig MongoDB Daten (in der Nähe von Echtzeit, bis zu Hunderten einer Sekunde) aktualisieren, Beim Aktualisieren der Daten wird ein Fehler angezeigt (keine gültigen Replicaset-Instanzserver gefunden).

2) Nur der Server muss die mongoDB Datenbank sprechen. Also im Grunde brauche ich nur eine Verbindung zur Datenbank. Daher möchte ich die mongo :: DBClientReplicaSet-Con als eine statische globale Variable deklarieren und eine Verbindung zu ihr in der Klassenkonstrukt-Funktion herstellen. Aber es schien, ich kann es nicht tun. Meine Anwendung kann überhaupt nicht ausgeführt werden. Damit bekomme ich ständig den folgenden Fehler.

Assertion failed: px = 0, Datei C: \ Boost-\ include \ boost-1_62 \ boost/smart_ptr/scoped_ptr.hpp, Linie 105

niemand wissen, wie das Problem zu lösen?

Unten ist der Code, den ich versucht:..

static mongo::DBClientReplicaSet con("xx", { mongo::HostAndPort("xx-a0.yyyy.com:xxxxx"), mongo::HostAndPort("xx-a1.yyyy.com:xxxxx") }, 0); 

mongoimp::mongoimp() { 
    mongo::client::initialize(); 
    string errmsg; 
    con.connect(); 
    con.auth("dbname", "username", "password", errmsg); 
} 

mongoimp::~mongoimp() { 
    BSONObj response; 
    con.logout("xx", response); 
    mongo::client::shutdown(); 
} 

int mongoimp::queryTRecords() { 
    auto_ptr<DBClientCursor> cursor = con.query("dbname.t", BSONObj()); 
    if (cursor->more()) { 
     BSONObj recordnm = cursor->nextSafe(); 
     return(recordnm.getIntField("lastid")); 
    } else return(-1); 
} 

3) Letzte Frage, ich bemerkte, dass es Mongo/client/dbclient_rs.h“Datei für replicaset ist, aber es schien ich es nicht mit, dass zu verwenden, ich erhalte Fehler für initialize() und auto_ptr Cursor. Wie kann ich die Datei verwenden, um alle Vorteile der replicaset Funktionen nehmen? Wie kann ich die Relica gesetzt initialisieren, wenn ich „dbclient_rs.h“ kann? Wie kann ich abfragen und holen Daten in diesem Fall?

vielen Dank im Voraus!

Antwort

0

Fo r Frage No. 2, erinnerte ich mich, den Grund für den Fehler:

Sie müssen Mongo anrufen :: Client :: initialisieren, bevor Sie Treiberobjekte konstruieren oder BSON für diese Angelegenheit.

Aber wie die globale Definition möglich machen, ich muss noch eine Lösung.

Verwandte Themen