私は PostgreSQL C API を使用しています。ドキュメントを読むと、PQgetResult が NULL を返すとクエリが終了し、PQisBusy が 0 を返さない場合は PQgetResult がブロックされると記載されています。しかし、PQisBusy はそれ以上入力がない場合は 1 を返すため、PQgetResult を呼び出して NULL を取得することはできません。したがって、クエリが終了したかどうかはわかりません。クエリが完了したかどうかを知る他の方法はありますか? 非同期 API を誤解していませんか?
- - 編集 - - -
C コードとしての基本的な考え方は次のとおりです。
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;
}
}
}
結果は出力されますが、ループは決して終了しません。PQisBusy は一度だけ 0 を返すためです。