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
)) {
489 object_init(return_value
);
490 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
491 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
493 add_property_zval(return_value
, PQgetvalue(res
, r
, 1), row
);
497 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types: %s", PQresultErrorMessage(res
));
501 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types: %s", PQerrorMessage(obj
->conn
));
505 static void php_pqres_object_read_status(void *o
, zval
*return_value TSRMLS_DC
)
507 php_pqres_object_t
*obj
= o
;
509 RETVAL_LONG(PQresultStatus(obj
->res
));
512 static void php_pqres_object_read_error_message(void *o
, zval
*return_value TSRMLS_DC
)
514 php_pqres_object_t
*obj
= o
;
515 char *error
= PQresultErrorMessage(obj
->res
);
518 RETVAL_STRING(error
, 1);
524 static void php_pqres_object_read_num_rows(void *o
, zval
*return_value TSRMLS_DC
)
526 php_pqres_object_t
*obj
= o
;
528 RETVAL_LONG(PQntuples(obj
->res
));
531 static void php_pqres_object_read_num_cols(void *o
, zval
*return_value TSRMLS_DC
)
533 php_pqres_object_t
*obj
= o
;
535 RETVAL_LONG(PQnfields(obj
->res
));
538 static void php_pqres_object_read_affected_rows(void *o
, zval
*return_value TSRMLS_DC
)
540 php_pqres_object_t
*obj
= o
;
542 RETVAL_LONG(atoi(PQcmdTuples(obj
->res
)));
545 static void php_pqres_object_read_fetch_type(void *o
, zval
*return_value TSRMLS_DC
)
547 php_pqres_object_t
*obj
= o
;
550 RETVAL_LONG(obj
->iter
->fetch_type
);
552 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
556 static void php_pqres_object_write_fetch_type(void *o
, zval
*value TSRMLS_DC
)
558 php_pqres_object_t
*obj
= o
;
559 zval
*zfetch_type
= value
;
561 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
562 convert_to_long_ex(&zfetch_type
);
565 obj
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
567 if (zfetch_type
!= value
) {
568 zval_ptr_dtor(&zfetch_type
);
572 static void php_pqstm_object_read_name(void *o
, zval
*return_value TSRMLS_DC
)
574 php_pqstm_object_t
*obj
= o
;
576 RETVAL_STRING(obj
->name
, 1);
579 static void php_pqstm_object_read_connection(void *o
, zval
*return_value TSRMLS_DC
)
581 php_pqstm_object_t
*obj
= o
;
583 RETVAL_ZVAL(obj
->conn
, 1, 0);
586 static zval
*php_pqconn_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
588 php_pqconn_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
589 php_pq_object_prophandler_t
*handler
;
593 zend_error(E_WARNING
, "Connection not initialized");
594 } else if (SUCCESS
== zend_hash_find(&php_pqconn_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
595 if (type
== BP_VAR_R
) {
596 ALLOC_ZVAL(return_value
);
597 Z_SET_REFCOUNT_P(return_value
, 0);
598 Z_UNSET_ISREF_P(return_value
);
600 handler
->read(obj
, return_value TSRMLS_CC
);
602 zend_error(E_ERROR
, "Cannot access pq\\Connection properties by reference or array key/index");
606 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
612 static void php_pqconn_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
614 php_pqconn_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
615 php_pq_object_prophandler_t
*handler
;
617 if (SUCCESS
== zend_hash_find(&php_pqconn_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
618 if (handler
->write
) {
619 handler
->write(obj
, value TSRMLS_CC
);
622 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
626 static zval
*php_pqres_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
628 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
629 php_pq_object_prophandler_t
*handler
;
633 zend_error(E_WARNING
, "Result not initialized");
634 } else if (SUCCESS
== zend_hash_find(&php_pqres_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
635 if (type
== BP_VAR_R
) {
636 ALLOC_ZVAL(return_value
);
637 Z_SET_REFCOUNT_P(return_value
, 0);
638 Z_UNSET_ISREF_P(return_value
);
640 handler
->read(obj
, return_value TSRMLS_CC
);
642 zend_error(E_ERROR
, "Cannot access pq\\Result properties by reference or array key/index");
646 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
652 static void php_pqres_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
654 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
655 php_pq_object_prophandler_t
*handler
;
658 zend_error(E_WARNING
, "Result not initialized");
659 } else if (SUCCESS
== zend_hash_find(&php_pqres_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
660 if (handler
->write
) {
661 /* ensure obj->iter is initialized, for e.g. write_fetch_type */
663 obj
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
664 obj
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
666 handler
->write(obj
, value TSRMLS_CC
);
669 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
673 static zval
*php_pqstm_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
675 php_pqstm_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
676 php_pq_object_prophandler_t
*handler
;
680 zend_error(E_WARNING
, "Statement not initialized");
681 } else if (SUCCESS
== zend_hash_find(&php_pqstm_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
682 if (type
== BP_VAR_R
) {
683 ALLOC_ZVAL(return_value
);
684 Z_SET_REFCOUNT_P(return_value
, 0);
685 Z_UNSET_ISREF_P(return_value
);
687 handler
->read(obj
, return_value TSRMLS_CC
);
689 zend_error(E_ERROR
, "Cannot access pq\\Statement properties by reference or array key/index");
693 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
699 static void php_pqstm_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
701 php_pqstm_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
702 php_pq_object_prophandler_t
*handler
;
705 zend_error(E_WARNING
, "Result not initialized");
706 } else if (SUCCESS
== zend_hash_find(&php_pqstm_object_prophandlers
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
707 if (handler
->write
) {
708 handler
->write(obj
, value TSRMLS_CC
);
711 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
715 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
716 ZEND_ARG_INFO(0, dsn
)
717 ZEND_ARG_INFO(0, block
)
719 static PHP_METHOD(pqconn
, __construct
) {
720 zend_error_handling zeh
;
725 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
726 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|b", &dsn_str
, &dsn_len
, &block
)) {
727 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
732 if ((obj
->blocking
= block
)) {
733 obj
->conn
= PQconnectdb(dsn_str
);
735 obj
->conn
= PQconnectStart(dsn_str
);
736 obj
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
739 if (CONNECTION_BAD
== PQstatus(obj
->conn
)) {
740 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed: %s", PQerrorMessage(obj
->conn
));
743 zend_restore_error_handling(&zeh TSRMLS_CC
);
746 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
748 static PHP_METHOD(pqconn
, reset
) {
749 if (SUCCESS
== zend_parse_parameters_none()) {
750 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
755 RETURN_TRUE
; /* probably ;) */
756 } if (PQresetStart(obj
->conn
)) {
757 obj
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
761 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
767 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
769 static PHP_METHOD(pqconn
, poll
) {
770 if (SUCCESS
== zend_parse_parameters_none()) {
771 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
775 RETURN_LONG(obj
->poller(obj
->conn
));
777 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
780 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
786 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
787 ZEND_ARG_INFO(0, query
)
789 static PHP_METHOD(pqconn
, exec
) {
790 zend_error_handling zeh
;
794 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
795 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
796 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
799 PGresult
*res
= PQexec(obj
->conn
, query_str
);
802 return_value
->type
= IS_OBJECT
;
803 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
805 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query: %s", PQerrorMessage(obj
->conn
));
808 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
811 zend_restore_error_handling(&zeh TSRMLS_CC
);
814 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
819 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
820 convert_to_long_ex(ztype
);
823 **types
= Z_LVAL_PP(ztype
);
826 if (*ztype
!= *(zval
**)p
) {
827 zval_ptr_dtor(ztype
);
829 return ZEND_HASH_APPLY_KEEP
;
832 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
838 params
= (char ***) va_arg(argv
, char ***);
839 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
841 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
845 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
846 convert_to_string_ex(zparam
);
849 **params
= Z_STRVAL_PP(zparam
);
852 if (*zparam
!= *(zval
**)p
) {
853 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
856 return ZEND_HASH_APPLY_KEEP
;
859 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
860 ZEND_ARG_INFO(0, query
)
861 ZEND_ARG_ARRAY_INFO(0, params
, 0)
862 ZEND_ARG_ARRAY_INFO(0, types
, 1)
864 static PHP_METHOD(pqconn
, execParams
) {
865 zend_error_handling zeh
;
871 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
872 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
873 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
879 char **params
= NULL
;
882 ZEND_INIT_SYMTABLE(&zdtor
);
884 if (ztypes
&& zend_hash_num_elements(Z_ARRVAL_P(ztypes
))) {
887 tmp
= types
= ecalloc(zend_hash_num_elements(Z_ARRVAL_P(ztypes
)), sizeof(Oid
));
888 zend_hash_apply_with_argument(Z_ARRVAL_P(ztypes
), apply_to_oid
, &tmp TSRMLS_CC
);
890 if ((count
= zend_hash_num_elements(Z_ARRVAL_P(zparams
)))) {
893 tmp
= params
= ecalloc(zend_hash_num_elements(Z_ARRVAL_P(zparams
)), sizeof(char *));
894 zend_hash_apply_with_arguments(Z_ARRVAL_P(zparams
) TSRMLS_CC
, apply_to_param
, 2, &tmp
, &zdtor
);
897 res
= PQexecParams(obj
->conn
, query_str
, count
, types
, params
, NULL
, NULL
, 0);
899 zend_hash_destroy(&zdtor
);
908 return_value
->type
= IS_OBJECT
;
909 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
911 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query: %s", PQerrorMessage(obj
->conn
));
914 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
917 zend_restore_error_handling(&zeh TSRMLS_CC
);
920 static STATUS
php_pqconn_prepare(PGconn
*conn
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
926 if (typest
&& (count
= zend_hash_num_elements(typest
))) {
929 tmp
= types
= ecalloc(count
, sizeof(Oid
));
930 zend_hash_apply_with_argument(typest
, apply_to_oid
, &tmp TSRMLS_CC
);
933 res
= PQprepare(conn
, name
, query
, count
, types
);
940 if (PGRES_COMMAND_OK
== PQresultStatus(res
)) {
943 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement: %s", PQresultErrorMessage(res
));
947 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement: %s", PQerrorMessage(conn
));
952 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
953 ZEND_ARG_INFO(0, "name")
954 ZEND_ARG_INFO(0, "query")
955 ZEND_ARG_ARRAY_INFO(0, "types", 1)
957 static PHP_METHOD(pqconn
, prepare
) {
958 zend_error_handling zeh
;
960 char *name_str
, *query_str
;
961 int name_len
, *query_len
;
963 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
964 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
965 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
968 if (SUCCESS
== php_pqconn_prepare(obj
->conn
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
969 return_value
->type
= IS_OBJECT
;
970 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, getThis(), name_str
, NULL TSRMLS_CC
);
973 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
978 static zend_function_entry php_pqconn_methods
[] = {
979 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
980 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
981 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
982 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
983 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
984 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
988 static zval
**php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type TSRMLS_DC
)
991 php_pqres_fetch_t orig_fetch
;
994 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
998 obj
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
999 obj
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
1001 orig_fetch
= obj
->iter
->fetch_type
;
1002 obj
->iter
->fetch_type
= fetch_type
;
1003 if (SUCCESS
== obj
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->iter TSRMLS_CC
)) {
1004 obj
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->iter
, &row TSRMLS_CC
);
1005 obj
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->iter TSRMLS_CC
);
1007 obj
->iter
->fetch_type
= orig_fetch
;
1009 return row
? row
: NULL
;
1012 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch
, 0, 0, 0)
1013 ZEND_ARG_INFO(0, fetch_type
)
1014 ZEND_END_ARG_INFO();
1015 static PHP_METHOD(pqres
, fetchRow
) {
1016 zend_error_handling zeh
;
1017 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1018 long fetch_type
= obj
->iter
? obj
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
1020 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1021 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
1022 zval
**row
= php_pqres_iteration(getThis(), obj
, fetch_type TSRMLS_CC
);
1025 RETVAL_ZVAL(*row
, 1, 0);
1030 zend_restore_error_handling(&zeh TSRMLS_CC
);
1033 static zend_function_entry php_pqres_methods
[] = {
1034 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch
, ZEND_ACC_PUBLIC
)
1038 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
1039 ZEND_ARG_OBJ_INFO(0, "Connection", "pq\\Connection", 0)
1040 ZEND_ARG_INFO(0, "name")
1041 ZEND_ARG_INFO(0, "query")
1042 ZEND_ARG_ARRAY_INFO(0, "types", 1)
1043 ZEND_END_ARG_INFO();
1044 static PHP_METHOD(pqstm
, __construct
) {
1045 zend_error_handling zeh
;
1046 zval
*zconn
, *ztypes
= NULL
;
1047 char *name_str
, *query_str
;
1048 int name_len
, *query_len
;
1050 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1051 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
)) {
1052 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1053 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1055 if (conn_obj
->conn
) {
1056 if (SUCCESS
== php_pqconn_prepare(conn_obj
->conn
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
1059 obj
->name
= estrdup(name_str
);
1062 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1067 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
1068 ZEND_ARG_ARRAY_INFO(0, "params", 1)
1069 ZEND_END_ARG_INFO();
1070 static PHP_METHOD(pqstm
, exec
) {
1071 zend_error_handling zeh
;
1072 zval
*zparams
= NULL
;
1074 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1075 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
1076 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1078 if (obj
->conn
&& obj
->name
) {
1079 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(obj
->conn TSRMLS_CC
);
1081 if (conn_obj
->conn
) {
1083 char **params
= NULL
;
1087 ZEND_INIT_SYMTABLE(&zdtor
);
1089 if (zparams
&& (count
= zend_hash_num_elements(Z_ARRVAL_P(zparams
)))) {
1092 tmp
= params
= ecalloc(count
, sizeof(char *));
1093 zend_hash_apply_with_arguments(Z_ARRVAL_P(zparams
) TSRMLS_CC
, apply_to_param
, 2, &tmp
, &zdtor
);
1096 res
= PQexecPrepared(conn_obj
->conn
, obj
->name
, count
, params
, NULL
, NULL
, 0);
1101 zend_hash_destroy(&zdtor
);
1104 return_value
->type
= IS_OBJECT
;
1105 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, res
, NULL TSRMLS_CC
);
1107 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement: %s", PQerrorMessage(conn_obj
->conn
));
1110 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection not initialized");
1113 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Statement not initialized");
1116 zend_restore_error_handling(&zeh TSRMLS_CC
);
1119 static zend_function_entry php_pqstm_methods
[] = {
1120 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
1121 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
1125 /* {{{ PHP_MINIT_FUNCTION
1127 PHP_MINIT_FUNCTION(pq
)
1129 zend_class_entry ce
= {0};
1130 php_pq_object_prophandler_t ph
= {0};
1132 zend_hash_init(&php_pqconn_object_prophandlers
, 1, NULL
, NULL
, 1);
1133 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
1134 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1135 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
1136 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1137 php_pqconn_object_handlers
.read_property
= php_pqconn_object_read_prop
;
1138 php_pqconn_object_handlers
.write_property
= php_pqconn_object_write_prop
;
1140 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1141 ph
.read
= php_pqconn_object_read_status
;
1142 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
1144 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1145 ph
.read
= php_pqconn_object_read_transaction_status
;
1146 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
1148 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1149 ph
.read
= php_pqconn_object_read_socket
;
1150 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
1152 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1153 ph
.read
= php_pqconn_object_read_error_message
;
1154 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
1156 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("types"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1157 ph
.read
= php_pqconn_object_read_types
;
1158 zend_hash_add(&php_pqconn_object_prophandlers
, "types", sizeof("types"), (void *) &ph
, sizeof(ph
), NULL
);
1160 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
1161 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
1162 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
1163 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
1164 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
1165 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
1166 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
1167 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
1169 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
1170 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
1171 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
1172 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
1173 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
1175 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
1176 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
1177 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
1178 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
1180 zend_hash_init(&php_pqres_object_prophandlers
, 1, NULL
, NULL
, 1);
1181 memset(&ce
, 0, sizeof(ce
));
1182 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
1183 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1184 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
1185 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
1186 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
1188 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1189 php_pqres_object_handlers
.read_property
= php_pqres_object_read_prop
;
1190 php_pqres_object_handlers
.write_property
= php_pqres_object_write_prop
;
1192 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1193 ph
.read
= php_pqres_object_read_status
;
1194 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
1196 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1197 ph
.read
= php_pqres_object_read_error_message
;
1198 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
1200 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1201 ph
.read
= php_pqres_object_read_num_rows
;
1202 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
1204 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1205 ph
.read
= php_pqres_object_read_num_cols
;
1206 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
1208 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1209 ph
.read
= php_pqres_object_read_affected_rows
;
1210 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
1212 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1213 ph
.read
= php_pqres_object_read_fetch_type
;
1214 ph
.write
= php_pqres_object_write_fetch_type
;
1215 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
1218 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
1219 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
1220 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
1221 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
1222 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
1223 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
1224 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
1225 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
1226 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
1227 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
1229 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
1230 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
1231 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
1233 zend_hash_init(&php_pqstm_object_prophandlers
, 1, NULL
, NULL
, 1);
1234 memset(&ce
, 0, sizeof(ce
));
1235 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
1236 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1237 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
1239 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1240 php_pqstm_object_handlers
.read_property
= php_pqstm_object_read_prop
;
1241 php_pqstm_object_handlers
.write_property
= php_pqstm_object_write_prop
;
1243 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1244 ph
.read
= php_pqstm_object_read_name
;
1245 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
1247 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1248 ph
.read
= php_pqstm_object_read_connection
;
1249 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
1252 REGISTER_INI_ENTRIES();
1258 /* {{{ PHP_MSHUTDOWN_FUNCTION
1260 PHP_MSHUTDOWN_FUNCTION(pq
)
1262 /* uncomment this line if you have INI entries
1263 UNREGISTER_INI_ENTRIES();
1269 /* {{{ PHP_MINFO_FUNCTION
1271 PHP_MINFO_FUNCTION(pq
)
1273 php_info_print_table_start();
1274 php_info_print_table_header(2, "pq support", "enabled");
1275 php_info_print_table_end();
1277 /* Remove comments if you have entries in php.ini
1278 DISPLAY_INI_ENTRIES();
1290 * vim600: noet sw=4 ts=4 fdm=marker
1291 * vim<600: noet sw=4 ts=4