以下のエラー事象が発生した場合は、データベースの切り替えが発生した可能性があります。この場合、コネクションの再接続を行って、トランザクションを再実行してください。
PQresultErrorField()でPG_DIAG_SQLSTATEに"57P01"が返却される。
PQresultErrorField()でPG_DIAG_SQLSTATEにNULLが返却される。
PGconn *conn;
PGresult *res;
…
res = PQexec(conn, "~");
if (PQresultStatus(res) != PGRES_COMMAND_OK) /* (注) */
{
if (PQresultErrorField(res, PG_DIAG_SQLSTATE) == NULL ||
strcmp(PQresultErrorField(res, PG_DIAG_SQLSTATE),"57P01") == 0)
{
PQclear(res);
/* 再接続処理へ */
}
else
{
PQclear(res);
/* その他のエラー */
}
}注)実行するSQL文により、PGRES_COMMAND_OK(データを返さないSQL文の場合) と、 PGRES_TUPLES_OK(データを返すSQL文の場合)を使い分けます。
注意
データベースの切り替えが完了するまでは、コネクションの接続がエラー終了します。PQstatus()はCONNECTION_BADを返却します。
5秒間隔で20回、再接続をリトライする場合。
PGconn *conn;
int count = 0;
do{
count++;
PQreset(conn);
if (PQstatus(conn) != CONNECTION_OK)
{
if (count < 20){
#if defined(WIN32)
Sleep(5000);
#else
sleep(5);
#endif
}else{
/* 再接続失敗 */
}
}else{
/* 再接続完了 */
}
}while(1);