diff options
Diffstat (limited to 'ext/pdo/php_pdo_driver.h')
-rwxr-xr-x | ext/pdo/php_pdo_driver.h | 633 |
1 files changed, 0 insertions, 633 deletions
diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h deleted file mode 100755 index 11650ac65e..0000000000 --- a/ext/pdo/php_pdo_driver.h +++ /dev/null @@ -1,633 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 5 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2005 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.0 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_0.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: Wez Furlong <wez@php.net> | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#ifndef PHP_PDO_DRIVER_H -#define PHP_PDO_DRIVER_H - -#include "php_pdo.h" - -/* forward declarations */ -typedef struct _pdo_dbh_t pdo_dbh_t; -typedef struct _pdo_stmt_t pdo_stmt_t; -struct pdo_bound_param_data; - -#ifdef PHP_WIN32 -typedef __int64 pdo_int64_t; -typedef unsigned __int64 pdo_uint64_t; -#else -typedef long long int pdo_int64_t; -typedef unsigned long long int pdo_uint64_t; -#endif -PDO_API char *php_pdo_int64_to_str(pdo_int64_t i64 TSRMLS_DC); - -#ifndef TRUE -# define TRUE 1 -#endif -#ifndef FALSE -# define FALSE 0 -#endif - -#define PDO_DRIVER_API 20050711 - -enum pdo_param_type { - PDO_PARAM_NULL, - - /* int as in long (the php native int type). - * If you mark a column as an int, PDO expects get_col to return - * a pointer to a long */ - PDO_PARAM_INT, - - /* get_col ptr should point to start of the string buffer */ - PDO_PARAM_STR, - - /* get_col: when len is 0 ptr should point to a php_stream *, - * otherwise it should behave like a string. Indicate a NULL field - * value by setting the ptr to NULL */ - PDO_PARAM_LOB, - - /* get_col: will expect the ptr to point to a new PDOStatement object handle, - * but this isn't wired up yet */ - PDO_PARAM_STMT, /* hierarchical result set */ - - /* get_col ptr should point to a zend_bool */ - PDO_PARAM_BOOL, -}; - -/* magic flag to denote a parameter as being input/output */ -#define PDO_PARAM_INPUT_OUTPUT 0x80000000 - -#define PDO_PARAM_FLAGS 0xFFFF0000 - -#define PDO_PARAM_TYPE(x) ((x) & ~PDO_PARAM_FLAGS) - -enum pdo_fetch_type { - PDO_FETCH_USE_DEFAULT, - PDO_FETCH_LAZY, - PDO_FETCH_ASSOC, - PDO_FETCH_NUM, - PDO_FETCH_BOTH, - PDO_FETCH_OBJ, - PDO_FETCH_BOUND, /* return true/false only; rely on bound columns */ - PDO_FETCH_COLUMN, /* fetch a numbered column only */ - PDO_FETCH_CLASS, /* create an instance of named class, call ctor and set properties */ - PDO_FETCH_INTO, /* fetch row into an existing object */ - PDO_FETCH_FUNC, /* fetch into function and return its result */ - PDO_FETCH_NAMED, /* like PDO_FETCH_ASSOC, but can handle duplicate names */ - PDO_FETCH__MAX /* must be last */ -}; - -#define PDO_FETCH_FLAGS 0xFFFF0000 /* fetchAll() modes or'd to PDO_FETCH_XYZ */ -#define PDO_FETCH_GROUP 0x00010000 /* fetch into groups */ -#define PDO_FETCH_UNIQUE 0x00030000 /* fetch into groups assuming first col is unique */ -#define PDO_FETCH_CLASSTYPE 0x00040000 /* fetch class gets its class name from 1st column */ -#define PDO_FETCH_SERIALIZE 0x00080000 /* fetch class instances by calling serialize */ - -/* fetch orientation for scrollable cursors */ -enum pdo_fetch_orientation { - PDO_FETCH_ORI_NEXT, /* default: fetch the next available row */ - PDO_FETCH_ORI_PRIOR, /* scroll back to prior row and fetch that */ - PDO_FETCH_ORI_FIRST, /* scroll to the first row and fetch that */ - PDO_FETCH_ORI_LAST, /* scroll to the last row and fetch that */ - PDO_FETCH_ORI_ABS, /* scroll to an absolute numbered row and fetch that */ - PDO_FETCH_ORI_REL /* scroll relative to the current row, and fetch that */ -}; - -enum pdo_attribute_type { - PDO_ATTR_AUTOCOMMIT, /* use to turn on or off auto-commit mode */ - PDO_ATTR_PREFETCH, /* configure the prefetch size for drivers that support it. Size is in KB */ - PDO_ATTR_TIMEOUT, /* connection timeout in seconds */ - PDO_ATTR_ERRMODE, /* control how errors are handled */ - PDO_ATTR_SERVER_VERSION, /* database server version */ - PDO_ATTR_CLIENT_VERSION, /* client library version */ - PDO_ATTR_SERVER_INFO, /* server information */ - PDO_ATTR_CONNECTION_STATUS, /* connection status */ - PDO_ATTR_CASE, /* control case folding for portability */ - PDO_ATTR_CURSOR_NAME, /* name a cursor for use in "WHERE CURRENT OF <name>" */ - PDO_ATTR_CURSOR, /* cursor type */ - PDO_ATTR_ORACLE_NULLS, /* convert empty strings to NULL */ - PDO_ATTR_PERSISTENT, /* pconnect style connection */ - PDO_ATTR_STATEMENT_CLASS, /* array(classname, array(ctor_args)) to specify the class of the constructed statement */ - PDO_ATTR_FETCH_TABLE_NAMES, /* include table names in the column names, where available */ - PDO_ATTR_FETCH_CATALOG_NAMES, /* include the catalog/db name names in the column names, where available */ - PDO_ATTR_DRIVER_NAME, /* name of the driver (as used in the constructor) */ - PDO_ATTR_STRINGIFY_FETCHES, /* converts integer/float types to strings during fetch */ - PDO_ATTR_MAX_COLUMN_LEN, /* make database calculate maximum length of data found in a column */ - - /* this defines the start of the range for driver specific options. - * Drivers should define their own attribute constants beginning with this - * value. */ - PDO_ATTR_DRIVER_SPECIFIC = 1000 -}; - -enum pdo_cursor_type { - PDO_CURSOR_FWDONLY, /* forward only cursor (default) */ - PDO_CURSOR_SCROLL /* scrollable cursor */ -}; - -/* SQL-92 SQLSTATE error codes. - -The character string value returned for an SQLSTATE consists of a two-character -class value followed by a three-character subclass value. A class value of 01 -indicates a warning and is accompanied by a return code of -SQL_SUCCESS_WITH_INFO. - -Class values other than '01', except for the class 'IM', -indicate an error and are accompanied by a return code of SQL_ERROR. The class -'IM' is specific to warnings and errors that derive from the implementation of -ODBC itself. - -The subclass value '000' in any class indicates that there is no -subclass for that SQLSTATE. The assignment of class and subclass values is -defined by SQL-92. -*/ - -typedef char pdo_error_type[6]; /* SQLSTATE */ - - -#define PDO_ERR_NONE "00000" - -enum pdo_error_mode { - PDO_ERRMODE_SILENT, /* just set error codes */ - PDO_ERRMODE_WARNING, /* raise E_WARNING */ - PDO_ERRMODE_EXCEPTION /* throw exceptions */ -}; - -enum pdo_case_conversion { - PDO_CASE_NATURAL, - PDO_CASE_UPPER, - PDO_CASE_LOWER -}; - -/* oracle interop settings */ -enum pdo_null_handling { - PDO_NULL_NATURAL = 0, - PDO_NULL_EMPTY_STRING = 1, - PDO_NULL_TO_STRING = 2, -}; - -/* {{{ utils for reading attributes set as driver_options */ -static inline long pdo_attr_lval(zval *options, enum pdo_fetch_type option_name, long defval TSRMLS_DC) -{ - zval **v; - - if (options && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(options), option_name, (void**)&v)) { - convert_to_long_ex(v); - return Z_LVAL_PP(v); - } - return defval; -} -/* }}} */ - -/* This structure is registered with PDO when a PDO driver extension is - * initialized */ -typedef struct { - const char *driver_name; - unsigned long driver_name_len; - unsigned long api_version; /* needs to be compatible with PDO */ - -#define PDO_DRIVER_HEADER(name) \ - #name, sizeof(#name)-1, \ - PDO_DRIVER_API - - /* create driver specific portion of the database handle and stash it into - * the dbh. dbh contains the data source string and flags for this - * instance. You MUST respect dbh->is_persistent and pass that flag to - * pemalloc() for all allocations that are stored in the dbh or your instance - * data in the db, otherwise you will crash PHP when persistent connections - * are used. - */ - int (*db_handle_factory)(pdo_dbh_t *dbh, zval *driver_options TSRMLS_DC); - -} pdo_driver_t; - -/* {{{ methods for a database handle */ - -/* close or otherwise disconnect the database */ -typedef int (*pdo_dbh_close_func)(pdo_dbh_t *dbh TSRMLS_DC); - -/* prepare a statement and stash driver specific portion into stmt */ -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); - -/* execute a statement (that does not return a result set) */ -typedef long (*pdo_dbh_do_func)(pdo_dbh_t *dbh, const char *sql, long sql_len TSRMLS_DC); - -/* quote a string */ -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); - -/* transaction related */ -typedef int (*pdo_dbh_txn_func)(pdo_dbh_t *dbh TSRMLS_DC); - -/* setting of attributes */ -typedef int (*pdo_dbh_set_attr_func)(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_DC); - -/* return last insert id. NULL indicates error condition, otherwise, the return value - * MUST be an emalloc'd NULL terminated string. */ -typedef char *(*pdo_dbh_last_id_func)(pdo_dbh_t *dbh, const char *name, unsigned int *len TSRMLS_DC); - -/* fetch error information. if stmt is not null, fetch information pertaining - * to the statement, otherwise fetch global error information. The driver - * should add the following information to the array "info" in this order: - * - native error code - * - string representation of the error code ... any other optional driver - * specific data ... */ -typedef int (*pdo_dbh_fetch_error_func)(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info TSRMLS_DC); - -/* fetching of attributes */ -typedef int (*pdo_dbh_get_attr_func)(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_DC); - -/* checking/pinging persistent connections; return SUCCESS if the connection - * is still alive and ready to be used, FAILURE otherwise. - * You may set this handler to NULL, which is equivalent to returning SUCCESS. */ -typedef int (*pdo_dbh_check_liveness_func)(pdo_dbh_t *dbh TSRMLS_DC); - -/* called at request end for each persistent dbh; this gives the driver - * the opportunity to safely release resources that only have per-request - * scope */ -typedef void (*pdo_dbh_request_shutdown)(pdo_dbh_t *dbh TSRMLS_DC); - -/* for adding methods to the dbh or stmt objects -pointer to a list of driver specific functions. The convention is -to prefix the function names using the PDO driver name; this will -reduce the chance of collisions with future functionality in the -PDO class or in user code (they can extend the PDO object). -*/ -enum { - PDO_DBH_DRIVER_METHOD_KIND_DBH = 0, - PDO_DBH_DRIVER_METHOD_KIND_STMT, - PDO_DBH_DRIVER_METHOD_KIND__MAX -}; - -typedef function_entry *(*pdo_dbh_get_driver_methods_func)(pdo_dbh_t *dbh, int kind TSRMLS_DC); - -struct pdo_dbh_methods { - pdo_dbh_close_func closer; - pdo_dbh_prepare_func preparer; - pdo_dbh_do_func doer; - pdo_dbh_quote_func quoter; - pdo_dbh_txn_func begin; - pdo_dbh_txn_func commit; - pdo_dbh_txn_func rollback; - pdo_dbh_set_attr_func set_attribute; - pdo_dbh_last_id_func last_id; - pdo_dbh_fetch_error_func fetch_err; - pdo_dbh_get_attr_func get_attribute; - pdo_dbh_check_liveness_func check_liveness; - pdo_dbh_get_driver_methods_func get_driver_methods; - pdo_dbh_request_shutdown persistent_shutdown; -}; - -/* }}} */ - -/* {{{ methods for a statement handle */ - -/* free the statement handle */ -typedef int (*pdo_stmt_dtor_func)(pdo_stmt_t *stmt TSRMLS_DC); - -/* start the query */ -typedef int (*pdo_stmt_execute_func)(pdo_stmt_t *stmt TSRMLS_DC); - -/* causes the next row in the set to be fetched; indicates if there are no - * more rows. The ori and offset params modify which row should be returned, - * if the stmt represents a scrollable cursor */ -typedef int (*pdo_stmt_fetch_func)(pdo_stmt_t *stmt, - enum pdo_fetch_orientation ori, long offset TSRMLS_DC); - -/* queries information about the type of a column, by index (0 based). - * Driver should populate stmt->columns[colno] with appropriate info */ -typedef int (*pdo_stmt_describe_col_func)(pdo_stmt_t *stmt, int colno TSRMLS_DC); - -/* retrieves pointer and size of the value for a column. - * Note that PDO expects the driver to manage the lifetime of this data; - * it will copy the value into a zval on behalf of the script. - * If the driver sets caller_frees, ptr should point to emalloc'd memory - * and PDO will free it as soon as it is done using it. - */ -typedef int (*pdo_stmt_get_col_data_func)(pdo_stmt_t *stmt, int colno, char **ptr, unsigned long *len, int *caller_frees TSRMLS_DC); - -/* hook for bound params */ -enum pdo_param_event { - PDO_PARAM_EVT_ALLOC, - PDO_PARAM_EVT_FREE, - PDO_PARAM_EVT_EXEC_PRE, - PDO_PARAM_EVT_EXEC_POST, - PDO_PARAM_EVT_FETCH_PRE, - PDO_PARAM_EVT_FETCH_POST -}; - -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); - -/* setting of attributes */ -typedef int (*pdo_stmt_set_attr_func)(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC); - -/* fetching of attributes */ -typedef int (*pdo_stmt_get_attr_func)(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC); - -/* retrieves meta data for a numbered column. - * Returns SUCCESS/FAILURE. - * On SUCCESS, fill in return_value with an array with the following fields. - * If a particular field is not supported, then the driver simply does not add it to - * the array, so that scripts can use isset() to check for it. - * - * ### this is just a rough first cut, and subject to change ### - * - * these are added by PDO itself, based on data from the describe handler: - * name => the column name - * len => the length/size of the column - * precision => precision of the column - * pdo_type => an integer, one of the PDO_PARAM_XXX values - * - * scale => the floating point scale - * table => the table for that column - * type => a string representation of the type, mapped to the PHP equivalent type name - * native_type => a string representation of the type, native style, if different from - * the mapped name. - * flags => an array of flags including zero or more of the following: - * primary_key, not_null, unique_key, multiple_key, unsigned, auto_increment, blob - * - * Any driver specific data should be returned using a prefixed key or value. - * Eg: custom data for the mysql driver would use either - * 'mysql:foobar' => 'some data' // to add a new key to the array - * or - * 'flags' => array('not_null', 'mysql:some_flag'); // to add data to an existing key - */ -typedef int (*pdo_stmt_get_column_meta_func)(pdo_stmt_t *stmt, long colno, zval *return_value TSRMLS_DC); - -/* advances the statement to the next rowset of the batch. - * If it returns 1, PDO will tear down its idea of columns - * and meta data. If it returns 0, PDO will indicate an error - * to the caller. */ -typedef int (*pdo_stmt_next_rowset_func)(pdo_stmt_t *stmt TSRMLS_DC); - -/* closes the active cursor on a statement, leaving the prepared - * statement ready for re-execution. Useful to explicitly state - * that you are done with a given rowset, without having to explicitly - * fetch all the rows. */ -typedef int (*pdo_stmt_cursor_closer_func)(pdo_stmt_t *stmt TSRMLS_DC); - -struct pdo_stmt_methods { - pdo_stmt_dtor_func dtor; - pdo_stmt_execute_func executer; - pdo_stmt_fetch_func fetcher; - pdo_stmt_describe_col_func describer; - pdo_stmt_get_col_data_func get_col; - pdo_stmt_param_hook_func param_hook; - pdo_stmt_set_attr_func set_attribute; - pdo_stmt_get_attr_func get_attribute; - pdo_stmt_get_column_meta_func get_column_meta; - pdo_stmt_next_rowset_func next_rowset; - pdo_stmt_cursor_closer_func cursor_closer; -}; - -/* }}} */ - -enum pdo_placeholder_support { - PDO_PLACEHOLDER_NONE=0, - PDO_PLACEHOLDER_NAMED=1, - PDO_PLACEHOLDER_POSITIONAL=2 -}; - -/* represents a connection to a database */ -struct _pdo_dbh_t { - /* these items must appear in this order at the beginning of the - struct so that this can be cast as a zend_object. we need this - to allow the extending class to escape all the custom handlers - that PDO declares. - */ - zend_class_entry *ce; - HashTable *properties; - unsigned int in_get:1; - unsigned int in_set:1; - - /* driver specific methods */ - struct pdo_dbh_methods *methods; - /* driver specific data */ - void *driver_data; - - /* credentials */ - char *username, *password; - - /* if true, then data stored and pointed at by this handle must all be - * persistently allocated */ - unsigned is_persistent:1; - - /* if true, driver should act as though a COMMIT were executed between - * each executed statement; otherwise, COMMIT must be carried out manually - * */ - unsigned auto_commit:1; - - /* if true, the handle has been closed and will not function anymore */ - unsigned is_closed:1; - - /* if true, the driver requires that memory be allocated explicitly for - * the columns that are returned */ - unsigned alloc_own_columns:1; - - /* if true, commit or rollBack is allowed to be called */ - unsigned in_txn:1; - - /* max length a single character can become after correct quoting */ - unsigned max_escaped_char_length:3; - - /* oracle compat; see enum pdo_null_handling */ - unsigned oracle_nulls:2; - - /* when set, convert int/floats to strings */ - unsigned stringify:1; - - /* the sum of the number of bits here and the bit fields preceeding should - * equal 32 */ - unsigned _reserved_flags:21; - - /* data source string used to open this handle */ - const char *data_source; - unsigned long data_source_len; - - /* the global error code. */ - pdo_error_type error_code; - - enum pdo_error_mode error_mode; - - enum pdo_case_conversion native_case, desired_case; - - /* persistent hash key associated with this handle */ - const char *persistent_id; - int persistent_id_len; - unsigned int refcount; - - /* driver specific "class" methods for the dbh and stmt */ - HashTable *cls_methods[PDO_DBH_DRIVER_METHOD_KIND__MAX]; - - pdo_driver_t *driver; -}; - -/* describes a column */ -struct pdo_column_data { - char *name; - long namelen; - unsigned long maxlen; - enum pdo_param_type param_type; - unsigned long precision; - - /* don't touch this unless your name is dbdo */ - void *dbdo_data; -}; - -/* describes a bound parameter */ -struct pdo_bound_param_data { - long paramno; /* if -1, then it has a name, and we don't know the index *yet* */ - char *name; - long namelen; - - long max_value_len; /* as a hint for pre-allocation */ - - zval *parameter; /* the variable itself */ - enum pdo_param_type param_type; /* desired or suggested type */ - - zval *driver_params; /* optional parameter(s) for the driver */ - void *driver_data; - - pdo_stmt_t *stmt; /* for convenience in dtor */ - int is_param; /* parameter or column ? */ -}; - -/* represents a prepared statement */ -struct _pdo_stmt_t { - /* these items must appear in this order at the beginning of the - struct so that this can be cast as a zend_object. we need this - to allow the extending class to escape all the custom handlers - that PDO declares. - */ - zend_class_entry *ce; - HashTable *properties; - unsigned int in_get:1; - unsigned int in_set:1; - - /* driver specifics */ - struct pdo_stmt_methods *methods; - void *driver_data; - - /* if true, we've already successfully executed this statement at least - * once */ - unsigned executed:1; - /* if true, the statement supports placeholders and can implement - * bindParam() for its prepared statements, if false, PDO should - * emulate prepare and bind on its behalf */ - unsigned supports_placeholders:2; - - unsigned _reserved:29; - - /* the number of columns in the result set; not valid until after - * the statement has been executed at least once. In some cases, might - * not be valid until fetch (at the driver level) has been called at least once. - * */ - int column_count; - struct pdo_column_data *columns; - - /* we want to keep the dbh alive while we live, so we own a reference */ - zval database_object_handle; - pdo_dbh_t *dbh; - - /* keep track of bound input parameters. Some drivers support - * input/output parameters, but you can't rely on that working */ - HashTable *bound_params; - /* When rewriting from named to positional, this maps positions to names */ - HashTable *bound_param_map; - /* keep track of PHP variables bound to named (or positional) columns - * in the result set */ - HashTable *bound_columns; - - /* not always meaningful */ - long row_count; - - /* used to hold the statement's current query */ - char *query_string; - int query_stringlen; - - /* the copy of the query with expanded binds ONLY for emulated-prepare drivers */ - char *active_query_string; - int active_query_stringlen; - - /* the cursor specific error code. */ - pdo_error_type error_code; - - /* for lazy fetches, we always return the same lazy object handle. - * Let's keep it here. */ - zval lazy_object_ref; - unsigned long refcount; - - /* defaults for fetches */ - enum pdo_fetch_type default_fetch_type; - union { - int column; - struct { - zend_class_entry *ce; - zval *ctor_args; /* freed */ - zval *retval_ptr; - zend_fcall_info fci; - zend_fcall_info_cache fcc; - } cls; - struct { - zval *function; - zval *fetch_args; /* freed */ - zval *object; - zend_fcall_info fci; - zend_fcall_info_cache fcc; - zval **values; /* freed */ - } func; - zval *into; - } fetch; - - /* used by the query parser for driver specific - * parameter naming (see pgsql driver for example) */ - const char *named_rewrite_template; -}; - -/* call this in MINIT to register your PDO driver */ -PDO_API int php_pdo_register_driver(pdo_driver_t *driver); -/* call this in MSHUTDOWN to unregister your PDO driver */ -PDO_API void php_pdo_unregister_driver(pdo_driver_t *driver); - -/* For the convenience of drivers, this function will parse a data source - * string, of the form "name=value; name2=value2" and populate variables - * according to the data you pass in and array of pdo_data_src_parser structures */ -struct pdo_data_src_parser { - const char *optname; - char *optval; - int freeme; -}; - -PDO_API int php_pdo_parse_data_source(const char *data_source, - unsigned long data_source_len, struct pdo_data_src_parser *parsed, - int nparams); - -PDO_API zend_class_entry *php_pdo_get_exception(void); - -PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, - char **outquery, int *outquery_len TSRMLS_DC); - -#endif /* PHP_PDO_DRIVER_H */ -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: noet sw=4 ts=4 fdm=marker - * vim<600: noet sw=4 ts=4 - */ |