boost::shared_ptr<RoutingNode> SQLiteDatabaseConnection::getNodeByID(boost::uint64_t id) { boost::shared_ptr<RoutingNode> retVal; int rc; if(_getNodeByIDStatement == NULL) { rc = sqlite3_prepare_v2(_db, "SELECT ID, LAT, LON FROM NODES WHERE ID=?;", -1, &_getNodeByIDStatement, NULL); if (rc != SQLITE_OK) { std::cerr << "Failed to create getNodeByIDStatement." << " Resultcode: " << rc << std::endl; return boost::shared_ptr<RoutingNode>(); } } // Parameter an das Statement binden RoutingNode node; node.setID(id); if (node.isIDInLongFormat()) { sqlite3_bind_int64(_getNodeByIDStatement, 1, RoutingNode::convertIDToShortFormat(id)); } else { sqlite3_bind_int64(_getNodeByIDStatement, 1, id); } // Statement ausfuehren, in einer Schleife immer neue Zeilen holen while ((rc = sqlite3_step(_getNodeByIDStatement)) != SQLITE_DONE) { //Es können verschiedene Fehler aufgetreten sein. if (!sqlite_functions::handleSQLiteResultcode(rc)) break; //Erstelle einen neuen Knoten auf dem Heap. //Verwirrend: Hier ist der erste Parameter mit Index 0 und nicht 1 (!!). RoutingNode* newNode = new RoutingNode(sqlite3_column_int64(_getNodeByIDStatement, 0), sqlite3_column_double(_getNodeByIDStatement, 1), sqlite3_column_double(_getNodeByIDStatement, 2)); //Gib ihn an einen boost::shared_ptr weiter. newNode jetzt nicht mehr verwenden oder delete drauf anwenden! boost::shared_ptr<RoutingNode> ptr(newNode); //den boost::shared_ptr zur Liste hinzufügen retVal = ptr; } if (rc != SQLITE_DONE) { std::cerr << "Failed to execute getNodeByIDStatement." << " Resultcode: " << rc << std::endl; return boost::shared_ptr<RoutingNode>(); } rc = sqlite3_reset(_getNodeByIDStatement); if(rc != SQLITE_OK) { std::cerr << "Failed to reset getNodeByIDStatement." << " Resultcode: " << rc << std::endl; } return retVal; }