2 +----------------------------------------------------------------------+
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 +----------------------------------------------------------------------+
16 +----------------------------------------------------------------------+
26 #include <Zend/zend_interfaces.h>
27 #include <ext/standard/info.h>
28 #include <ext/spl/spl_array.h>
30 #include <libpq-events.h>
34 typedef int STATUS
; /* SUCCESS/FAILURE */
37 ZEND_DECLARE_MODULE_GLOBALS(pq)
40 const zend_function_entry pq_functions
[] = {
44 /* {{{ pq_module_entry
46 zend_module_entry pq_module_entry
= {
47 STANDARD_MODULE_HEADER
,
52 NULL
,/*PHP_RINIT(pq),*/
53 NULL
,/*PHP_RSHUTDOWN(pq),*/
56 STANDARD_MODULE_PROPERTIES
66 /* Remove comments and fill if you need to have entries in php.ini
68 STD_PHP_INI_ENTRY("pq.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_pq_globals, pq_globals)
69 STD_PHP_INI_ENTRY("pq.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_pq_globals, pq_globals)
74 /* {{{ php_pq_init_globals
76 /* Uncomment this function if you have INI entries
77 static void php_pq_init_globals(zend_pq_globals *pq_globals)
79 pq_globals->global_value = 0;
80 pq_globals->global_string = NULL;
85 static zend_class_entry
*php_pqconn_class_entry
;
86 static zend_class_entry
*php_pqres_class_entry
;
87 static zend_class_entry
*php_pqstm_class_entry
;
89 static zend_object_handlers php_pqconn_object_handlers
;
90 static zend_object_handlers php_pqres_object_handlers
;
91 static zend_object_handlers php_pqstm_object_handlers
;
93 typedef struct php_pqconn_object
{
96 int (*poller
)(PGconn
*);
98 } php_pqconn_object_t
;
100 typedef enum php_pqres_fetch
{
101 PHP_PQRES_FETCH_ARRAY
,
102 PHP_PQRES_FETCH_ASSOC
,
103 PHP_PQRES_FETCH_OBJECT
106 typedef struct php_pqres_iterator
{
107 zend_object_iterator zi
;
110 php_pqres_fetch_t fetch_type
;
111 } php_pqres_iterator_t
;
113 typedef struct php_pqres_object
{
116 php_pqres_iterator_t
*iter
;
117 } php_pqres_object_t
;
119 typedef struct php_pqstm_intern
{
122 } php_pqstm_intern_t
;
124 typedef struct php_pqstm_object
{
128 } php_pqstm_object_t
;
130 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
132 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
134 php_pqres_iterator_t
*iter
;
135 zval
*prop
, *zfetch_type
;
137 iter
= ecalloc(1, sizeof(*iter
));
138 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
139 iter
->zi
.data
= object
;
142 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
143 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
144 convert_to_long_ex(&zfetch_type
);
146 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
147 if (zfetch_type
!= prop
) {
148 zval_ptr_dtor(&zfetch_type
);
150 if (Z_REFCOUNT_P(prop
)) {
151 zval_ptr_dtor(&prop
);
157 return (zend_object_iterator
*) iter
;
160 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
162 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
164 if (iter
->current_val
) {
165 zval_ptr_dtor(&iter
->current_val
);
166 iter
->current_val
= NULL
;
168 zval_ptr_dtor((zval
**) &iter
->zi
.data
);
172 static STATUS
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
174 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
175 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
177 if (PQresultStatus(obj
->res
) != PGRES_TUPLES_OK
) {
180 if (PQntuples(obj
->res
) <= iter
->index
) {
187 static zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type TSRMLS_DC
)
193 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
199 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
200 if (PQgetisnull(res
, row
, c
)) {
201 switch (fetch_type
) {
202 case PHP_PQRES_FETCH_OBJECT
:
203 add_property_null(data
, PQfname(res
, c
));
206 case PHP_PQRES_FETCH_ASSOC
:
207 add_assoc_null(data
, PQfname(res
, c
));
210 case PHP_PQRES_FETCH_ARRAY
:
211 add_index_null(data
, c
);
215 char *val
= PQgetvalue(res
, row
, c
);
216 int len
= PQgetlength(res
, row
, c
);
218 switch (fetch_type
) {
219 case PHP_PQRES_FETCH_OBJECT
:
220 add_property_stringl(data
, PQfname(res
, c
), val
, len
, 1);
223 case PHP_PQRES_FETCH_ASSOC
:
224 add_assoc_stringl(data
, PQfname(res
, c
), val
, len
, 1);
227 case PHP_PQRES_FETCH_ARRAY
:
228 add_index_stringl(data
, c
, val
, len
,1);
237 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
239 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
240 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
242 if (iter
->current_val
) {
243 zval_ptr_dtor(&iter
->current_val
);
245 iter
->current_val
= php_pqres_row_to_zval(obj
->res
, iter
->index
, iter
->fetch_type TSRMLS_CC
);
246 *data_ptr
= &iter
->current_val
;
249 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
251 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
253 *key_num
= (ulong
) iter
->index
;
255 return HASH_KEY_IS_LONG
;
258 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
260 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
265 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
267 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
272 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
273 php_pqres_iterator_dtor
,
274 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
275 php_pqres_iterator_valid
,
276 /* fetch the item data for the current element */
277 php_pqres_iterator_current
,
278 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
279 php_pqres_iterator_key
,
280 /* step forwards to next element */
281 php_pqres_iterator_next
,
282 /* rewind to start of data (optional, may be NULL) */
283 php_pqres_iterator_rewind
,
284 /* invalidate current value/key (optional, may be NULL) */
288 static void php_pqconn_object_free(void *o TSRMLS_DC
)
290 php_pqconn_object_t
*obj
= o
;
296 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
300 static void php_pqres_object_free(void *o TSRMLS_DC
)
302 php_pqres_object_t
*obj
= o
;
309 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
312 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
316 static void php_pqstm_object_free(void *o TSRMLS_DC
)
318 php_pqstm_object_t
*obj
= o
;
325 zval_ptr_dtor(&obj
->conn
);
328 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
332 static zend_object_value
php_pqconn_create_object_ex(zend_class_entry
*ce
, PGconn
*conn
, php_pqconn_object_t
**ptr TSRMLS_DC
)
334 zend_object_value ov
;
335 php_pqconn_object_t
*o
;
337 o
= ecalloc(1, sizeof(*o
));
338 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
339 object_properties_init((zend_object
*) o
, ce
);
347 o
->blocking
= !PQisnonblocking(o
->conn
);
350 ov
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqconn_object_free
, NULL TSRMLS_CC
);
351 ov
.handlers
= &php_pqconn_object_handlers
;
356 static zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, PGresult
*res
, php_pqres_object_t
**ptr TSRMLS_DC
)
358 zend_object_value ov
;
359 php_pqres_object_t
*o
;
361 o
= ecalloc(1, sizeof(*o
));
362 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
363 object_properties_init((zend_object
*) o
, ce
);
373 ov
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
374 ov
.handlers
= &php_pqres_object_handlers
;
379 static zend_object_value
php_pqstm_create_object_ex(zend_class_entry
*ce
, zval
*conn
, const char *name
, php_pqstm_object_t
**ptr TSRMLS_DC
)
381 zend_object_value ov
;
382 php_pqstm_object_t
*o
;
384 o
= ecalloc(1, sizeof(*o
));
385 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
386 object_properties_init((zend_object
*) o
, ce
);
398 o
->name
= estrdup(name
);
401 ov
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqstm_object_free
, NULL TSRMLS_CC
);
402 ov
.handlers
= &php_pqstm_object_handlers
;
407 static zend_object_value
php_pqconn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
409 return php_pqconn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
412 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
414 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
417 static zend_object_value
php_pqstm_create_object(zend_class_entry
*class_type TSRMLS_DC
)
419 return php_pqstm_create_object_ex(class_type
, NULL
, NULL
, NULL TSRMLS_CC
);
422 static HashTable php_pqconn_object_prophandlers
;
423 static HashTable php_pqres_object_prophandlers
;
424 static HashTable php_pqstm_object_prophandlers
;
426 typedef void (*php_pq_object_prophandler_func_t
)(void *o
, zval
*return_value TSRMLS_DC
);
428 typedef struct php_pq_object_prophandler
{
429 php_pq_object_prophandler_func_t read
;
430 php_pq_object_prophandler_func_t write
;
431 } php_pq_object_prophandler_t
;
433 static void php_pqconn_object_read_status(void *o
, zval
*return_value TSRMLS_DC
)
435 php_pqconn_object_t
*obj
= o
;
437 RETVAL_LONG(PQstatus(obj
->conn
));
440 static void php_pqconn_object_read_transaction_status(void *o
, zval
*return_value TSRMLS_DC
)
442 php_pqconn_object_t
*obj
= o
;
444 RETVAL_LONG(PQtransactionStatus(obj
->conn
));
447 static void php_pqconn_object_read_socket(void *o
, zval
*return_value TSRMLS_DC
)
449 php_pqconn_object_t
*obj
= o
;
451 int socket
= PQsocket(obj
->conn
);
453 if ((stream
= php_stream_fopen_from_fd(socket
, "r+b", NULL
))) {
454 php_stream_to_zval(stream
, return_value
);
460 static void php_pqconn_object_read_error_message(void *o
, zval
*return_value TSRMLS_DC
)
462 php_pqconn_object_t
*obj
= o
;
463 char *error
= PQerrorMessage(obj
->conn
);
466 RETVAL_STRING(error
, 1);
472 /* FIXME: extend to types->nspname->typname */
473 #define PHP_PQ_TYPES_QUERY \
474 "select t.oid, t.* " \
475 "from pg_type t join pg_namespace n on t.typnamespace=n.oid " \
476 "where typisdefined " \
478 "and nspname in ('public', 'pg_catalog')"
479 static void php_pqconn_object_read_types(void *o
, zval
*return_value TSRMLS_DC
)
481 php_pqconn_object_t
*obj
= o
;
482 PGresult
*res
= PQexec(obj
->conn
, PHP_PQ_TYPES_QUERY
);
484 /* FIXME: cache that */
486 if (PGRES_TUPLES_OK
== PQresultStatus(res
)) {
488 zval
*byoid
, *byname
;
490 MAKE_STD_ZVAL(byoid
);
491 MAKE_STD_ZVAL(byname
);
494 object_init(return_value
);
495 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
496 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
498 add_property_zval(byoid
, PQgetvalue(res
, r
, 0), row
);
499 add_property_zval(byname
, PQgetvalue(res
, r
, 1), row
);
503 add_property_zval(return_value
, "byOid", byoid
);
504 add_property_zval(return_value
, "byName", byname
);
505 zval_ptr_dtor(&byoid
);
506 zval_ptr_dtor(&byname
);
508 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types: %s", PQresultErrorMessage(res
));
512 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types: %s", PQerrorMessage(obj
->conn
));
516 static void php_pqres_object_read_status(void *o
, zval
*return_value TSRMLS_DC
)
518 php_pqres_object_t
*obj
= o
;
520 RETVAL_LONG(PQresultStatus(obj
->res
));
523 static void php_pqres_object_read_error_message(void *o
, zval
*return_value TSRMLS_DC
)
525 php_pqres_object_t
*obj
= o
;
526 char *error
= PQresultErrorMessage(obj
->res
);
529 RETVAL_STRING(error
, 1);
535 static void php_pqres_object_read_num_rows(void *o
, zval
*return_value TSRMLS_DC
)
537 php_pqres_object_t
*obj
= o
;
539 RETVAL_LONG(PQntuples(obj
->res
));
542 static void php_pqres_object_read_num_cols(void *o
, zval
*return_value TSRMLS_DC
)
544 php_pqres_object_t
*obj
= o
;
546 RETVAL_LONG(PQnfields(obj
->res
));
549 static void php_pqres_object_read_affected_rows(void *o
, zval
*return_value TSRMLS_DC
)
551 php_pqres_object_t
*obj
= o
;
553 RETVAL_LONG(atoi(PQcmdTuples(obj
->res
)));
556 static void php_pqres_object_read_fetch_type(void *o
, zval
*return_value TSRMLS_DC
)
558 php_pqres_object_t
*obj
= o
;
561 RETVAL_LONG(obj
->iter
->fetch_type
);
563 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
567 static void php_pqres_object_write_fetch_type(void *o
, zval
*value TSRMLS_DC
)
569 php_pqres_object_t
*obj
= o
;
570 zval
*zfetch_type
= value
;
572 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
573 convert_to_long_ex(&zfetch_type
);
576 obj
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
578 if (zfetch_type
!= value
) {
579 zval_ptr_dtor(&zfetch_type
);
583 static void php_pqstm_object_read_name(void *o
, zval
*return_value TSRMLS_DC
)
585 php_pqstm_object_t
*obj
= o
;
587 RETVAL_STRING(obj
->name
, 1);
590 static void php_pqstm_object_read_connection(void *o
, zval
*return_value TSRMLS_DC
)
592 php_pqstm_object_t
*obj
= o
;
594 RETVAL_ZVAL(obj
->conn
, 1, 0);
597 static zval
*php_pqconn_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
599 php_pqconn_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
600 php_pq_object_prophandler_t
*handler
;
604 zend_error(E_WARNING
, "Connection not initialized");
605 } else if (SUCCESS
== zend_hash_find(&php_pqconn_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
606 if (type
== BP_VAR_R
) {
607 ALLOC_ZVAL(return_value
);
608 Z_SET_REFCOUNT_P(return_value
, 0);
609 Z_UNSET_ISREF_P(return_value
);
611 handler
->read(obj
, return_value TSRMLS_CC
);
613 zend_error(E_ERROR
, "Cannot access pq\\Connection properties by reference or array key/index");
617 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
623 static void php_pqconn_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
625 php_pqconn_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
626 php_pq_object_prophandler_t
*handler
;
628 if (SUCCESS
== zend_hash_find(&php_pqconn_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
629 if (handler
->write
) {
630 handler
->write(obj
, value TSRMLS_CC
);
633 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
637 static zval
*php_pqres_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
639 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
640 php_pq_object_prophandler_t
*handler
;
644 zend_error(E_WARNING
, "Result not initialized");
645 } else if (SUCCESS
== zend_hash_find(&php_pqres_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
646 if (type
== BP_VAR_R
) {
647 ALLOC_ZVAL(return_value
);
648 Z_SET_REFCOUNT_P(return_value
, 0);
649 Z_UNSET_ISREF_P(return_value
);
651 handler
->read(obj
, return_value TSRMLS_CC
);
653 zend_error(E_ERROR
, "Cannot access pq\\Result properties by reference or array key/index");
657 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
663 static void php_pqres_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
665 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
666 php_pq_object_prophandler_t
*handler
;
669 zend_error(E_WARNING
, "Result not initialized");
670 } else if (SUCCESS
== zend_hash_find(&php_pqres_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
671 if (handler
->write
) {
672 /* ensure obj->iter is initialized, for e.g. write_fetch_type */
674 obj
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
675 obj
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
677 handler
->write(obj
, value TSRMLS_CC
);
680 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
684 static zval
*php_pqstm_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
686 php_pqstm_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
687 php_pq_object_prophandler_t
*handler
;
691 zend_error(E_WARNING
, "Statement not initialized");
692 } else if (SUCCESS
== zend_hash_find(&php_pqstm_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
693 if (type
== BP_VAR_R
) {
694 ALLOC_ZVAL(return_value
);
695 Z_SET_REFCOUNT_P(return_value
, 0);
696 Z_UNSET_ISREF_P(return_value
);
698 handler
->read(obj
, return_value TSRMLS_CC
);
700 zend_error(E_ERROR
, "Cannot access pq\\Statement properties by reference or array key/index");
704 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
710 static void php_pqstm_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
712 php_pqstm_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
713 php_pq_object_prophandler_t
*handler
;
716 zend_error(E_WARNING
, "Result not initialized");
717 } else if (SUCCESS
== zend_hash_find(&php_pqstm_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
718 if (handler
->write
) {
719 handler
->write(obj
, value TSRMLS_CC
);
722 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
726 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
727 ZEND_ARG_INFO(0, dsn
)
728 ZEND_ARG_INFO(0, block
)
730 static PHP_METHOD(pqconn
, __construct
) {
731 zend_error_handling zeh
;
736 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
737 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|b", &dsn_str
, &dsn_len
, &block
)) {
738 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
743 if ((obj
->blocking
= block
)) {
744 obj
->conn
= PQconnectdb(dsn_str
);
746 obj
->conn
= PQconnectStart(dsn_str
);
747 obj
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
750 if (CONNECTION_BAD
== PQstatus(obj
->conn
)) {
751 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed: %s", PQerrorMessage(obj
->conn
));
754 zend_restore_error_handling(&zeh TSRMLS_CC
);
757 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
759 static PHP_METHOD(pqconn
, reset
) {
760 if (SUCCESS
== zend_parse_parameters_none()) {
761 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
766 RETURN_TRUE
; /* probably ;) */
767 } if (PQresetStart(obj
->conn
)) {
768 obj
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
772 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
778 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
780 static PHP_METHOD(pqconn
, poll
) {
781 if (SUCCESS
== zend_parse_parameters_none()) {
782 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
786 RETURN_LONG(obj
->poller(obj
->conn
));
788 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
791 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
797 static STATUS
php_pqres_success(PGresult
*res TSRMLS_DC
)
799 switch (PQresultStatus(res
)) {
800 case PGRES_BAD_RESPONSE
:
801 case PGRES_NONFATAL_ERROR
:
802 case PGRES_FATAL_ERROR
:
803 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "%s: %s", PQresStatus(PQresultStatus(res
)), PQresultErrorMessage(res
));
810 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
811 ZEND_ARG_INFO(0, query
)
813 static PHP_METHOD(pqconn
, exec
) {
814 zend_error_handling zeh
;
818 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
819 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
820 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
823 PGresult
*res
= PQexec(obj
->conn
, query_str
);
826 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
827 return_value
->type
= IS_OBJECT
;
828 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
831 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query: %s", PQerrorMessage(obj
->conn
));
834 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
837 zend_restore_error_handling(&zeh TSRMLS_CC
);
840 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
845 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
846 convert_to_long_ex(ztype
);
849 **types
= Z_LVAL_PP(ztype
);
852 if (*ztype
!= *(zval
**)p
) {
853 zval_ptr_dtor(ztype
);
855 return ZEND_HASH_APPLY_KEEP
;
858 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
864 params
= (char ***) va_arg(argv
, char ***);
865 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
867 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
871 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
872 convert_to_string_ex(zparam
);
875 **params
= Z_STRVAL_PP(zparam
);
878 if (*zparam
!= *(zval
**)p
) {
879 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
882 return ZEND_HASH_APPLY_KEEP
;
885 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
886 ZEND_ARG_INFO(0, query
)
887 ZEND_ARG_ARRAY_INFO(0, params
, 0)
888 ZEND_ARG_ARRAY_INFO(0, types
, 1)
890 static PHP_METHOD(pqconn
, execParams
) {
891 zend_error_handling zeh
;
897 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
898 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
899 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
905 char **params
= NULL
;
908 ZEND_INIT_SYMTABLE(&zdtor
);
910 if (ztypes
&& zend_hash_num_elements(Z_ARRVAL_P(ztypes
))) {
913 tmp
= types
= ecalloc(zend_hash_num_elements(Z_ARRVAL_P(ztypes
)), sizeof(Oid
));
914 zend_hash_apply_with_argument(Z_ARRVAL_P(ztypes
), apply_to_oid
, &tmp TSRMLS_CC
);
916 if ((count
= zend_hash_num_elements(Z_ARRVAL_P(zparams
)))) {
919 tmp
= params
= ecalloc(zend_hash_num_elements(Z_ARRVAL_P(zparams
)), sizeof(char *));
920 zend_hash_apply_with_arguments(Z_ARRVAL_P(zparams
) TSRMLS_CC
, apply_to_param
, 2, &tmp
, &zdtor
);
923 res
= PQexecParams(obj
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0);
925 zend_hash_destroy(&zdtor
);
934 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
935 return_value
->type
= IS_OBJECT
;
936 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
939 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query: %s", PQerrorMessage(obj
->conn
));
942 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
945 zend_restore_error_handling(&zeh TSRMLS_CC
);
948 static STATUS
php_pqconn_prepare(PGconn
*conn
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
954 if (typest
&& (count
= zend_hash_num_elements(typest
))) {
957 tmp
= types
= ecalloc(count
, sizeof(Oid
));
958 zend_hash_apply_with_argument(typest
, apply_to_oid
, &tmp TSRMLS_CC
);
961 res
= PQprepare(conn
, name
, query
, count
, types
);
968 if (PGRES_COMMAND_OK
== PQresultStatus(res
)) {
971 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement: %s", PQresultErrorMessage(res
));
975 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement: %s", PQerrorMessage(conn
));
980 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
981 ZEND_ARG_INFO(0, "name")
982 ZEND_ARG_INFO(0, "query")
983 ZEND_ARG_ARRAY_INFO(0, "types", 1)
985 static PHP_METHOD(pqconn
, prepare
) {
986 zend_error_handling zeh
;
988 char *name_str
, *query_str
;
989 int name_len
, *query_len
;
991 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
992 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
993 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
996 if (SUCCESS
== php_pqconn_prepare(obj
->conn
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
997 return_value
->type
= IS_OBJECT
;
998 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, getThis(), name_str
, NULL TSRMLS_CC
);
1001 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1006 static zend_function_entry php_pqconn_methods
[] = {
1007 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
1008 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
1009 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
1010 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
1011 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
1012 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
1016 static zval
**php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type TSRMLS_DC
)
1019 php_pqres_fetch_t orig_fetch
;
1022 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1026 obj
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
1027 obj
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
1029 orig_fetch
= obj
->iter
->fetch_type
;
1030 obj
->iter
->fetch_type
= fetch_type
;
1031 if (SUCCESS
== obj
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->iter TSRMLS_CC
)) {
1032 obj
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->iter
, &row TSRMLS_CC
);
1033 obj
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
1035 obj
->iter
->fetch_type
= orig_fetch
;
1037 return row
? row
: NULL
;
1040 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
1041 ZEND_ARG_INFO(0, fetch_type
)
1042 ZEND_END_ARG_INFO();
1043 static PHP_METHOD(pqres
, fetchRow
) {
1044 zend_error_handling zeh
;
1045 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1046 long fetch_type
= obj
->iter
? obj
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
1048 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1049 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
1050 zval
**row
= php_pqres_iteration(getThis(), obj
, fetch_type TSRMLS_CC
);
1053 RETVAL_ZVAL(*row
, 1, 0);
1058 zend_restore_error_handling(&zeh TSRMLS_CC
);
1061 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
1064 HashTable
*ht
= HASH_OF(row
);
1065 int count
= zend_hash_num_elements(ht
);
1068 zend_hash_internal_pointer_reset(ht
);
1070 zend_hash_move_forward(ht
);
1072 zend_hash_get_current_data(ht
, (void *) &data
);
1074 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d does excess column count %d", col
, count
);
1079 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 0)
1080 ZEND_ARG_INFO(0, col_num
)
1081 ZEND_END_ARG_INFO();
1082 static PHP_METHOD(pqres
, fetchCol
) {
1083 zend_error_handling zeh
;
1086 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1087 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_col
)) {
1088 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1089 zval
**row
= php_pqres_iteration(getThis(), obj
, obj
->iter
? obj
->iter
->fetch_type
: 0 TSRMLS_CC
);
1092 zval
**col
= column_at(*row
, fetch_col TSRMLS_CC
);
1095 RETVAL_ZVAL(*col
, 1, 0);
1103 zend_restore_error_handling(&zeh TSRMLS_CC
);
1107 static zend_function_entry php_pqres_methods
[] = {
1108 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
1109 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
1113 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
1114 ZEND_ARG_OBJ_INFO(0, "Connection", "pq\\Connection", 0)
1115 ZEND_ARG_INFO(0, "name")
1116 ZEND_ARG_INFO(0, "query")
1117 ZEND_ARG_ARRAY_INFO(0, "types", 1)
1118 ZEND_END_ARG_INFO();
1119 static PHP_METHOD(pqstm
, __construct
) {
1120 zend_error_handling zeh
;
1121 zval
*zconn
, *ztypes
= NULL
;
1122 char *name_str
, *query_str
;
1123 int name_len
, *query_len
;
1125 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1126 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Oss|a/!", &zconn
, php_pqconn_class_entry
, &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
1127 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1128 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1130 if (conn_obj
->conn
) {
1131 if (SUCCESS
== php_pqconn_prepare(conn_obj
->conn
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
1134 obj
->name
= estrdup(name_str
);
1137 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1142 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
1143 ZEND_ARG_ARRAY_INFO(0, "params", 1)
1144 ZEND_END_ARG_INFO();
1145 static PHP_METHOD(pqstm
, exec
) {
1146 zend_error_handling zeh
;
1147 zval
*zparams
= NULL
;
1149 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1150 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
1151 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1153 if (obj
->conn
&& obj
->name
) {
1154 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(obj
->conn TSRMLS_CC
);
1156 if (conn_obj
->conn
) {
1158 char **params
= NULL
;
1162 ZEND_INIT_SYMTABLE(&zdtor
);
1164 if (zparams
&& (count
= zend_hash_num_elements(Z_ARRVAL_P(zparams
)))) {
1167 tmp
= params
= ecalloc(count
, sizeof(char *));
1168 zend_hash_apply_with_arguments(Z_ARRVAL_P(zparams
) TSRMLS_CC
, apply_to_param
, 2, &tmp
, &zdtor
);
1171 res
= PQexecPrepared(conn_obj
->conn
, obj
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0);
1176 zend_hash_destroy(&zdtor
);
1179 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1180 return_value
->type
= IS_OBJECT
;
1181 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
1184 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement: %s", PQerrorMessage(conn_obj
->conn
));
1187 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1190 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Statement not initialized");
1193 zend_restore_error_handling(&zeh TSRMLS_CC
);
1196 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc
, 0, 0, 0)
1197 ZEND_END_ARG_INFO();
1198 static PHP_METHOD(pqstm
, desc
) {
1199 zend_error_handling zeh
;
1201 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1202 if (SUCCESS
== zend_parse_parameters_none()) {
1203 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1205 if (obj
->conn
&& obj
->name
) {
1206 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(obj
->conn TSRMLS_CC
);
1208 if (conn_obj
->conn
) {
1209 PGresult
*res
= PQdescribePrepared(conn_obj
->conn
, obj
->name
);
1212 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1215 array_init(return_value
);
1216 for (p
= 0, params
= PQnparams(res
); p
< params
; ++p
) {
1217 add_next_index_long(return_value
, PQparamtype(res
, p
));
1221 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement: %s", PQerrorMessage(conn_obj
->conn
));
1224 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1227 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Statement not initialized");
1230 zend_restore_error_handling(&zeh TSRMLS_CC
);
1233 static zend_function_entry php_pqstm_methods
[] = {
1234 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
1235 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
1236 PHP_ME(pqstm
, desc
, ai_pqstm_desc
, ZEND_ACC_PUBLIC
)
1240 /* {{{ PHP_MINIT_FUNCTION
1242 PHP_MINIT_FUNCTION(pq
)
1244 zend_class_entry ce
= {0};
1245 php_pq_object_prophandler_t ph
= {0};
1247 zend_hash_init(&php_pqconn_object_prophandlers
, 1, NULL
, NULL
, 1);
1248 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
1249 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1250 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
1251 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1252 php_pqconn_object_handlers
.read_property
= php_pqconn_object_read_prop
;
1253 php_pqconn_object_handlers
.write_property
= php_pqconn_object_write_prop
;
1255 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1256 ph
.read
= php_pqconn_object_read_status
;
1257 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
1259 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1260 ph
.read
= php_pqconn_object_read_transaction_status
;
1261 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
1263 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1264 ph
.read
= php_pqconn_object_read_socket
;
1265 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
1267 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1268 ph
.read
= php_pqconn_object_read_error_message
;
1269 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
1271 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("types"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1272 ph
.read
= php_pqconn_object_read_types
;
1273 zend_hash_add(&php_pqconn_object_prophandlers
, "types", sizeof("types"), (void *) &ph
, sizeof(ph
), NULL
);
1275 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
1276 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
1277 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
1278 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
1279 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
1280 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
1281 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
1282 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
1284 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
1285 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
1286 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
1287 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
1288 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
1290 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
1291 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
1292 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
1293 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
1295 zend_hash_init(&php_pqres_object_prophandlers
, 1, NULL
, NULL
, 1);
1296 memset(&ce
, 0, sizeof(ce
));
1297 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
1298 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1299 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
1300 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
1301 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
1303 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1304 php_pqres_object_handlers
.read_property
= php_pqres_object_read_prop
;
1305 php_pqres_object_handlers
.write_property
= php_pqres_object_write_prop
;
1307 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1308 ph
.read
= php_pqres_object_read_status
;
1309 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
1311 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1312 ph
.read
= php_pqres_object_read_error_message
;
1313 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
1315 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1316 ph
.read
= php_pqres_object_read_num_rows
;
1317 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
1319 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1320 ph
.read
= php_pqres_object_read_num_cols
;
1321 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
1323 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1324 ph
.read
= php_pqres_object_read_affected_rows
;
1325 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
1327 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1328 ph
.read
= php_pqres_object_read_fetch_type
;
1329 ph
.write
= php_pqres_object_write_fetch_type
;
1330 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
1333 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
1334 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
1335 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
1336 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
1337 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
1338 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
1339 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
1340 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
1341 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
1342 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
1344 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
1345 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
1346 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
1348 zend_hash_init(&php_pqstm_object_prophandlers
, 1, NULL
, NULL
, 1);
1349 memset(&ce
, 0, sizeof(ce
));
1350 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
1351 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1352 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
1354 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1355 php_pqstm_object_handlers
.read_property
= php_pqstm_object_read_prop
;
1356 php_pqstm_object_handlers
.write_property
= php_pqstm_object_write_prop
;
1358 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1359 ph
.read
= php_pqstm_object_read_name
;
1360 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
1362 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1363 ph
.read
= php_pqstm_object_read_connection
;
1364 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
1367 REGISTER_INI_ENTRIES();
1373 /* {{{ PHP_MSHUTDOWN_FUNCTION
1375 PHP_MSHUTDOWN_FUNCTION(pq
)
1377 /* uncomment this line if you have INI entries
1378 UNREGISTER_INI_ENTRIES();
1384 /* {{{ PHP_MINFO_FUNCTION
1386 PHP_MINFO_FUNCTION(pq
)
1388 php_info_print_table_start();
1389 php_info_print_table_header(2, "pq support", "enabled");
1390 php_info_print_table_end();
1392 /* Remove comments if you have entries in php.ini
1393 DISPLAY_INI_ENTRIES();
1405 * vim600: noet sw=4 ts=4 fdm=marker
1406 * vim<600: noet sw=4 ts=4