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

PostgreSQL 9.0.0文書
前のページ | 巻戻し | 第 31章libpq - C ライブラリ | 早送り | 次のページ

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

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

`PQgetCancel`

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

      PGcancel *PQgetCancel(PGconn *conn);

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

`PQfreeCancel`

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

      void PQfreeCancel(PGcancel *cancel);

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

`PQcancel`

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

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

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

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

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

`PQrequestCancel`

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

      int PQrequestCancel(PGconn *conn);

  `PQrequestCancel`は`PQcancel`の変形版であり廃止予定です。 これは`PGconn`オブジェクトを直接扱い、また、失敗した場合エラーメッセージは`PGconn`オブジェクト内に収納されます。 (`PQerrorMessage`により取り出すことができます。) 機能的には同一ですが、`PGconn`のエラーメッセージが上書きされることにより、その接続で現在進行中の操作が壊れてしまうため、この方法は複数スレッドプログラムやシグナルハンドラでは問題が起こります。

前のページ | ホーム | 次のページ
非同期コマンドの処理 | 上に戻る | 近道インタフェース