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 Problemvoid 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.
-
Klingt nach einem Inputiterator.
-
@SeppJ
Jau, Danke, Inputiterator sieht gut aus.