1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 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 272370 2008-12-31 11:15:49Z sebastian $ */
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 2769 : {
197 : zval **v;
198 :
199 2769 : if (options && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(options), option_name, (void**)&v)) {
200 37 : convert_to_long_ex(v);
201 37 : return Z_LVAL_PP(v);
202 : }
203 2732 : return defval;
204 : }
205 : static inline char *pdo_attr_strval(zval *options, enum pdo_attribute_type option_name, char *defval TSRMLS_DC)
206 25 : {
207 : zval **v;
208 :
209 25 : if (options && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(options), option_name, (void**)&v)) {
210 4 : convert_to_string_ex(v);
211 4 : return estrndup(Z_STRVAL_PP(v), Z_STRLEN_PP(v));
212 : }
213 21 : 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 : */
|