Verhalten eigenes Iterators



  • Hallo zusammen,

    ich würde einem OdbcRecordset gern ein Iterator-Interface verpassen, um über die einzelnen Zeile zu laufen. Selbst für einen Foward-Iterator muss der operator++( int ) überladen werden, der den Zustand vorm Inkrement zurückgibt. Diesen Zustand gibt´s aber nicht, denn der kleinste gemeinsame Nenner bei ODBC ist ein Forward Cursor, der nur zum nächsten Datensatz springen kann, aber nicht zurück. Cursor für wahlfreien Zugriff sind implementierungsabhängig und optional, d.h. nicht jeder ODBc Treiber bietet wahlfreien Zugriff an.
    Der Cursor selbst ist irgendein OS Handle, das Objekt dahinter kann ich also auch nicht so einfach kopieren.
    Detail:
    SQLRETURN SQLFetch( SQLHSTMT StatementHandle ) bewegt den Cursor auf die nächste Zeile der Ergebnismenge. Die aktuelle Cursorposition wird irgendwie mit dem StatementHandle verwaltet.
    Und jetzt das Problem 😉

    void OdbcRecordset::operator++()
    {
       // zur nächsten Zeile springen und aktuellen Zustand zurückgeben, kein Problem
       ::SQLFetch( ... );
      return *this;
    }
    
    void OdbcRecordset::operator++( int )
    {
       // zur nächsten Zeile springen und alten Zustand zurückgeben. Huch, Problem!
       ::SQLFetch( ... );
      return ???; // was kann ich hier zurückgeben?
    }
    

    Wie handhabt man das? Funktion nicht implementieren? Oder doch, mit anderem Verhalten?



  • @DocShoe Ich würde es nicht implementieren wenn es die Datenstruktur nicht hergibt.


  • Mod

    Klingt nach einem Inputiterator.



  • @SeppJ
    Jau, Danke, Inputiterator sieht gut aus.


Log in to reply