summaryrefslogtreecommitdiff
path: root/ext/pdo/php_pdo_driver.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pdo/php_pdo_driver.h')
-rwxr-xr-xext/pdo/php_pdo_driver.h663
1 files changed, 663 insertions, 0 deletions
diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h
new file mode 100755
index 0000000000..38f65d6af2
--- /dev/null
+++ b/ext/pdo/php_pdo_driver.h
@@ -0,0 +1,663 @@
+/*
+ +----------------------------------------------------------------------+
+ | 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 20051128
+
+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_attribute_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;
+}
+static inline char *pdo_attr_strval(zval *options, enum pdo_attribute_type option_name, char *defval TSRMLS_DC)
+{
+ zval **v;
+
+ if (options && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(options), option_name, (void**)&v)) {
+ convert_to_string_ex(v);
+ return estrndup(Z_STRVAL_PP(v), Z_STRLEN_PP(v));
+ }
+ return defval ? estrdup(defval) : NULL;
+}
+/* }}} */
+
+/* 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;
+
+ zend_class_entry *def_stmt_ce;
+ zval *def_stmt_ctor_args;
+
+ /* when calling PDO::query(), we need to keep the error
+ * context from the statement around until we next clear it.
+ * This will allow us to report the correct error message
+ * when PDO::query() fails */
+ pdo_stmt_t *query_stmt;
+ zval query_stmt_zval;
+};
+
+/* 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);
+
+PDO_API void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt,
+ const char *sqlstate, const char *supp TSRMLS_DC);
+
+PDO_API void php_pdo_dbh_addref(pdo_dbh_t *dbh TSRMLS_DC);
+PDO_API void php_pdo_dbh_delref(pdo_dbh_t *dbh TSRMLS_DC);
+
+PDO_API void php_pdo_stmt_addref(pdo_stmt_t *stmt TSRMLS_DC);
+PDO_API void php_pdo_stmt_delref(pdo_stmt_t *stmt 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
+ */