Annotation of embedaddon/php/ext/pdo/php_pdo_driver.h, revision 1.1.1.1
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: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>