Return to php_pdo_driver.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / pdo |
1.1 ! misho 1: /* ! 2: +----------------------------------------------------------------------+ ! 3: | PHP Version 5 | ! 4: +----------------------------------------------------------------------+ ! 5: | Copyright (c) 1997-2012 The PHP Group | ! 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: ! 19: /* $Id: php_pdo_driver.h 321634 2012-01-01 13:15:04Z felipe $ */ ! 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: */ ! 75: PDO_PARAM_ZVAL ! 76: }; ! 77: ! 78: /* magic flag to denote a parameter as being input/output */ ! 79: #define PDO_PARAM_INPUT_OUTPUT 0x80000000 ! 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; ! 313: }; ! 314: ! 315: /* }}} */ ! 316: ! 317: /* {{{ methods for a statement handle */ ! 318: ! 319: /* free the statement handle */ ! 320: typedef int (*pdo_stmt_dtor_func)(pdo_stmt_t *stmt TSRMLS_DC); ! 321: ! 322: /* start the query */ ! 323: typedef int (*pdo_stmt_execute_func)(pdo_stmt_t *stmt TSRMLS_DC); ! 324: ! 325: /* causes the next row in the set to be fetched; indicates if there are no ! 326: * more rows. The ori and offset params modify which row should be returned, ! 327: * if the stmt represents a scrollable cursor */ ! 328: typedef int (*pdo_stmt_fetch_func)(pdo_stmt_t *stmt, ! 329: enum pdo_fetch_orientation ori, long offset TSRMLS_DC); ! 330: ! 331: /* queries information about the type of a column, by index (0 based). ! 332: * Driver should populate stmt->columns[colno] with appropriate info */ ! 333: typedef int (*pdo_stmt_describe_col_func)(pdo_stmt_t *stmt, int colno TSRMLS_DC); ! 334: ! 335: /* retrieves pointer and size of the value for a column. ! 336: * Note that PDO expects the driver to manage the lifetime of this data; ! 337: * it will copy the value into a zval on behalf of the script. ! 338: * If the driver sets caller_frees, ptr should point to emalloc'd memory ! 339: * and PDO will free it as soon as it is done using it. ! 340: */ ! 341: typedef int (*pdo_stmt_get_col_data_func)(pdo_stmt_t *stmt, int colno, char **ptr, unsigned long *len, int *caller_frees TSRMLS_DC); ! 342: ! 343: /* hook for bound params */ ! 344: enum pdo_param_event { ! 345: PDO_PARAM_EVT_ALLOC, ! 346: PDO_PARAM_EVT_FREE, ! 347: PDO_PARAM_EVT_EXEC_PRE, ! 348: PDO_PARAM_EVT_EXEC_POST, ! 349: PDO_PARAM_EVT_FETCH_PRE, ! 350: PDO_PARAM_EVT_FETCH_POST, ! 351: PDO_PARAM_EVT_NORMALIZE ! 352: }; ! 353: ! 354: 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); ! 355: ! 356: /* setting of attributes */ ! 357: typedef int (*pdo_stmt_set_attr_func)(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC); ! 358: ! 359: /* fetching of attributes */ ! 360: typedef int (*pdo_stmt_get_attr_func)(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC); ! 361: ! 362: /* retrieves meta data for a numbered column. ! 363: * Returns SUCCESS/FAILURE. ! 364: * On SUCCESS, fill in return_value with an array with the following fields. ! 365: * If a particular field is not supported, then the driver simply does not add it to ! 366: * the array, so that scripts can use isset() to check for it. ! 367: * ! 368: * ### this is just a rough first cut, and subject to change ### ! 369: * ! 370: * these are added by PDO itself, based on data from the describe handler: ! 371: * name => the column name ! 372: * len => the length/size of the column ! 373: * precision => precision of the column ! 374: * pdo_type => an integer, one of the PDO_PARAM_XXX values ! 375: * ! 376: * scale => the floating point scale ! 377: * table => the table for that column ! 378: * type => a string representation of the type, mapped to the PHP equivalent type name ! 379: * native_type => a string representation of the type, native style, if different from ! 380: * the mapped name. ! 381: * flags => an array of flags including zero or more of the following: ! 382: * primary_key, not_null, unique_key, multiple_key, unsigned, auto_increment, blob ! 383: * ! 384: * Any driver specific data should be returned using a prefixed key or value. ! 385: * Eg: custom data for the mysql driver would use either ! 386: * 'mysql:foobar' => 'some data' // to add a new key to the array ! 387: * or ! 388: * 'flags' => array('not_null', 'mysql:some_flag'); // to add data to an existing key ! 389: */ ! 390: typedef int (*pdo_stmt_get_column_meta_func)(pdo_stmt_t *stmt, long colno, zval *return_value TSRMLS_DC); ! 391: ! 392: /* advances the statement to the next rowset of the batch. ! 393: * If it returns 1, PDO will tear down its idea of columns ! 394: * and meta data. If it returns 0, PDO will indicate an error ! 395: * to the caller. */ ! 396: typedef int (*pdo_stmt_next_rowset_func)(pdo_stmt_t *stmt TSRMLS_DC); ! 397: ! 398: /* closes the active cursor on a statement, leaving the prepared ! 399: * statement ready for re-execution. Useful to explicitly state ! 400: * that you are done with a given rowset, without having to explicitly ! 401: * fetch all the rows. */ ! 402: typedef int (*pdo_stmt_cursor_closer_func)(pdo_stmt_t *stmt TSRMLS_DC); ! 403: ! 404: struct pdo_stmt_methods { ! 405: pdo_stmt_dtor_func dtor; ! 406: pdo_stmt_execute_func executer; ! 407: pdo_stmt_fetch_func fetcher; ! 408: pdo_stmt_describe_col_func describer; ! 409: pdo_stmt_get_col_data_func get_col; ! 410: pdo_stmt_param_hook_func param_hook; ! 411: pdo_stmt_set_attr_func set_attribute; ! 412: pdo_stmt_get_attr_func get_attribute; ! 413: pdo_stmt_get_column_meta_func get_column_meta; ! 414: pdo_stmt_next_rowset_func next_rowset; ! 415: pdo_stmt_cursor_closer_func cursor_closer; ! 416: }; ! 417: ! 418: /* }}} */ ! 419: ! 420: enum pdo_placeholder_support { ! 421: PDO_PLACEHOLDER_NONE=0, ! 422: PDO_PLACEHOLDER_NAMED=1, ! 423: PDO_PLACEHOLDER_POSITIONAL=2 ! 424: }; ! 425: ! 426: /* represents a connection to a database */ ! 427: struct _pdo_dbh_t { ! 428: /* these items must appear in this order at the beginning of the ! 429: struct so that this can be cast as a zend_object. we need this ! 430: to allow the extending class to escape all the custom handlers ! 431: that PDO declares. ! 432: */ ! 433: zend_class_entry *ce; ! 434: HashTable *properties; ! 435: unsigned int in_get:1; ! 436: unsigned int in_set:1; ! 437: ! 438: /* driver specific methods */ ! 439: struct pdo_dbh_methods *methods; ! 440: /* driver specific data */ ! 441: void *driver_data; ! 442: ! 443: /* credentials */ ! 444: char *username, *password; ! 445: ! 446: /* if true, then data stored and pointed at by this handle must all be ! 447: * persistently allocated */ ! 448: unsigned is_persistent:1; ! 449: ! 450: /* if true, driver should act as though a COMMIT were executed between ! 451: * each executed statement; otherwise, COMMIT must be carried out manually ! 452: * */ ! 453: unsigned auto_commit:1; ! 454: ! 455: /* if true, the handle has been closed and will not function anymore */ ! 456: unsigned is_closed:1; ! 457: ! 458: /* if true, the driver requires that memory be allocated explicitly for ! 459: * the columns that are returned */ ! 460: unsigned alloc_own_columns:1; ! 461: ! 462: /* if true, commit or rollBack is allowed to be called */ ! 463: unsigned in_txn:1; ! 464: ! 465: /* max length a single character can become after correct quoting */ ! 466: unsigned max_escaped_char_length:3; ! 467: ! 468: /* oracle compat; see enum pdo_null_handling */ ! 469: unsigned oracle_nulls:2; ! 470: ! 471: /* when set, convert int/floats to strings */ ! 472: unsigned stringify:1; ! 473: ! 474: /* the sum of the number of bits here and the bit fields preceeding should ! 475: * equal 32 */ ! 476: unsigned _reserved_flags:21; ! 477: ! 478: /* data source string used to open this handle */ ! 479: const char *data_source; ! 480: unsigned long data_source_len; ! 481: ! 482: /* the global error code. */ ! 483: pdo_error_type error_code; ! 484: ! 485: enum pdo_error_mode error_mode; ! 486: ! 487: enum pdo_case_conversion native_case, desired_case; ! 488: ! 489: /* persistent hash key associated with this handle */ ! 490: const char *persistent_id; ! 491: int persistent_id_len; ! 492: unsigned int refcount; ! 493: ! 494: /* driver specific "class" methods for the dbh and stmt */ ! 495: HashTable *cls_methods[PDO_DBH_DRIVER_METHOD_KIND__MAX]; ! 496: ! 497: pdo_driver_t *driver; ! 498: ! 499: zend_class_entry *def_stmt_ce; ! 500: ! 501: zval *def_stmt_ctor_args; ! 502: ! 503: /* when calling PDO::query(), we need to keep the error ! 504: * context from the statement around until we next clear it. ! 505: * This will allow us to report the correct error message ! 506: * when PDO::query() fails */ ! 507: pdo_stmt_t *query_stmt; ! 508: zval query_stmt_zval; ! 509: ! 510: /* defaults for fetches */ ! 511: enum pdo_fetch_type default_fetch_type; ! 512: }; ! 513: ! 514: /* describes a column */ ! 515: struct pdo_column_data { ! 516: char *name; ! 517: int namelen; ! 518: unsigned long maxlen; ! 519: enum pdo_param_type param_type; ! 520: unsigned long precision; ! 521: ! 522: /* don't touch this unless your name is dbdo */ ! 523: void *dbdo_data; ! 524: }; ! 525: ! 526: /* describes a bound parameter */ ! 527: struct pdo_bound_param_data { ! 528: long paramno; /* if -1, then it has a name, and we don't know the index *yet* */ ! 529: char *name; ! 530: int namelen; ! 531: ! 532: long max_value_len; /* as a hint for pre-allocation */ ! 533: ! 534: zval *parameter; /* the variable itself */ ! 535: enum pdo_param_type param_type; /* desired or suggested type */ ! 536: ! 537: zval *driver_params; /* optional parameter(s) for the driver */ ! 538: void *driver_data; ! 539: ! 540: pdo_stmt_t *stmt; /* for convenience in dtor */ ! 541: int is_param; /* parameter or column ? */ ! 542: }; ! 543: ! 544: /* represents a prepared statement */ ! 545: struct _pdo_stmt_t { ! 546: /* these items must appear in this order at the beginning of the ! 547: struct so that this can be cast as a zend_object. we need this ! 548: to allow the extending class to escape all the custom handlers ! 549: that PDO declares. ! 550: */ ! 551: zend_class_entry *ce; ! 552: HashTable *properties; ! 553: unsigned int in_get:1; ! 554: unsigned int in_set:1; ! 555: ! 556: /* driver specifics */ ! 557: struct pdo_stmt_methods *methods; ! 558: void *driver_data; ! 559: ! 560: /* if true, we've already successfully executed this statement at least ! 561: * once */ ! 562: unsigned executed:1; ! 563: /* if true, the statement supports placeholders and can implement ! 564: * bindParam() for its prepared statements, if false, PDO should ! 565: * emulate prepare and bind on its behalf */ ! 566: unsigned supports_placeholders:2; ! 567: ! 568: unsigned _reserved:29; ! 569: ! 570: /* the number of columns in the result set; not valid until after ! 571: * the statement has been executed at least once. In some cases, might ! 572: * not be valid until fetch (at the driver level) has been called at least once. ! 573: * */ ! 574: int column_count; ! 575: struct pdo_column_data *columns; ! 576: ! 577: /* we want to keep the dbh alive while we live, so we own a reference */ ! 578: zval database_object_handle; ! 579: pdo_dbh_t *dbh; ! 580: ! 581: /* keep track of bound input parameters. Some drivers support ! 582: * input/output parameters, but you can't rely on that working */ ! 583: HashTable *bound_params; ! 584: /* When rewriting from named to positional, this maps positions to names */ ! 585: HashTable *bound_param_map; ! 586: /* keep track of PHP variables bound to named (or positional) columns ! 587: * in the result set */ ! 588: HashTable *bound_columns; ! 589: ! 590: /* not always meaningful */ ! 591: long row_count; ! 592: ! 593: /* used to hold the statement's current query */ ! 594: char *query_string; ! 595: int query_stringlen; ! 596: ! 597: /* the copy of the query with expanded binds ONLY for emulated-prepare drivers */ ! 598: char *active_query_string; ! 599: int active_query_stringlen; ! 600: ! 601: /* the cursor specific error code. */ ! 602: pdo_error_type error_code; ! 603: ! 604: /* for lazy fetches, we always return the same lazy object handle. ! 605: * Let's keep it here. */ ! 606: zval lazy_object_ref; ! 607: unsigned long refcount; ! 608: ! 609: /* defaults for fetches */ ! 610: enum pdo_fetch_type default_fetch_type; ! 611: union { ! 612: int column; ! 613: struct { ! 614: zend_class_entry *ce; ! 615: zval *ctor_args; /* freed */ ! 616: zval *retval_ptr; ! 617: zend_fcall_info fci; ! 618: zend_fcall_info_cache fcc; ! 619: } cls; ! 620: struct { ! 621: zval *function; ! 622: zval *fetch_args; /* freed */ ! 623: zval *object; ! 624: zend_fcall_info fci; ! 625: zend_fcall_info_cache fcc; ! 626: zval **values; /* freed */ ! 627: } func; ! 628: zval *into; ! 629: } fetch; ! 630: ! 631: /* used by the query parser for driver specific ! 632: * parameter naming (see pgsql driver for example) */ ! 633: const char *named_rewrite_template; ! 634: }; ! 635: ! 636: /* call this in MINIT to register your PDO driver */ ! 637: PDO_API int php_pdo_register_driver(pdo_driver_t *driver); ! 638: /* call this in MSHUTDOWN to unregister your PDO driver */ ! 639: PDO_API void php_pdo_unregister_driver(pdo_driver_t *driver); ! 640: ! 641: /* For the convenience of drivers, this function will parse a data source ! 642: * string, of the form "name=value; name2=value2" and populate variables ! 643: * according to the data you pass in and array of pdo_data_src_parser structures */ ! 644: struct pdo_data_src_parser { ! 645: const char *optname; ! 646: char *optval; ! 647: int freeme; ! 648: }; ! 649: ! 650: PDO_API int php_pdo_parse_data_source(const char *data_source, ! 651: unsigned long data_source_len, struct pdo_data_src_parser *parsed, ! 652: int nparams); ! 653: ! 654: PDO_API zend_class_entry *php_pdo_get_dbh_ce(void); ! 655: PDO_API zend_class_entry *php_pdo_get_exception(void); ! 656: ! 657: PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, ! 658: char **outquery, int *outquery_len TSRMLS_DC); ! 659: ! 660: PDO_API void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, ! 661: const char *sqlstate, const char *supp TSRMLS_DC); ! 662: ! 663: PDO_API void php_pdo_dbh_addref(pdo_dbh_t *dbh TSRMLS_DC); ! 664: PDO_API void php_pdo_dbh_delref(pdo_dbh_t *dbh TSRMLS_DC); ! 665: ! 666: PDO_API void php_pdo_stmt_addref(pdo_stmt_t *stmt TSRMLS_DC); ! 667: PDO_API void php_pdo_stmt_delref(pdo_stmt_t *stmt TSRMLS_DC); ! 668: ! 669: ! 670: #endif /* PHP_PDO_DRIVER_H */ ! 671: /* ! 672: * Local variables: ! 673: * tab-width: 4 ! 674: * c-basic-offset: 4 ! 675: * End: ! 676: * vim600: noet sw=4 ts=4 fdm=marker ! 677: * vim<600: noet sw=4 ts=4 ! 678: */