Ich arbeite mit der PostgreSQL C API. Beim Lesen der documentation wird angegeben, dass eine Abfrage beendet ist, wenn PQgetResult NULL zurückgibt und PQgetResult blockiert, wenn PQisBusy nicht 0 zurückgibt. PQisBusy gibt jedoch 1 zurück, wenn keine Eingabe mehr vorhanden ist. Daher kann ich PQgetResult nicht aufrufen und NULL abrufen. Daher kann ich nicht wissen, ob die Abfrage beendet ist. Gibt es eine andere Möglichkeit zu wissen, ob die Abfrage abgeschlossen ist? Habe ich die async API falsch verstanden?Postgres Async API Erkennung Ende der Abfrage
---- ----- edit
Die Grundidee, wie C-Code ist:
PQsendQuery(conn, query)
while(true)
{
PQconsumeInput(conn)
if(PQisBusy(conn) == 0)
{
PGresult* res = PQgetResult(conn);
if(res)
{
//print result
}
else
{
//res == NULL
//indicates query is over
break;
}
}
}
Das Ergebnis gedruckt werden, aber die Schleife endet nie. Weil PQisBusy nur einmal 0 zurückgibt.
Es könnte sich lohnen, diese mit Inhalt füllen mit Code aus, das zeigt, was du tust. –
Ich denke, PQgetResult überprüft und wartet auf Besetztzeichen vor dem Zurückgeben des Ergebnisses. Also möglicherweise nicht erforderlich, wenn (PQisBusy (conn) == 0) überhaupt überprüfen. –
@MuhammadUsama der Punkt des Codes ist, dass es nie blockieren kann, daher der Async. Ich weiß, dass es sinnlos ist, Async-I/O in einer ausgelasteten Schleife auszuführen, aber ich brauchte ein minimales Beispiel. – JustMaximumPower