2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2013, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
18 #include <Zend/zend_interfaces.h>
19 #include <ext/standard/info.h>
20 #include <ext/spl/spl_array.h>
22 #include <libpq-events.h>
26 typedef int STATUS
; /* SUCCESS/FAILURE */
29 ZEND_DECLARE_MODULE_GLOBALS(pq)
32 const zend_function_entry pq_functions
[] = {
36 /* {{{ pq_module_entry
38 zend_module_entry pq_module_entry
= {
39 STANDARD_MODULE_HEADER
,
44 NULL
,/*PHP_RINIT(pq),*/
45 NULL
,/*PHP_RSHUTDOWN(pq),*/
48 STANDARD_MODULE_PROPERTIES
58 /* Remove comments and fill if you need to have entries in php.ini
60 STD_PHP_INI_ENTRY("pq.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_pq_globals, pq_globals)
61 STD_PHP_INI_ENTRY("pq.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_pq_globals, pq_globals)
66 /* {{{ php_pq_init_globals
68 /* Uncomment this function if you have INI entries
69 static void php_pq_init_globals(zend_pq_globals *pq_globals)
71 pq_globals->global_value = 0;
72 pq_globals->global_string = NULL;
77 static zend_class_entry
*php_pqconn_class_entry
;
78 static zend_class_entry
*php_pqres_class_entry
;
79 static zend_class_entry
*php_pqstm_class_entry
;
81 static zend_object_handlers php_pqconn_object_handlers
;
82 static zend_object_handlers php_pqres_object_handlers
;
83 static zend_object_handlers php_pqstm_object_handlers
;
85 typedef struct php_pqconn_object
{
88 int (*poller
)(PGconn
*);
90 } php_pqconn_object_t
;
92 typedef enum php_pqres_fetch
{
93 PHP_PQRES_FETCH_ARRAY
,
94 PHP_PQRES_FETCH_ASSOC
,
95 PHP_PQRES_FETCH_OBJECT
98 typedef struct php_pqres_iterator
{
99 zend_object_iterator zi
;
102 php_pqres_fetch_t fetch_type
;
103 } php_pqres_iterator_t
;
105 typedef struct php_pqres_object
{
108 php_pqres_iterator_t
*iter
;
109 } php_pqres_object_t
;
111 typedef struct php_pqstm_intern
{
114 } php_pqstm_intern_t
;
116 typedef struct php_pqstm_object
{
120 } php_pqstm_object_t
;
122 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
124 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
126 php_pqres_iterator_t
*iter
;
127 zval
*prop
, *zfetch_type
;
129 iter
= ecalloc(1, sizeof(*iter
));
130 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
131 iter
->zi
.data
= object
;
134 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
135 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
136 convert_to_long_ex(&zfetch_type
);
138 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
139 if (zfetch_type
!= prop
) {
140 zval_ptr_dtor(&zfetch_type
);
142 if (Z_REFCOUNT_P(prop
)) {
143 zval_ptr_dtor(&prop
);
149 return (zend_object_iterator
*) iter
;
152 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
154 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
156 if (iter
->current_val
) {
157 zval_ptr_dtor(&iter
->current_val
);
158 iter
->current_val
= NULL
;
160 zval_ptr_dtor((zval
**) &iter
->zi
.data
);
164 static STATUS
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
166 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
167 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
169 if (PQresultStatus(obj
->res
) != PGRES_TUPLES_OK
) {
172 if (PQntuples(obj
->res
) <= iter
->index
) {
179 static zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type TSRMLS_DC
)
185 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
191 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
192 if (PQgetisnull(res
, row
, c
)) {
193 switch (fetch_type
) {
194 case PHP_PQRES_FETCH_OBJECT
:
195 add_property_null(data
, PQfname(res
, c
));
198 case PHP_PQRES_FETCH_ASSOC
:
199 add_assoc_null(data
, PQfname(res
, c
));
202 case PHP_PQRES_FETCH_ARRAY
:
203 add_index_null(data
, c
);
207 char *val
= PQgetvalue(res
, row
, c
);
208 int len
= PQgetlength(res
, row
, c
);
210 switch (fetch_type
) {
211 case PHP_PQRES_FETCH_OBJECT
:
212 add_property_stringl(data
, PQfname(res
, c
), val
, len
, 1);
215 case PHP_PQRES_FETCH_ASSOC
:
216 add_assoc_stringl(data
, PQfname(res
, c
), val
, len
, 1);
219 case PHP_PQRES_FETCH_ARRAY
:
220 add_index_stringl(data
, c
, val
, len
,1);
229 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
231 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
232 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
234 if (iter
->current_val
) {
235 zval_ptr_dtor(&iter
->current_val
);
237 iter
->current_val
= php_pqres_row_to_zval(obj
->res
, iter
->index
, iter
->fetch_type TSRMLS_CC
);
238 *data_ptr
= &iter
->current_val
;
241 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
243 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
245 *key_num
= (ulong
) iter
->index
;
247 return HASH_KEY_IS_LONG
;
250 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
252 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
257 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
259 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
264 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
265 php_pqres_iterator_dtor
,
266 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
267 php_pqres_iterator_valid
,
268 /* fetch the item data for the current element */
269 php_pqres_iterator_current
,
270 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
271 php_pqres_iterator_key
,
272 /* step forwards to next element */
273 php_pqres_iterator_next
,
274 /* rewind to start of data (optional, may be NULL) */
275 php_pqres_iterator_rewind
,
276 /* invalidate current value/key (optional, may be NULL) */
280 static void php_pqconn_object_free(void *o TSRMLS_DC
)
282 php_pqconn_object_t
*obj
= o
;
288 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
292 static void php_pqres_object_free(void *o TSRMLS_DC
)
294 php_pqres_object_t
*obj
= o
;
301 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
304 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
308 static void php_pqstm_object_free(void *o TSRMLS_DC
)
310 php_pqstm_object_t
*obj
= o
;
317 zval_ptr_dtor(&obj
->conn
);
320 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
324 static zend_object_value
php_pqconn_create_object_ex(zend_class_entry
*ce
, PGconn
*conn
, php_pqconn_object_t
**ptr TSRMLS_DC
)
326 zend_object_value ov
;
327 php_pqconn_object_t
*o
;
329 o
= ecalloc(1, sizeof(*o
));
330 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
331 object_properties_init((zend_object
*) o
, ce
);
339 o
->async
= !PQisnonblocking(o
->conn
);
342 ov
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqconn_object_free
, NULL TSRMLS_CC
);
343 ov
.handlers
= &php_pqconn_object_handlers
;
348 static zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, PGresult
*res
, php_pqres_object_t
**ptr TSRMLS_DC
)
350 zend_object_value ov
;
351 php_pqres_object_t
*o
;
353 o
= ecalloc(1, sizeof(*o
));
354 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
355 object_properties_init((zend_object
*) o
, ce
);
365 ov
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
366 ov
.handlers
= &php_pqres_object_handlers
;
371 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
)
373 zend_object_value ov
;
374 php_pqstm_object_t
*o
;
376 o
= ecalloc(1, sizeof(*o
));
377 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
378 object_properties_init((zend_object
*) o
, ce
);
390 o
->name
= estrdup(name
);
393 ov
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqstm_object_free
, NULL TSRMLS_CC
);
394 ov
.handlers
= &php_pqstm_object_handlers
;
399 static zend_object_value
php_pqconn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
401 return php_pqconn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
404 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
406 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
409 static zend_object_value
php_pqstm_create_object(zend_class_entry
*class_type TSRMLS_DC
)
411 return php_pqstm_create_object_ex(class_type
, NULL
, NULL
, NULL TSRMLS_CC
);
414 static HashTable php_pqconn_object_prophandlers
;
415 static HashTable php_pqres_object_prophandlers
;
416 static HashTable php_pqstm_object_prophandlers
;
418 typedef void (*php_pq_object_prophandler_func_t
)(void *o
, zval
*return_value TSRMLS_DC
);
420 typedef struct php_pq_object_prophandler
{
421 php_pq_object_prophandler_func_t read
;
422 php_pq_object_prophandler_func_t write
;
423 } php_pq_object_prophandler_t
;
425 static void php_pqconn_object_read_status(void *o
, zval
*return_value TSRMLS_DC
)
427 php_pqconn_object_t
*obj
= o
;
429 RETVAL_LONG(PQstatus(obj
->conn
));
432 static void php_pqconn_object_read_transaction_status(void *o
, zval
*return_value TSRMLS_DC
)
434 php_pqconn_object_t
*obj
= o
;
436 RETVAL_LONG(PQtransactionStatus(obj
->conn
));
439 static void php_pqconn_object_read_error_message(void *o
, zval
*return_value TSRMLS_DC
)
441 php_pqconn_object_t
*obj
= o
;
442 char *error
= PQerrorMessage(obj
->conn
);
445 RETVAL_STRING(error
, 1);
451 /* FIXME: extend to types->nspname->typname */
452 #define PHP_PQ_TYPES_QUERY \
453 "select t.oid, t.* " \
454 "from pg_type t join pg_namespace n on t.typnamespace=n.oid " \
455 "where typisdefined " \
457 "and nspname in ('public', 'pg_catalog')"
458 static void php_pqconn_object_read_types(void *o
, zval
*return_value TSRMLS_DC
)
460 php_pqconn_object_t
*obj
= o
;
461 PGresult
*res
= PQexec(obj
->conn
, PHP_PQ_TYPES_QUERY
);
463 /* FIXME: cache that */
465 if (PGRES_TUPLES_OK
== PQresultStatus(res
)) {
467 zval
*byoid
, *byname
;
469 MAKE_STD_ZVAL(byoid
);
470 MAKE_STD_ZVAL(byname
);
473 object_init(return_value
);
474 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
475 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
477 add_property_zval(byoid
, PQgetvalue(res
, r
, 0), row
);
478 add_property_zval(byname
, PQgetvalue(res
, r
, 1), row
);
482 add_property_zval(return_value
, "byOid", byoid
);
483 add_property_zval(return_value
, "byName", byname
);
484 zval_ptr_dtor(&byoid
);
485 zval_ptr_dtor(&byname
);
487 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types: %s", PQresultErrorMessage(res
));
491 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types: %s", PQerrorMessage(obj
->conn
));
495 static void php_pqres_object_read_status(void *o
, zval
*return_value TSRMLS_DC
)
497 php_pqres_object_t
*obj
= o
;
499 RETVAL_LONG(PQresultStatus(obj
->res
));
502 static void php_pqres_object_read_error_message(void *o
, zval
*return_value TSRMLS_DC
)
504 php_pqres_object_t
*obj
= o
;
505 char *error
= PQresultErrorMessage(obj
->res
);
508 RETVAL_STRING(error
, 1);
514 static void php_pqres_object_read_num_rows(void *o
, zval
*return_value TSRMLS_DC
)
516 php_pqres_object_t
*obj
= o
;
518 RETVAL_LONG(PQntuples(obj
->res
));
521 static void php_pqres_object_read_num_cols(void *o
, zval
*return_value TSRMLS_DC
)
523 php_pqres_object_t
*obj
= o
;
525 RETVAL_LONG(PQnfields(obj
->res
));
528 static void php_pqres_object_read_affected_rows(void *o
, zval
*return_value TSRMLS_DC
)
530 php_pqres_object_t
*obj
= o
;
532 RETVAL_LONG(atoi(PQcmdTuples(obj
->res
)));
535 static void php_pqres_object_read_fetch_type(void *o
, zval
*return_value TSRMLS_DC
)
537 php_pqres_object_t
*obj
= o
;
540 RETVAL_LONG(obj
->iter
->fetch_type
);
542 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
546 static void php_pqres_object_write_fetch_type(void *o
, zval
*value TSRMLS_DC
)
548 php_pqres_object_t
*obj
= o
;
549 zval
*zfetch_type
= value
;
551 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
552 convert_to_long_ex(&zfetch_type
);
555 obj
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
557 if (zfetch_type
!= value
) {
558 zval_ptr_dtor(&zfetch_type
);
562 static void php_pqstm_object_read_name(void *o
, zval
*return_value TSRMLS_DC
)
564 php_pqstm_object_t
*obj
= o
;
566 RETVAL_STRING(obj
->name
, 1);
569 static void php_pqstm_object_read_connection(void *o
, zval
*return_value TSRMLS_DC
)
571 php_pqstm_object_t
*obj
= o
;
573 RETVAL_ZVAL(obj
->conn
, 1, 0);
576 static zval
*php_pqconn_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
578 php_pqconn_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
579 php_pq_object_prophandler_t
*handler
;
583 zend_error(E_WARNING
, "Connection not initialized");
584 } else if ((SUCCESS
== zend_hash_find(&php_pqconn_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) && handler
->read
) {
585 if (type
== BP_VAR_R
) {
586 ALLOC_ZVAL(return_value
);
587 Z_SET_REFCOUNT_P(return_value
, 0);
588 Z_UNSET_ISREF_P(return_value
);
590 handler
->read(obj
, return_value TSRMLS_CC
);
592 zend_error(E_ERROR
, "Cannot access pq\\Connection properties by reference or array key/index");
596 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
602 static void php_pqconn_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
604 php_pqconn_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
605 php_pq_object_prophandler_t
*handler
;
607 if (SUCCESS
== zend_hash_find(&php_pqconn_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
608 if (handler
->write
) {
609 handler
->write(obj
, value TSRMLS_CC
);
612 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
616 static zval
*php_pqres_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
618 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
619 php_pq_object_prophandler_t
*handler
;
623 zend_error(E_WARNING
, "Result not initialized");
624 } else if (SUCCESS
== zend_hash_find(&php_pqres_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
625 if (type
== BP_VAR_R
) {
626 ALLOC_ZVAL(return_value
);
627 Z_SET_REFCOUNT_P(return_value
, 0);
628 Z_UNSET_ISREF_P(return_value
);
630 handler
->read(obj
, return_value TSRMLS_CC
);
632 zend_error(E_ERROR
, "Cannot access pq\\Result properties by reference or array key/index");
636 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
642 static void php_pqres_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
644 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
645 php_pq_object_prophandler_t
*handler
;
648 zend_error(E_WARNING
, "Result not initialized");
649 } else if (SUCCESS
== zend_hash_find(&php_pqres_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
650 if (handler
->write
) {
651 /* ensure obj->iter is initialized, for e.g. write_fetch_type */
653 obj
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
654 obj
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
656 handler
->write(obj
, value TSRMLS_CC
);
659 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
663 static zval
*php_pqstm_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
665 php_pqstm_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
666 php_pq_object_prophandler_t
*handler
;
670 zend_error(E_WARNING
, "Statement not initialized");
671 } else if (SUCCESS
== zend_hash_find(&php_pqstm_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
672 if (type
== BP_VAR_R
) {
673 ALLOC_ZVAL(return_value
);
674 Z_SET_REFCOUNT_P(return_value
, 0);
675 Z_UNSET_ISREF_P(return_value
);
677 handler
->read(obj
, return_value TSRMLS_CC
);
679 zend_error(E_ERROR
, "Cannot access pq\\Statement properties by reference or array key/index");
683 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
689 static void php_pqstm_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
691 php_pqstm_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
692 php_pq_object_prophandler_t
*handler
;
695 zend_error(E_WARNING
, "Result not initialized");
696 } else if (SUCCESS
== zend_hash_find(&php_pqstm_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
697 if (handler
->write
) {
698 handler
->write(obj
, value TSRMLS_CC
);
701 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
705 static STATUS
php_pqconn_update_socket(zval
*this_ptr
, php_pqconn_object_t
*obj TSRMLS_DC
)
707 zval
*zsocket
, zmember
;
713 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
716 INIT_PZVAL(&zmember
);
717 ZVAL_STRINGL(&zmember
, "socket", sizeof("socket")-1, 0);
718 MAKE_STD_ZVAL(zsocket
);
720 if ((CONNECTION_BAD
!= PQstatus(obj
->conn
))
721 && (-1 < (socket
= PQsocket(obj
->conn
)))
722 && (stream
= php_stream_fopen_from_fd(socket
, "r+b", NULL
))) {
723 php_stream_to_zval(stream
, zsocket
);
729 zend_get_std_object_handlers()->write_property(getThis(), &zmember
, zsocket
, NULL TSRMLS_CC
);
730 zval_ptr_dtor(&zsocket
);
735 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
736 ZEND_ARG_INFO(0, dsn
)
737 ZEND_ARG_INFO(0, async
)
739 static PHP_METHOD(pqconn
, __construct
) {
740 zend_error_handling zeh
;
745 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
746 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|b", &dsn_str
, &dsn_len
, &async
)) {
747 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
752 if ((obj
->async
= async
)) {
753 obj
->conn
= PQconnectStart(dsn_str
);
754 obj
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
756 obj
->conn
= PQconnectdb(dsn_str
);
759 if (SUCCESS
!= php_pqconn_update_socket(getThis(), obj TSRMLS_CC
)) {
760 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed: %s", PQerrorMessage(obj
->conn
));
763 zend_restore_error_handling(&zeh TSRMLS_CC
);
766 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
768 static PHP_METHOD(pqconn
, reset
) {
769 if (SUCCESS
== zend_parse_parameters_none()) {
770 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
774 if (PQresetStart(obj
->conn
)) {
775 obj
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
781 if (CONNECTION_OK
== PQstatus(obj
->conn
)) {
784 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection reset failed: %s", PQerrorMessage(obj
->conn
));
788 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
794 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
796 static PHP_METHOD(pqconn
, poll
) {
797 if (SUCCESS
== zend_parse_parameters_none()) {
798 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
802 if (obj
->poller
== PQconsumeInput
) {
803 RETURN_LONG(obj
->poller(obj
->conn
) * PGRES_POLLING_OK
);
805 RETURN_LONG(obj
->poller(obj
->conn
));
808 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
811 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
817 static STATUS
php_pqres_success(PGresult
*res TSRMLS_DC
)
819 switch (PQresultStatus(res
)) {
820 case PGRES_BAD_RESPONSE
:
821 case PGRES_NONFATAL_ERROR
:
822 case PGRES_FATAL_ERROR
:
823 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "%s", PQresultErrorMessage(res
));
830 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
831 ZEND_ARG_INFO(0, query
)
833 static PHP_METHOD(pqconn
, exec
) {
834 zend_error_handling zeh
;
838 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
839 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
840 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
843 PGresult
*res
= PQexec(obj
->conn
, query_str
);
846 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
847 return_value
->type
= IS_OBJECT
;
848 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
851 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query: %s", PQerrorMessage(obj
->conn
));
854 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
857 zend_restore_error_handling(&zeh TSRMLS_CC
);
860 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
865 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
866 convert_to_long_ex(ztype
);
869 **types
= Z_LVAL_PP(ztype
);
872 if (*ztype
!= *(zval
**)p
) {
873 zval_ptr_dtor(ztype
);
875 return ZEND_HASH_APPLY_KEEP
;
878 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
884 params
= (char ***) va_arg(argv
, char ***);
885 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
887 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
891 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
892 convert_to_string_ex(zparam
);
895 **params
= Z_STRVAL_PP(zparam
);
898 if (*zparam
!= *(zval
**)p
) {
899 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
902 return ZEND_HASH_APPLY_KEEP
;
905 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
906 ZEND_ARG_INFO(0, query
)
907 ZEND_ARG_ARRAY_INFO(0, params
, 0)
908 ZEND_ARG_ARRAY_INFO(0, types
, 1)
910 static PHP_METHOD(pqconn
, execParams
) {
911 zend_error_handling zeh
;
917 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
918 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
919 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
925 char **params
= NULL
;
928 ZEND_INIT_SYMTABLE(&zdtor
);
930 if (ztypes
&& zend_hash_num_elements(Z_ARRVAL_P(ztypes
))) {
933 tmp
= types
= ecalloc(zend_hash_num_elements(Z_ARRVAL_P(ztypes
)), sizeof(Oid
));
934 zend_hash_apply_with_argument(Z_ARRVAL_P(ztypes
), apply_to_oid
, &tmp TSRMLS_CC
);
936 if ((count
= zend_hash_num_elements(Z_ARRVAL_P(zparams
)))) {
939 tmp
= params
= ecalloc(zend_hash_num_elements(Z_ARRVAL_P(zparams
)), sizeof(char *));
940 zend_hash_apply_with_arguments(Z_ARRVAL_P(zparams
) TSRMLS_CC
, apply_to_param
, 2, &tmp
, &zdtor
);
943 res
= PQexecParams(obj
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0);
945 zend_hash_destroy(&zdtor
);
954 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
955 return_value
->type
= IS_OBJECT
;
956 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
959 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query: %s", PQerrorMessage(obj
->conn
));
962 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
965 zend_restore_error_handling(&zeh TSRMLS_CC
);
968 static STATUS
php_pqconn_prepare(PGconn
*conn
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
974 if (typest
&& (count
= zend_hash_num_elements(typest
))) {
977 tmp
= types
= ecalloc(count
, sizeof(Oid
));
978 zend_hash_apply_with_argument(typest
, apply_to_oid
, &tmp TSRMLS_CC
);
981 res
= PQprepare(conn
, name
, query
, count
, types
);
988 if (PGRES_COMMAND_OK
== PQresultStatus(res
)) {
991 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement: %s", PQresultErrorMessage(res
));
995 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement: %s", PQerrorMessage(conn
));
1000 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
1001 ZEND_ARG_INFO(0, "name")
1002 ZEND_ARG_INFO(0, "query")
1003 ZEND_ARG_ARRAY_INFO(0, "types", 1)
1004 ZEND_END_ARG_INFO();
1005 static PHP_METHOD(pqconn
, prepare
) {
1006 zend_error_handling zeh
;
1007 zval
*ztypes
= NULL
;
1008 char *name_str
, *query_str
;
1009 int name_len
, *query_len
;
1011 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1012 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
1013 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1016 if (SUCCESS
== php_pqconn_prepare(obj
->conn
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
1017 return_value
->type
= IS_OBJECT
;
1018 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, getThis(), name_str
, NULL TSRMLS_CC
);
1021 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1026 static zend_function_entry php_pqconn_methods
[] = {
1027 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
1028 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
1029 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
1030 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
1031 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
1032 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
1036 static zval
**php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type TSRMLS_DC
)
1039 php_pqres_fetch_t orig_fetch
;
1042 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1046 obj
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
1047 obj
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
1049 orig_fetch
= obj
->iter
->fetch_type
;
1050 obj
->iter
->fetch_type
= fetch_type
;
1051 if (SUCCESS
== obj
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->iter TSRMLS_CC
)) {
1052 obj
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->iter
, &row TSRMLS_CC
);
1053 obj
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
1055 obj
->iter
->fetch_type
= orig_fetch
;
1057 return row
? row
: NULL
;
1060 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
1061 ZEND_ARG_INFO(0, fetch_type
)
1062 ZEND_END_ARG_INFO();
1063 static PHP_METHOD(pqres
, fetchRow
) {
1064 zend_error_handling zeh
;
1065 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1066 long fetch_type
= obj
->iter
? obj
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
1068 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1069 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
1070 zval
**row
= php_pqres_iteration(getThis(), obj
, fetch_type TSRMLS_CC
);
1073 RETVAL_ZVAL(*row
, 1, 0);
1078 zend_restore_error_handling(&zeh TSRMLS_CC
);
1081 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
1084 HashTable
*ht
= HASH_OF(row
);
1085 int count
= zend_hash_num_elements(ht
);
1088 zend_hash_internal_pointer_reset(ht
);
1090 zend_hash_move_forward(ht
);
1092 zend_hash_get_current_data(ht
, (void *) &data
);
1094 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d does excess column count %d", col
, count
);
1099 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 0)
1100 ZEND_ARG_INFO(0, col_num
)
1101 ZEND_END_ARG_INFO();
1102 static PHP_METHOD(pqres
, fetchCol
) {
1103 zend_error_handling zeh
;
1106 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1107 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_col
)) {
1108 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1109 zval
**row
= php_pqres_iteration(getThis(), obj
, obj
->iter
? obj
->iter
->fetch_type
: 0 TSRMLS_CC
);
1112 zval
**col
= column_at(*row
, fetch_col TSRMLS_CC
);
1115 RETVAL_ZVAL(*col
, 1, 0);
1123 zend_restore_error_handling(&zeh TSRMLS_CC
);
1127 static zend_function_entry php_pqres_methods
[] = {
1128 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
1129 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
1133 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
1134 ZEND_ARG_OBJ_INFO(0, "Connection", "pq\\Connection", 0)
1135 ZEND_ARG_INFO(0, "name")
1136 ZEND_ARG_INFO(0, "query")
1137 ZEND_ARG_ARRAY_INFO(0, "types", 1)
1138 ZEND_END_ARG_INFO();
1139 static PHP_METHOD(pqstm
, __construct
) {
1140 zend_error_handling zeh
;
1141 zval
*zconn
, *ztypes
= NULL
;
1142 char *name_str
, *query_str
;
1143 int name_len
, *query_len
;
1145 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1146 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
)) {
1147 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1148 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1150 if (conn_obj
->conn
) {
1151 if (SUCCESS
== php_pqconn_prepare(conn_obj
->conn
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
1154 obj
->name
= estrdup(name_str
);
1157 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1162 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
1163 ZEND_ARG_ARRAY_INFO(0, "params", 1)
1164 ZEND_END_ARG_INFO();
1165 static PHP_METHOD(pqstm
, exec
) {
1166 zend_error_handling zeh
;
1167 zval
*zparams
= NULL
;
1169 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1170 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
1171 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1173 if (obj
->conn
&& obj
->name
) {
1174 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(obj
->conn TSRMLS_CC
);
1176 if (conn_obj
->conn
) {
1178 char **params
= NULL
;
1182 ZEND_INIT_SYMTABLE(&zdtor
);
1184 if (zparams
&& (count
= zend_hash_num_elements(Z_ARRVAL_P(zparams
)))) {
1187 tmp
= params
= ecalloc(count
, sizeof(char *));
1188 zend_hash_apply_with_arguments(Z_ARRVAL_P(zparams
) TSRMLS_CC
, apply_to_param
, 2, &tmp
, &zdtor
);
1191 res
= PQexecPrepared(conn_obj
->conn
, obj
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0);
1196 zend_hash_destroy(&zdtor
);
1199 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1200 return_value
->type
= IS_OBJECT
;
1201 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
1204 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement: %s", PQerrorMessage(conn_obj
->conn
));
1207 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1210 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Statement not initialized");
1213 zend_restore_error_handling(&zeh TSRMLS_CC
);
1216 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc
, 0, 0, 0)
1217 ZEND_END_ARG_INFO();
1218 static PHP_METHOD(pqstm
, desc
) {
1219 zend_error_handling zeh
;
1221 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1222 if (SUCCESS
== zend_parse_parameters_none()) {
1223 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1225 if (obj
->conn
&& obj
->name
) {
1226 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(obj
->conn TSRMLS_CC
);
1228 if (conn_obj
->conn
) {
1229 PGresult
*res
= PQdescribePrepared(conn_obj
->conn
, obj
->name
);
1232 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1235 array_init(return_value
);
1236 for (p
= 0, params
= PQnparams(res
); p
< params
; ++p
) {
1237 add_next_index_long(return_value
, PQparamtype(res
, p
));
1241 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement: %s", PQerrorMessage(conn_obj
->conn
));
1244 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1247 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Statement not initialized");
1250 zend_restore_error_handling(&zeh TSRMLS_CC
);
1253 static zend_function_entry php_pqstm_methods
[] = {
1254 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
1255 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
1256 PHP_ME(pqstm
, desc
, ai_pqstm_desc
, ZEND_ACC_PUBLIC
)
1260 /* {{{ PHP_MINIT_FUNCTION
1262 PHP_MINIT_FUNCTION(pq
)
1264 zend_class_entry ce
= {0};
1265 php_pq_object_prophandler_t ph
= {0};
1267 zend_hash_init(&php_pqconn_object_prophandlers
, 1, NULL
, NULL
, 1);
1268 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
1269 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1270 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
1271 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1272 php_pqconn_object_handlers
.read_property
= php_pqconn_object_read_prop
;
1273 php_pqconn_object_handlers
.write_property
= php_pqconn_object_write_prop
;
1275 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1276 ph
.read
= php_pqconn_object_read_status
;
1277 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
1279 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1280 ph
.read
= php_pqconn_object_read_transaction_status
;
1281 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
1283 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1284 ph
.read
= NULL
; /* forward to std prophandler */
1285 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
1287 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1288 ph
.read
= php_pqconn_object_read_error_message
;
1289 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
1291 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("types"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1292 ph
.read
= php_pqconn_object_read_types
;
1293 zend_hash_add(&php_pqconn_object_prophandlers
, "types", sizeof("types"), (void *) &ph
, sizeof(ph
), NULL
);
1295 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
1296 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
1297 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
1298 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
1299 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
1300 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
1301 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
1302 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
1304 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
1305 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
1306 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
1307 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
1308 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
1310 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
1311 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
1312 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
1313 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
1315 zend_hash_init(&php_pqres_object_prophandlers
, 1, NULL
, NULL
, 1);
1316 memset(&ce
, 0, sizeof(ce
));
1317 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
1318 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1319 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
1320 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
1321 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
1323 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1324 php_pqres_object_handlers
.read_property
= php_pqres_object_read_prop
;
1325 php_pqres_object_handlers
.write_property
= php_pqres_object_write_prop
;
1327 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1328 ph
.read
= php_pqres_object_read_status
;
1329 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
1331 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1332 ph
.read
= php_pqres_object_read_error_message
;
1333 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
1335 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1336 ph
.read
= php_pqres_object_read_num_rows
;
1337 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
1339 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1340 ph
.read
= php_pqres_object_read_num_cols
;
1341 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
1343 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1344 ph
.read
= php_pqres_object_read_affected_rows
;
1345 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
1347 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1348 ph
.read
= php_pqres_object_read_fetch_type
;
1349 ph
.write
= php_pqres_object_write_fetch_type
;
1350 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
1353 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
1354 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
1355 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
1356 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
1357 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
1358 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
1359 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
1360 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
1361 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
1362 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
1364 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
1365 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
1366 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
1368 zend_hash_init(&php_pqstm_object_prophandlers
, 1, NULL
, NULL
, 1);
1369 memset(&ce
, 0, sizeof(ce
));
1370 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
1371 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1372 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
1374 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1375 php_pqstm_object_handlers
.read_property
= php_pqstm_object_read_prop
;
1376 php_pqstm_object_handlers
.write_property
= php_pqstm_object_write_prop
;
1378 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1379 ph
.read
= php_pqstm_object_read_name
;
1380 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
1382 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1383 ph
.read
= php_pqstm_object_read_connection
;
1384 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
1387 REGISTER_INI_ENTRIES();
1393 /* {{{ PHP_MSHUTDOWN_FUNCTION
1395 PHP_MSHUTDOWN_FUNCTION(pq
)
1397 /* uncomment this line if you have INI entries
1398 UNREGISTER_INI_ENTRIES();
1404 /* {{{ PHP_MINFO_FUNCTION
1406 PHP_MINFO_FUNCTION(pq
)
1408 php_info_print_table_start();
1409 php_info_print_table_header(2, "pq support", "enabled");
1410 php_info_print_table_end();
1412 /* Remove comments if you have entries in php.ini
1413 DISPLAY_INI_ENTRIES();
1425 * vim600: noet sw=4 ts=4 fdm=marker
1426 * vim<600: noet sw=4 ts=4