他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

34.7. 処理中の問い合わせのキャンセル #

本節で説明する関数を使用して、クライアントアプリケーションはサーバで処理中のコマンドをキャンセルする要求を行うことができます。

PQgetCancel #

特定のデータベース接続を通して発行されたコマンドをキャンセルするために必要な情報を持つデータ構造を作成します。

PGcancel *PQgetCancel(PGconn *conn);

PQgetCancelは、与えられたPGconn接続オブジェクトのPGcancelオブジェクトを作成します。 与えられたconnNULLもしくは無効な接続であった場合、NULLが返されます。 PGcancelオブジェクトは不透明な構造体であり、アプリケーションから直接アクセスすることができません。 これはPQcancelもしくはPQfreeCancelに渡すことしかできません。

PQfreeCancel #

PQgetCancelで作成されたデータ構造を解放します。

void PQfreeCancel(PGcancel *cancel);

PQfreeCancelは事前にPQgetCancelで作成されたデータオブジェクトを解放します。

PQcancel #

サーバに現在のコマンドの廃棄処理を要求します。

int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);

キャンセル要求の受け入れが成功すれば1を、そうでなければ0を返します。 失敗した場合、errbufにそれを説明するエラーメッセージが収納されます。 errbuferrbufsizeサイズの文字配列でなければなりません。 (推奨サイズは256バイトです。)

しかし、要求の受け入れが成功したとしても、その要求の効果が出ることは全く保証していません。 もしキャンセル操作が有効であれば、現在のコマンドは間もなく中断され、エラーが結果として返ります。 キャンセル操作に失敗した場合(例えばバックエンドがすでにコマンド処理を終了していたため)、目に見える結果は何も出てこなくなります。

errbufがシグナルハンドラ内のローカル変数であれば、PQcancelはシグナルハンドラから起動しても問題ありません。 PQcancelの実行中、PGcancelは読み取りのみです。 従って、PGconnオブジェクトを操作するスレッドと別のスレッドからこの関数を呼び出すこともできます。

PQrequestCancel #

PQrequestCancelPQcancelの廃止予定の変形版です。

int PQrequestCancel(PGconn *conn);

サーバに現在のコマンドの廃棄処理を要求します。 これはPGconnオブジェクトを直接扱い、また、失敗した場合エラーメッセージはPGconnオブジェクト内に収納されます。 (PQerrorMessageにより取り出すことができます。) 機能的には同一ですが、この方法は複数スレッドプログラムやシグナルハンドラでは安全ではありません。PGconnのエラーメッセージが上書きされることにより、その接続で現在進行中の操作を台無しにする可能性があるからです。