## pdo_stmt_t の定義

明示的に述べられている場合を除き、ドライバからはすべてのフィールドが 読み込み専用となります。

# pdo_stmt_t

    /* プリペアドステートメントを表す */
    struct _pdo_stmt_t {
        /* ドライバ固有 */
        struct pdo_stmt_methods *methods;

*

    void *driver_data;

**

    /* true の場合は、すくなくとも 1 回はこのステートメントの実行に
         * 成功していることを表す */
        unsigned executed:1;

***

    /* true の場合は、ステートメントがプレースホルダをサポートしており
         * プリペアドステートメント用に bindParam() を実装できることを表す
         * false の場合は、プリペアおよびバインドを PDO がエミュレートする
         * 必要があることを表す */
        unsigned supports_placeholders:2;

****

    /* 結果セットのカラム数。ステートメントがすくなくとも 1 度実行される
         * までは有効な値は設定されない。時には、(ドライバレベルでの)
         * フェッチがコールされるまでは有効にならないこともある。
         * */
        int column_count;

*****

    struct pdo_column_data *columns;

******

    /* このステートメントが準備された dbh を指す */
        pdo_dbh_t *dbh;

        /* 入力バインドパラメータを指す。ドライバの中には入出力パラメータを
         * サポートしているものもあるが、その動作に依存することはできない */
        HashTable *bound_params;
        /* 名前から位置への置き換えを行う際に、このマップを使用する */
        HashTable *bound_param_map;
        /* 結果セット内で名前で指定した (あるいは位置で指定した) カラムに
         * 関連付けた PHP 変数を指す */
        HashTable *bound_columns;

        /* 意味のある値が設定されていない場合もある */
        long row_count;

        /* ステートメントの現在のクエリを保持する */
        char *query_string;
        int query_stringlen;

        /* バインド変数を展開した後のクエリのコピーで、
         * ドライバがプリペアドステートメントをエミュレートしている
         * 場合にのみ使用する */
        char *active_query_string;
        int active_query_stringlen;

        /* カーソル固有のエラーコード */
        pdo_error_type error_code;

        /* ドライバ固有のパラメータ命名規則 (例: pgsql ドライバ)
         * のためにクエリパーサが使用する */
        const char *named_rewrite_template;
    };

* | ドライバは、SKEL_handle_preparer() の中で これを設定しなければなりません。
** | この項目はドライバが使用します。想定される使用法は、データベースとの 接続を保つために必要なインスタンスデータへのポインタを (SKEL_handle_factory() 内で) 格納することです。
*** | ステートメントが最初に実行された後に、PDO がこれを設定します。 ドライバは、この値を調べることで初回にのみ必要な処理を飛ばす 最適化を行います。
**** | 詳細は SKEL_handle_preparer で説明します。
***** | 結果セット内のカラム数を、ドライバがこのフィールドに設定します。 通常これは SKEL_stmt_execute() で設定しますが、 データベースの実装によっては SKEL_stmt_fetch() を最低 1 回コールするまではカラム数がわからないことがあります。 SKEL_stmt_next_rowset() を実装するドライバで 新しい行セットが使用可能になった場合、ドライバはカラム数を更新する必要があります。
****** | カラム数に設定した値に応じて、PDO がこのフィールドを確保します。 SKEL_stmt_describe() の中で、各カラムの内容を 設定する必要があります。各カラムについて設定する必要があるのは、 `precision`、`maxlen`、 `name`、`namelen` および `param_type` です。 `name` は、emalloc() を使用して確保することが期待されています。PDO は、しかるべき時に efree() を実行します。