Annotation of embedaddon/php/ext/pdo/php_pdo_driver.h, revision 1.1.1.5

1.1       misho       1: /*
                      2:   +----------------------------------------------------------------------+
                      3:   | PHP Version 5                                                        |
                      4:   +----------------------------------------------------------------------+
1.1.1.5 ! misho       5:   | Copyright (c) 1997-2014 The PHP Group                                |
1.1       misho       6:   +----------------------------------------------------------------------+
                      7:   | This source file is subject to version 3.01 of the PHP license,      |
                      8:   | that is bundled with this package in the file LICENSE, and is        |
                      9:   | available through the world-wide-web at the following url:           |
                     10:   | http://www.php.net/license/3_01.txt                                  |
                     11:   | If you did not receive a copy of the PHP license and are unable to   |
                     12:   | obtain it through the world-wide-web, please send a note to          |
                     13:   | license@php.net so we can mail you a copy immediately.               |
                     14:   +----------------------------------------------------------------------+
                     15:   | Author: Wez Furlong <wez@php.net>                                    |
                     16:   +----------------------------------------------------------------------+
                     17: */
                     18: 
1.1.1.2   misho      19: /* $Id$ */
1.1       misho      20: 
                     21: #ifndef PHP_PDO_DRIVER_H
                     22: #define PHP_PDO_DRIVER_H
                     23: 
                     24: #include "php_pdo.h"
                     25: 
                     26: /* forward declarations */
                     27: typedef struct _pdo_dbh_t      pdo_dbh_t;
                     28: typedef struct _pdo_stmt_t     pdo_stmt_t;
                     29: struct pdo_bound_param_data;
                     30: 
                     31: #ifdef PHP_WIN32
                     32: typedef __int64 pdo_int64_t;
                     33: typedef unsigned __int64 pdo_uint64_t;
                     34: #else
                     35: typedef long long int pdo_int64_t;
                     36: typedef unsigned long long int pdo_uint64_t;
                     37: #endif
                     38: PDO_API char *php_pdo_int64_to_str(pdo_int64_t i64 TSRMLS_DC);
                     39: 
                     40: #ifndef TRUE
                     41: # define TRUE 1
                     42: #endif
                     43: #ifndef FALSE
                     44: # define FALSE 0
                     45: #endif
                     46: 
                     47: #define PDO_DRIVER_API 20080721
                     48: 
                     49: enum pdo_param_type {
                     50:        PDO_PARAM_NULL,
                     51: 
                     52:        /* int as in long (the php native int type).
                     53:         * If you mark a column as an int, PDO expects get_col to return
                     54:         * a pointer to a long */
                     55:        PDO_PARAM_INT,
                     56: 
                     57:        /* get_col ptr should point to start of the string buffer */
                     58:        PDO_PARAM_STR,
                     59: 
                     60:        /* get_col: when len is 0 ptr should point to a php_stream *,
                     61:         * otherwise it should behave like a string. Indicate a NULL field
                     62:         * value by setting the ptr to NULL */
                     63:        PDO_PARAM_LOB,
                     64: 
                     65:        /* get_col: will expect the ptr to point to a new PDOStatement object handle,
                     66:         * but this isn't wired up yet */
                     67:        PDO_PARAM_STMT, /* hierarchical result set */
                     68: 
                     69:        /* get_col ptr should point to a zend_bool */
                     70:        PDO_PARAM_BOOL,
                     71: 
                     72:        /* get_col ptr should point to a zval*
                     73:           and the driver is responsible for adding correct type information to get_column_meta()
                     74:         */
1.1.1.4   misho      75:        PDO_PARAM_ZVAL,
1.1       misho      76: 
1.1.1.4   misho      77:        /* magic flag to denote a parameter as being input/output */
                     78:        PDO_PARAM_INPUT_OUTPUT = 0x80000000
                     79: };
1.1       misho      80: 
                     81: #define PDO_PARAM_FLAGS                        0xFFFF0000
                     82: 
                     83: #define PDO_PARAM_TYPE(x)              ((x) & ~PDO_PARAM_FLAGS)
                     84: 
                     85: enum pdo_fetch_type {
                     86:        PDO_FETCH_USE_DEFAULT,
                     87:        PDO_FETCH_LAZY,
                     88:        PDO_FETCH_ASSOC,
                     89:        PDO_FETCH_NUM,
                     90:        PDO_FETCH_BOTH,
                     91:        PDO_FETCH_OBJ,
                     92:        PDO_FETCH_BOUND, /* return true/false only; rely on bound columns */
                     93:        PDO_FETCH_COLUMN,       /* fetch a numbered column only */
                     94:        PDO_FETCH_CLASS,        /* create an instance of named class, call ctor and set properties */
                     95:        PDO_FETCH_INTO,         /* fetch row into an existing object */
                     96:        PDO_FETCH_FUNC,         /* fetch into function and return its result */
                     97:        PDO_FETCH_NAMED,    /* like PDO_FETCH_ASSOC, but can handle duplicate names */
                     98:        PDO_FETCH_KEY_PAIR,     /* fetch into an array where the 1st column is a key and all subsequent columns are values */
                     99:        PDO_FETCH__MAX /* must be last */
                    100: };
                    101: 
                    102: #define PDO_FETCH_FLAGS     0xFFFF0000  /* fetchAll() modes or'd to PDO_FETCH_XYZ */
                    103: #define PDO_FETCH_GROUP     0x00010000  /* fetch into groups */
                    104: #define PDO_FETCH_UNIQUE    0x00030000  /* fetch into groups assuming first col is unique */
                    105: #define PDO_FETCH_CLASSTYPE 0x00040000  /* fetch class gets its class name from 1st column */
                    106: #define PDO_FETCH_SERIALIZE 0x00080000  /* fetch class instances by calling serialize */
                    107: #define PDO_FETCH_PROPS_LATE 0x00100000  /* fetch props after calling ctor */
                    108: 
                    109: /* fetch orientation for scrollable cursors */
                    110: enum pdo_fetch_orientation {
                    111:        PDO_FETCH_ORI_NEXT,             /* default: fetch the next available row */
                    112:        PDO_FETCH_ORI_PRIOR,    /* scroll back to prior row and fetch that */
                    113:        PDO_FETCH_ORI_FIRST,    /* scroll to the first row and fetch that */
                    114:        PDO_FETCH_ORI_LAST,             /* scroll to the last row and fetch that */
                    115:        PDO_FETCH_ORI_ABS,              /* scroll to an absolute numbered row and fetch that */
                    116:        PDO_FETCH_ORI_REL               /* scroll relative to the current row, and fetch that */
                    117: };
                    118: 
                    119: enum pdo_attribute_type {
                    120:        PDO_ATTR_AUTOCOMMIT,    /* use to turn on or off auto-commit mode */
                    121:        PDO_ATTR_PREFETCH,              /* configure the prefetch size for drivers that support it. Size is in KB */
                    122:        PDO_ATTR_TIMEOUT,               /* connection timeout in seconds */
                    123:        PDO_ATTR_ERRMODE,               /* control how errors are handled */
                    124:        PDO_ATTR_SERVER_VERSION,        /* database server version */
                    125:        PDO_ATTR_CLIENT_VERSION,        /* client library version */
                    126:        PDO_ATTR_SERVER_INFO,           /* server information */
                    127:        PDO_ATTR_CONNECTION_STATUS,     /* connection status */
                    128:        PDO_ATTR_CASE,                          /* control case folding for portability */
                    129:        PDO_ATTR_CURSOR_NAME,           /* name a cursor for use in "WHERE CURRENT OF <name>" */
                    130:        PDO_ATTR_CURSOR,                        /* cursor type */
                    131:        PDO_ATTR_ORACLE_NULLS,          /* convert empty strings to NULL */
                    132:        PDO_ATTR_PERSISTENT,            /* pconnect style connection */
                    133:        PDO_ATTR_STATEMENT_CLASS,       /* array(classname, array(ctor_args)) to specify the class of the constructed statement */
                    134:        PDO_ATTR_FETCH_TABLE_NAMES, /* include table names in the column names, where available */
                    135:        PDO_ATTR_FETCH_CATALOG_NAMES, /* include the catalog/db name names in the column names, where available */
                    136:        PDO_ATTR_DRIVER_NAME,             /* name of the driver (as used in the constructor) */
                    137:        PDO_ATTR_STRINGIFY_FETCHES,     /* converts integer/float types to strings during fetch */
                    138:        PDO_ATTR_MAX_COLUMN_LEN,        /* make database calculate maximum length of data found in a column */
                    139:        PDO_ATTR_DEFAULT_FETCH_MODE, /* Set the default fetch mode */
                    140:        PDO_ATTR_EMULATE_PREPARES,  /* use query emulation rather than native */
                    141: 
                    142:        /* this defines the start of the range for driver specific options.
                    143:         * Drivers should define their own attribute constants beginning with this
                    144:         * value. */
                    145:        PDO_ATTR_DRIVER_SPECIFIC = 1000
                    146: };
                    147: 
                    148: enum pdo_cursor_type {
                    149:        PDO_CURSOR_FWDONLY,             /* forward only cursor (default) */
                    150:        PDO_CURSOR_SCROLL               /* scrollable cursor */
                    151: };
                    152: 
                    153: /* SQL-92 SQLSTATE error codes.
                    154: 
                    155: The character string value returned for an SQLSTATE consists of a two-character
                    156: class value followed by a three-character subclass value. A class value of 01
                    157: indicates a warning and is accompanied by a return code of
                    158: SQL_SUCCESS_WITH_INFO.
                    159: 
                    160: Class values other than '01', except for the class 'IM',
                    161: indicate an error and are accompanied by a return code of SQL_ERROR. The class
                    162: 'IM' is specific to warnings and errors that derive from the implementation of
                    163: ODBC itself.
                    164: 
                    165: The subclass value '000' in any class indicates that there is no
                    166: subclass for that SQLSTATE. The assignment of class and subclass values is
                    167: defined by SQL-92.
                    168: */
                    169: 
                    170: typedef char pdo_error_type[6]; /* SQLSTATE */
                    171: 
                    172: 
                    173: #define PDO_ERR_NONE                           "00000"
                    174: 
                    175: enum pdo_error_mode {
                    176:        PDO_ERRMODE_SILENT,             /* just set error codes */
                    177:        PDO_ERRMODE_WARNING,    /* raise E_WARNING */
                    178:        PDO_ERRMODE_EXCEPTION   /* throw exceptions */
                    179: };
                    180: 
                    181: enum pdo_case_conversion {
                    182:        PDO_CASE_NATURAL,
                    183:        PDO_CASE_UPPER,
                    184:        PDO_CASE_LOWER
                    185: };
                    186: 
                    187: /* oracle interop settings */
                    188: enum pdo_null_handling {
                    189:        PDO_NULL_NATURAL = 0,
                    190:        PDO_NULL_EMPTY_STRING = 1,
                    191:        PDO_NULL_TO_STRING = 2
                    192: };
                    193: 
                    194: /* {{{ utils for reading attributes set as driver_options */
                    195: static inline long pdo_attr_lval(zval *options, enum pdo_attribute_type option_name, long defval TSRMLS_DC)
                    196: {
                    197:        zval **v;
                    198: 
                    199:        if (options && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(options), option_name, (void**)&v)) {
                    200:                convert_to_long_ex(v);
                    201:                return Z_LVAL_PP(v);
                    202:        }
                    203:        return defval;
                    204: }
                    205: static inline char *pdo_attr_strval(zval *options, enum pdo_attribute_type option_name, char *defval TSRMLS_DC)
                    206: {
                    207:        zval **v;
                    208: 
                    209:        if (options && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(options), option_name, (void**)&v)) {
                    210:                convert_to_string_ex(v);
                    211:                return estrndup(Z_STRVAL_PP(v), Z_STRLEN_PP(v));
                    212:        }
                    213:        return defval ? estrdup(defval) : NULL;
                    214: }
                    215: /* }}} */
                    216: 
                    217: /* This structure is registered with PDO when a PDO driver extension is
                    218:  * initialized */
                    219: typedef struct {
                    220:        const char              *driver_name;
                    221:        unsigned long   driver_name_len;
                    222:        unsigned long   api_version; /* needs to be compatible with PDO */
                    223: 
                    224: #define PDO_DRIVER_HEADER(name)        \
                    225:        #name, sizeof(#name)-1, \
                    226:        PDO_DRIVER_API
                    227:        
                    228:        /* create driver specific portion of the database handle and stash it into
                    229:         * the dbh.  dbh contains the data source string and flags for this
                    230:         * instance.  You MUST respect dbh->is_persistent and pass that flag to
                    231:         * pemalloc() for all allocations that are stored in the dbh or your instance
                    232:         * data in the db, otherwise you will crash PHP when persistent connections
                    233:         * are used.
                    234:         */
                    235:        int (*db_handle_factory)(pdo_dbh_t *dbh, zval *driver_options TSRMLS_DC);
                    236: 
                    237: } pdo_driver_t;
                    238: 
                    239: /* {{{ methods for a database handle */
                    240: 
                    241: /* close or otherwise disconnect the database */
                    242: typedef int (*pdo_dbh_close_func)(pdo_dbh_t *dbh TSRMLS_DC);
                    243: 
                    244: /* prepare a statement and stash driver specific portion into stmt */
                    245: typedef int (*pdo_dbh_prepare_func)(pdo_dbh_t *dbh, const char *sql, long sql_len, pdo_stmt_t *stmt, zval *driver_options TSRMLS_DC);
                    246: 
                    247: /* execute a statement (that does not return a result set) */
                    248: typedef long (*pdo_dbh_do_func)(pdo_dbh_t *dbh, const char *sql, long sql_len TSRMLS_DC);
                    249: 
                    250: /* quote a string */
                    251: typedef int (*pdo_dbh_quote_func)(pdo_dbh_t *dbh, const char *unquoted, int unquotedlen, char **quoted, int *quotedlen, enum pdo_param_type paramtype TSRMLS_DC);
                    252: 
                    253: /* transaction related */
                    254: typedef int (*pdo_dbh_txn_func)(pdo_dbh_t *dbh TSRMLS_DC);
                    255: 
                    256: /* setting of attributes */
                    257: typedef int (*pdo_dbh_set_attr_func)(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_DC);
                    258: 
                    259: /* return last insert id.  NULL indicates error condition, otherwise, the return value
                    260:  * MUST be an emalloc'd NULL terminated string. */
                    261: typedef char *(*pdo_dbh_last_id_func)(pdo_dbh_t *dbh, const char *name, unsigned int *len TSRMLS_DC);
                    262: 
                    263: /* fetch error information.  if stmt is not null, fetch information pertaining
                    264:  * to the statement, otherwise fetch global error information.  The driver
                    265:  * should add the following information to the array "info" in this order:
                    266:  * - native error code
                    267:  * - string representation of the error code ... any other optional driver
                    268:  *   specific data ...  */
                    269: typedef        int (*pdo_dbh_fetch_error_func)(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info TSRMLS_DC);
                    270: 
                    271: /* fetching of attributes */
                    272: typedef int (*pdo_dbh_get_attr_func)(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_DC);
                    273: 
                    274: /* checking/pinging persistent connections; return SUCCESS if the connection
                    275:  * is still alive and ready to be used, FAILURE otherwise.
                    276:  * You may set this handler to NULL, which is equivalent to returning SUCCESS. */
                    277: typedef int (*pdo_dbh_check_liveness_func)(pdo_dbh_t *dbh TSRMLS_DC);
                    278: 
                    279: /* called at request end for each persistent dbh; this gives the driver
                    280:  * the opportunity to safely release resources that only have per-request
                    281:  * scope */
                    282: typedef void (*pdo_dbh_request_shutdown)(pdo_dbh_t *dbh TSRMLS_DC);
                    283: 
                    284: /* for adding methods to the dbh or stmt objects 
                    285: pointer to a list of driver specific functions. The convention is
                    286: to prefix the function names using the PDO driver name; this will
                    287: reduce the chance of collisions with future functionality in the
                    288: PDO class or in user code (they can extend the PDO object).
                    289: */
                    290: enum {
                    291:        PDO_DBH_DRIVER_METHOD_KIND_DBH = 0,
                    292:        PDO_DBH_DRIVER_METHOD_KIND_STMT,
                    293:        PDO_DBH_DRIVER_METHOD_KIND__MAX
                    294: };
                    295: 
                    296: typedef const zend_function_entry *(*pdo_dbh_get_driver_methods_func)(pdo_dbh_t *dbh, int kind TSRMLS_DC);
                    297: 
                    298: struct pdo_dbh_methods {
                    299:        pdo_dbh_close_func              closer;
                    300:        pdo_dbh_prepare_func    preparer;
                    301:        pdo_dbh_do_func                 doer;
                    302:        pdo_dbh_quote_func              quoter;
                    303:        pdo_dbh_txn_func                begin;
                    304:        pdo_dbh_txn_func                commit;
                    305:        pdo_dbh_txn_func                rollback;
                    306:        pdo_dbh_set_attr_func   set_attribute;
                    307:        pdo_dbh_last_id_func            last_id;
                    308:        pdo_dbh_fetch_error_func        fetch_err;
                    309:        pdo_dbh_get_attr_func           get_attribute;
                    310:        pdo_dbh_check_liveness_func     check_liveness;
                    311:        pdo_dbh_get_driver_methods_func get_driver_methods;
                    312:        pdo_dbh_request_shutdown        persistent_shutdown;
1.1.1.2   misho     313:        pdo_dbh_txn_func                in_transaction;
1.1       misho     314: };
                    315: 
                    316: /* }}} */
                    317: 
                    318: /* {{{ methods for a statement handle */
                    319: 
                    320: /* free the statement handle */
                    321: typedef int (*pdo_stmt_dtor_func)(pdo_stmt_t *stmt TSRMLS_DC);
                    322: 
                    323: /* start the query */
                    324: typedef int (*pdo_stmt_execute_func)(pdo_stmt_t *stmt TSRMLS_DC);
                    325: 
                    326: /* causes the next row in the set to be fetched; indicates if there are no
                    327:  * more rows.  The ori and offset params modify which row should be returned,
                    328:  * if the stmt represents a scrollable cursor */
                    329: typedef int (*pdo_stmt_fetch_func)(pdo_stmt_t *stmt, 
                    330:        enum pdo_fetch_orientation ori, long offset TSRMLS_DC);
                    331: 
                    332: /* queries information about the type of a column, by index (0 based).
                    333:  * Driver should populate stmt->columns[colno] with appropriate info */
                    334: typedef int (*pdo_stmt_describe_col_func)(pdo_stmt_t *stmt, int colno TSRMLS_DC);
                    335: 
                    336: /* retrieves pointer and size of the value for a column.
                    337:  * Note that PDO expects the driver to manage the lifetime of this data;
                    338:  * it will copy the value into a zval on behalf of the script.
                    339:  * If the driver sets caller_frees, ptr should point to emalloc'd memory
                    340:  * and PDO will free it as soon as it is done using it.
                    341:  */
                    342: typedef int (*pdo_stmt_get_col_data_func)(pdo_stmt_t *stmt, int colno, char **ptr, unsigned long *len, int *caller_frees TSRMLS_DC);
                    343: 
                    344: /* hook for bound params */
                    345: enum pdo_param_event {
                    346:        PDO_PARAM_EVT_ALLOC,
                    347:        PDO_PARAM_EVT_FREE,
                    348:        PDO_PARAM_EVT_EXEC_PRE,
                    349:        PDO_PARAM_EVT_EXEC_POST,
                    350:        PDO_PARAM_EVT_FETCH_PRE,
                    351:        PDO_PARAM_EVT_FETCH_POST,
                    352:        PDO_PARAM_EVT_NORMALIZE
                    353: };
                    354: 
                    355: typedef int (*pdo_stmt_param_hook_func)(pdo_stmt_t *stmt, struct pdo_bound_param_data *param, enum pdo_param_event event_type TSRMLS_DC);
                    356: 
                    357: /* setting of attributes */
                    358: typedef int (*pdo_stmt_set_attr_func)(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC);
                    359: 
                    360: /* fetching of attributes */
                    361: typedef int (*pdo_stmt_get_attr_func)(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC);
                    362: 
                    363: /* retrieves meta data for a numbered column.
                    364:  * Returns SUCCESS/FAILURE.
                    365:  * On SUCCESS, fill in return_value with an array with the following fields.
                    366:  * If a particular field is not supported, then the driver simply does not add it to
                    367:  * the array, so that scripts can use isset() to check for it.
                    368:  *
                    369:  * ### this is just a rough first cut, and subject to change ###
                    370:  *
                    371:  * these are added by PDO itself, based on data from the describe handler:
                    372:  *   name => the column name
                    373:  *   len => the length/size of the column
                    374:  *   precision => precision of the column
                    375:  *   pdo_type => an integer, one of the PDO_PARAM_XXX values
                    376:  *
                    377:  *   scale => the floating point scale
                    378:  *   table => the table for that column
                    379:  *   type => a string representation of the type, mapped to the PHP equivalent type name
                    380:  *   native_type => a string representation of the type, native style, if different from
                    381:  *                  the mapped name.
                    382:  *   flags => an array of flags including zero or more of the following:
                    383:  *            primary_key, not_null, unique_key, multiple_key, unsigned, auto_increment, blob
                    384:  *
                    385:  * Any driver specific data should be returned using a prefixed key or value.
                    386:  * Eg: custom data for the mysql driver would use either
                    387:  *   'mysql:foobar' => 'some data' // to add a new key to the array
                    388:  * or
                    389:  *   'flags' => array('not_null', 'mysql:some_flag'); // to add data to an existing key
                    390:  */
                    391: typedef int (*pdo_stmt_get_column_meta_func)(pdo_stmt_t *stmt, long colno, zval *return_value TSRMLS_DC);
                    392: 
                    393: /* advances the statement to the next rowset of the batch.
                    394:  * If it returns 1, PDO will tear down its idea of columns
                    395:  * and meta data.  If it returns 0, PDO will indicate an error
                    396:  * to the caller. */
                    397: typedef int (*pdo_stmt_next_rowset_func)(pdo_stmt_t *stmt TSRMLS_DC);
                    398: 
                    399: /* closes the active cursor on a statement, leaving the prepared
                    400:  * statement ready for re-execution.  Useful to explicitly state
                    401:  * that you are done with a given rowset, without having to explicitly
                    402:  * fetch all the rows. */
                    403: typedef int (*pdo_stmt_cursor_closer_func)(pdo_stmt_t *stmt TSRMLS_DC);
                    404: 
                    405: struct pdo_stmt_methods {
                    406:        pdo_stmt_dtor_func                      dtor;
                    407:        pdo_stmt_execute_func           executer;
                    408:        pdo_stmt_fetch_func                     fetcher;
                    409:        pdo_stmt_describe_col_func      describer;
                    410:        pdo_stmt_get_col_data_func      get_col;
                    411:        pdo_stmt_param_hook_func        param_hook;
                    412:        pdo_stmt_set_attr_func          set_attribute;
                    413:        pdo_stmt_get_attr_func          get_attribute;
                    414:        pdo_stmt_get_column_meta_func get_column_meta;
                    415:        pdo_stmt_next_rowset_func               next_rowset;
                    416:        pdo_stmt_cursor_closer_func     cursor_closer;
                    417: };
                    418: 
                    419: /* }}} */
                    420: 
                    421: enum pdo_placeholder_support {
                    422:        PDO_PLACEHOLDER_NONE=0,
                    423:        PDO_PLACEHOLDER_NAMED=1,
                    424:        PDO_PLACEHOLDER_POSITIONAL=2
                    425: };
                    426: 
                    427: /* represents a connection to a database */
                    428: struct _pdo_dbh_t {
                    429:        /* these items must appear in this order at the beginning of the
                    430:        struct so that this can be cast as a zend_object.  we need this
                    431:        to allow the extending class to escape all the custom handlers
                    432:           that PDO declares.
                    433:     */
1.1.1.2   misho     434:        zend_object std;
1.1       misho     435: 
                    436:        /* driver specific methods */
                    437:        struct pdo_dbh_methods *methods;
                    438:        /* driver specific data */
                    439:        void *driver_data;
                    440: 
                    441:        /* credentials */
                    442:        char *username, *password;
                    443:        
                    444:        /* if true, then data stored and pointed at by this handle must all be
                    445:         * persistently allocated */
                    446:        unsigned is_persistent:1;
                    447: 
                    448:        /* if true, driver should act as though a COMMIT were executed between
                    449:         * each executed statement; otherwise, COMMIT must be carried out manually
                    450:         * */
                    451:        unsigned auto_commit:1;
                    452: 
                    453:        /* if true, the handle has been closed and will not function anymore */
                    454:        unsigned is_closed:1;
                    455: 
                    456:        /* if true, the driver requires that memory be allocated explicitly for
                    457:         * the columns that are returned */
                    458:        unsigned alloc_own_columns:1;
                    459: 
                    460:        /* if true, commit or rollBack is allowed to be called */
                    461:        unsigned in_txn:1;
                    462: 
                    463:        /* max length a single character can become after correct quoting */
                    464:        unsigned max_escaped_char_length:3;
                    465: 
                    466:        /* oracle compat; see enum pdo_null_handling */
                    467:        unsigned oracle_nulls:2;
                    468: 
                    469:        /* when set, convert int/floats to strings */
                    470:        unsigned stringify:1;
                    471: 
1.1.1.3   misho     472:        /* the sum of the number of bits here and the bit fields preceding should
1.1       misho     473:         * equal 32 */
                    474:        unsigned _reserved_flags:21;
                    475: 
                    476:        /* data source string used to open this handle */
                    477:        const char *data_source;
                    478:        unsigned long data_source_len;
                    479: 
                    480:        /* the global error code. */
                    481:        pdo_error_type error_code;
                    482: 
                    483:        enum pdo_error_mode error_mode;
                    484: 
                    485:        enum pdo_case_conversion native_case, desired_case;
                    486: 
                    487:        /* persistent hash key associated with this handle */
                    488:        const char *persistent_id;
                    489:        int persistent_id_len;
                    490:        unsigned int refcount;
                    491: 
                    492:        /* driver specific "class" methods for the dbh and stmt */
                    493:        HashTable *cls_methods[PDO_DBH_DRIVER_METHOD_KIND__MAX];
                    494: 
                    495:        pdo_driver_t *driver;
                    496:        
                    497:        zend_class_entry *def_stmt_ce;
                    498: 
                    499:        zval *def_stmt_ctor_args;
                    500: 
                    501:        /* when calling PDO::query(), we need to keep the error
                    502:         * context from the statement around until we next clear it.
                    503:         * This will allow us to report the correct error message
                    504:         * when PDO::query() fails */
                    505:        pdo_stmt_t *query_stmt;
                    506:        zval query_stmt_zval;
                    507: 
                    508:        /* defaults for fetches */
                    509:        enum pdo_fetch_type default_fetch_type;
                    510: };
                    511: 
                    512: /* describes a column */
                    513: struct pdo_column_data {
                    514:        char *name;
                    515:        int namelen;
                    516:        unsigned long maxlen;
                    517:        enum pdo_param_type param_type;
                    518:        unsigned long precision;
                    519: 
                    520:        /* don't touch this unless your name is dbdo */
                    521:        void *dbdo_data;
                    522: };
                    523: 
                    524: /* describes a bound parameter */
                    525: struct pdo_bound_param_data {
                    526:        long paramno; /* if -1, then it has a name, and we don't know the index *yet* */
                    527:        char *name;
                    528:        int namelen;
                    529: 
                    530:        long max_value_len;     /* as a hint for pre-allocation */
                    531:        
                    532:        zval *parameter;                                /* the variable itself */
                    533:        enum pdo_param_type param_type; /* desired or suggested type */
                    534: 
                    535:        zval *driver_params;                    /* optional parameter(s) for the driver */
                    536:        void *driver_data;
                    537: 
                    538:        pdo_stmt_t *stmt;       /* for convenience in dtor */
                    539:        int is_param;           /* parameter or column ? */
                    540: };
                    541: 
                    542: /* represents a prepared statement */
                    543: struct _pdo_stmt_t {
                    544:        /* these items must appear in this order at the beginning of the
                    545:        struct so that this can be cast as a zend_object.  we need this
                    546:        to allow the extending class to escape all the custom handlers
                    547:           that PDO declares.
                    548:     */
1.1.1.2   misho     549:        zend_object std;
1.1       misho     550: 
                    551:        /* driver specifics */
                    552:        struct pdo_stmt_methods *methods;
                    553:        void *driver_data;
                    554: 
                    555:        /* if true, we've already successfully executed this statement at least
                    556:         * once */
                    557:        unsigned executed:1;
                    558:        /* if true, the statement supports placeholders and can implement
                    559:         * bindParam() for its prepared statements, if false, PDO should
                    560:         * emulate prepare and bind on its behalf */
                    561:        unsigned supports_placeholders:2;
                    562: 
                    563:        unsigned _reserved:29;
                    564: 
                    565:        /* the number of columns in the result set; not valid until after
                    566:         * the statement has been executed at least once.  In some cases, might
                    567:         * not be valid until fetch (at the driver level) has been called at least once.
                    568:         * */
                    569:        int column_count;
                    570:        struct pdo_column_data *columns;
                    571:        
                    572:        /* we want to keep the dbh alive while we live, so we own a reference */
                    573:        zval database_object_handle;
                    574:        pdo_dbh_t *dbh;
                    575: 
                    576:        /* keep track of bound input parameters.  Some drivers support
                    577:         * input/output parameters, but you can't rely on that working */
                    578:        HashTable *bound_params;
                    579:        /* When rewriting from named to positional, this maps positions to names */
                    580:        HashTable *bound_param_map;
                    581:        /* keep track of PHP variables bound to named (or positional) columns
                    582:         * in the result set */
                    583:        HashTable *bound_columns;
                    584: 
                    585:        /* not always meaningful */
                    586:        long row_count;
                    587: 
                    588:        /* used to hold the statement's current query */
                    589:        char *query_string;
                    590:        int query_stringlen;
                    591: 
                    592:        /* the copy of the query with expanded binds ONLY for emulated-prepare drivers */
                    593:        char *active_query_string;
                    594:        int active_query_stringlen;
                    595: 
                    596:        /* the cursor specific error code. */
                    597:        pdo_error_type error_code;
                    598: 
                    599:        /* for lazy fetches, we always return the same lazy object handle.
                    600:         * Let's keep it here. */
                    601:        zval lazy_object_ref;
                    602:        unsigned long refcount;
                    603: 
                    604:        /* defaults for fetches */
                    605:        enum pdo_fetch_type default_fetch_type;
                    606:        union {
                    607:                int column;
                    608:                struct {
                    609:                        zend_class_entry *ce;   
                    610:                        zval *ctor_args;            /* freed */
                    611:                        zval *retval_ptr; 
                    612:                        zend_fcall_info fci;
                    613:                        zend_fcall_info_cache fcc;
                    614:                } cls;
                    615:                struct {
                    616:                        zval *function;
                    617:                        zval *fetch_args;           /* freed */
                    618:                        zval *object;
                    619:                        zend_fcall_info fci;
                    620:                        zend_fcall_info_cache fcc;
                    621:                        zval **values;              /* freed */
                    622:                } func;
                    623:                zval *into;
                    624:        } fetch;
                    625: 
                    626:        /* used by the query parser for driver specific
                    627:         * parameter naming (see pgsql driver for example) */
                    628:        const char *named_rewrite_template;
                    629: };
                    630: 
                    631: /* call this in MINIT to register your PDO driver */
                    632: PDO_API int php_pdo_register_driver(pdo_driver_t *driver);
                    633: /* call this in MSHUTDOWN to unregister your PDO driver */
                    634: PDO_API void php_pdo_unregister_driver(pdo_driver_t *driver);
                    635: 
                    636: /* For the convenience of drivers, this function will parse a data source
                    637:  * string, of the form "name=value; name2=value2" and populate variables
                    638:  * according to the data you pass in and array of pdo_data_src_parser structures */
                    639: struct pdo_data_src_parser {
                    640:        const char *optname;
                    641:        char *optval;
                    642:        int freeme;
                    643: };
                    644: 
                    645: PDO_API int php_pdo_parse_data_source(const char *data_source,
                    646:                unsigned long data_source_len, struct pdo_data_src_parser *parsed,
                    647:                int nparams);
                    648: 
                    649: PDO_API zend_class_entry *php_pdo_get_dbh_ce(void);
                    650: PDO_API zend_class_entry *php_pdo_get_exception(void);
                    651: 
                    652: PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, 
                    653:        char **outquery, int *outquery_len TSRMLS_DC);
                    654: 
                    655: PDO_API void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt,
                    656:        const char *sqlstate, const char *supp TSRMLS_DC);
                    657: 
                    658: PDO_API void php_pdo_dbh_addref(pdo_dbh_t *dbh TSRMLS_DC);
                    659: PDO_API void php_pdo_dbh_delref(pdo_dbh_t *dbh TSRMLS_DC);
                    660: 
                    661: PDO_API void php_pdo_stmt_addref(pdo_stmt_t *stmt TSRMLS_DC);
                    662: PDO_API void php_pdo_stmt_delref(pdo_stmt_t *stmt TSRMLS_DC);
                    663: 
                    664: 
                    665: #endif /* PHP_PDO_DRIVER_H */
                    666: /*
                    667:  * Local variables:
                    668:  * tab-width: 4
                    669:  * c-basic-offset: 4
                    670:  * End:
                    671:  * vim600: noet sw=4 ts=4 fdm=marker
                    672:  * vim<600: noet sw=4 ts=4
                    673:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>