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;
}