1.3. 問い合わせ実行関数

いったんデータベースサーバへの接続の確立が成功すれば、この節で説明する関数を使って SQL の問い合わせやコマンドを実行します。

1.3.1. メインルーチン

PGresult 構造体は、バックエンドからの問い合わせ結果をカプセル化したものです。 libpq アプリケーションのプログラマは、PGresult による抽象化に注意を払うべきです。 PGresult の内容は以下に挙げるアクセッサ関数を使って取り出してください。 PGresult 構造体中のフィールドは将来予告なく変更されることがありますので、直接フィールドを参照することは避けてください。(PostgreSQL リリース 6.4 から、PGresult 構造体 の定義を libpq-fe.h の中から外しました。 以前に作成したプログラムが PGresult のフィールドを直接操作している場合、libpq-int.h をインクルードすれば使い続けることができます。 しかしそのプログラムは是非とも修正してください。)

1.3.2. SQL 問い合わせに含まれる文字のエスケープ

PQescapeString SQL 問い合わせ内で使用される文字列をエスケープします。

size_t PQescapeString (char *to, const char *from, size_t length);

(例えば不特定多数のユーザから入力されるなど) 信頼できない入力元から受けとった文字列を含める場合、セキュリティ上の理由よりそのまま SQL 問い合わせに含めてはいけません。 その代わり、SQL パーサで解釈されてしまう特殊な文字をクォートしなければなりません。

PQescapeString はこの操作を行います。 from は、エスケープ対象とする文字列の先頭文字を指し、length 引数はその文字列内の文字数をカウントします (終端を示すゼロバイトは不要でカウントされません)。 to はバッファを指し、少なくとも length の値の 2 倍以上を保持できるバッファでなければなりません。 さもなくば、この動作は不定となります。 PQescapeString を呼び出すことで、from 文字列を、特別な文字を安全なものに置き換え、終端を示すゼロバイトを追加して、エスケープしたものが to に書き出されます。 PostgreSQL の文字列リテラルを括らなければならない単一引用符は、結果文字列には含まれません。

PQescapeStringto に書き出された文字数を返します。 ただし、終端を示すゼロバイトは含まれません。 to from 文字列バッファが重なる場合の動作は不定です。

1.3.3. SQL 問い合わせに含まれるバイナリ文字列のエスケープ

PQescapeBytea SQL 問い合わせ内で使用されるバイナリ文字列 (bytea 型) をエスケープします。

    unsigned char *PQescapeBytea(unsigned char *from,
                                         size_t from_length,
                                         size_t *to_length);
   

ある ASCII 文字は、SQL 文内の bytea 型の文字列リテラルの一部として使用される場合、エスケープされる必要があります (全ての文字をエスケープしても構いません)。 一般的に文字をエスケープするためには、それを 10進の ASCII 値を 3 桁の 8 進数字に変換し、その前に 2 つのバックスラッシュを付けます。 単一引用符 (') とバックスラッシュ (\) 文字は別途特別なエスケープシーケンスを持ちます。 詳細については、ユーザーズガイド を参照して下さい。 PQescapeBytea は、こういった操作を行い、最低限必要な文字だけをエスケープします。

from 引数は、エスケープ対象とする文字列の先頭文字を指し、from_length 引数はこのバイナリ文字列内の文字数を反映します (終端を示すゼロバイトは不要で、カウントされません)。 to_length 引数は、結果となるエスケープされた文字長を保持するためのバッファを指します。結果の文字列長には、終端を示すゼロバイトが含まれます。

PQescapeByteafrom 引数のバイナリ文字列をエスケープしたものを、呼び出し側が用意したバッファに返します。 返された文字列は、PostgreSQL 文字列リテラルパーサと bytea 入力関数で適切に処理されるように置換された、全ての特殊な文字列を持ちます。 終端を示すゼロバイトも追加されます。 PostgreSQL の文字列リテラルを括らなければならない単一引用符は、結果文字列には含まれません。

PQunescapeBytea エスケープされたバイナリデータの文字列表現を、バイナリデータに変換します。 PQescapeBytea の反対。

 unsigned char *PQunescapeBytea(unsigned char *from, size_t *to_length);   

from パラメータは、BYTEA 列の PQgetvalue で返されるようなエスケープ文字列をポイントしています。PQunescapeBytea は、この文字列表現をバイナリ表現に変換しながら、用意されたバッファに格納していきます。また、エラーで NULL になってるバッファにポインタを返し、そのバッファのサイズを to_length に返します。このポインタは、のちに関数 free(3) の引数として使用することができます。

1.3.4. SELECT 結果情報の取得

1.3.5. SELECT 結果値の取得

1.3.6. SELECT 以外の結果情報の取得