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>
23 #include <libpq/libpq-fs.h>
28 typedef int STATUS
; /* SUCCESS/FAILURE */
30 static char *rtrim(char *e
) {
33 while (l
-- > 0 && e
[l
] == '\n') {
39 #define PHP_PQerrorMessage(c) rtrim(PQerrorMessage((c)))
40 #define PHP_PQresultErrorMessage(r) rtrim(PQresultErrorMessage((r)))
42 static int php_pqconn_event(PGEventId id
, void *e
, void *data
);
44 #define PHP_PQclear(_r) \
46 zval *_resinszv = PQresultInstanceData((_r), php_pqconn_event); \
47 if (!_resinszv) PQclear((_r)); \
51 ZEND_DECLARE_MODULE_GLOBALS(pq)
57 /* Remove comments and fill if you need to have entries in php.ini
59 STD_PHP_INI_ENTRY("pq.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_pq_globals, pq_globals)
60 STD_PHP_INI_ENTRY("pq.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_pq_globals, pq_globals)
65 /* {{{ php_pq_init_globals
67 /* Uncomment this function if you have INI entries
68 static void php_pq_init_globals(zend_pq_globals *pq_globals)
70 pq_globals->global_value = 0;
71 pq_globals->global_string = NULL;
76 static zend_class_entry
*php_pqconn_class_entry
;
77 static zend_class_entry
*php_pqtypes_class_entry
;
78 static zend_class_entry
*php_pqres_class_entry
;
79 static zend_class_entry
*php_pqstm_class_entry
;
80 static zend_class_entry
*php_pqtxn_class_entry
;
81 static zend_class_entry
*php_pqcancel_class_entry
;
82 static zend_class_entry
*php_pqevent_class_entry
;
83 static zend_class_entry
*php_pqlob_class_entry
;
84 static zend_class_entry
*php_pqcopy_class_entry
;
86 static zend_object_handlers php_pqconn_object_handlers
;
87 static zend_object_handlers php_pqtypes_object_handlers
;
88 static zend_object_handlers php_pqres_object_handlers
;
89 static zend_object_handlers php_pqstm_object_handlers
;
90 static zend_object_handlers php_pqtxn_object_handlers
;
91 static zend_object_handlers php_pqcancel_object_handlers
;
92 static zend_object_handlers php_pqevent_object_handlers
;
93 static zend_object_handlers php_pqlob_object_handlers
;
94 static zend_object_handlers php_pqcopy_object_handlers
;
96 typedef struct php_pq_callback
{
98 zend_fcall_info_cache fcc
;
102 typedef struct php_pq_object
{
104 zend_object_value zv
;
105 HashTable
*prophandler
;
109 typedef struct php_pqconn
{
111 int (*poller
)(PGconn
*);
113 HashTable eventhandlers
;
114 php_pq_callback_t onevent
;
115 unsigned unbuffered
:1;
118 typedef struct php_pqconn_object
{
120 zend_object_value zv
;
121 HashTable
*prophandler
;
122 php_pqconn_t
*intern
;
123 } php_pqconn_object_t
;
125 typedef struct php_pqtypes
{
127 php_pqconn_object_t
*conn
;
130 typedef struct php_pqtypes_object
{
132 zend_object_value zv
;
133 HashTable
*prophandler
;
134 php_pqtypes_t
*intern
;
135 } php_pqtypes_object_t
;
137 typedef struct php_pqconn_event_data
{
138 php_pqconn_object_t
*obj
;
142 } php_pqconn_event_data_t
;
144 typedef enum php_pqres_fetch
{
145 PHP_PQRES_FETCH_ARRAY
,
146 PHP_PQRES_FETCH_ASSOC
,
147 PHP_PQRES_FETCH_OBJECT
150 typedef struct php_pqres_iterator
{
151 zend_object_iterator zi
;
154 php_pqres_fetch_t fetch_type
;
155 } php_pqres_iterator_t
;
157 typedef struct php_pqres
{
159 php_pqres_iterator_t
*iter
;
163 typedef struct php_pqres_object
{
165 zend_object_value zv
;
166 HashTable
*prophandler
;
168 } php_pqres_object_t
;
170 typedef struct php_pqstm
{
171 php_pqconn_object_t
*conn
;
176 typedef struct php_pqstm_object
{
178 zend_object_value zv
;
179 HashTable
*prophandler
;
181 } php_pqstm_object_t
;
183 typedef enum php_pqtxn_isolation
{
184 PHP_PQTXN_READ_COMMITTED
,
185 PHP_PQTXN_REPEATABLE_READ
,
186 PHP_PQTXN_SERIALIZABLE
,
187 } php_pqtxn_isolation_t
;
189 typedef struct php_pqtxn
{
190 php_pqconn_object_t
*conn
;
191 php_pqtxn_isolation_t isolation
;
194 unsigned deferrable
:1;
197 typedef struct php_pqtxn_object
{
199 zend_object_value zv
;
200 HashTable
*prophandler
;
202 } php_pqtxn_object_t
;
204 typedef struct php_pqcancel
{
206 php_pqconn_object_t
*conn
;
209 typedef struct php_pqcancel_object
{
211 zend_object_value zv
;
212 HashTable
*prophandler
;
213 php_pqcancel_t
*intern
;
214 } php_pqcancel_object_t
;
216 typedef struct php_pqevent
{
217 php_pq_callback_t cb
;
218 php_pqconn_object_t
*conn
;
222 typedef struct php_pqevent_object
{
224 zend_object_value zv
;
225 HashTable
*prophandler
;
226 php_pqevent_t
*intern
;
227 } php_pqevent_object_t
;
229 typedef struct php_pqlob
{
232 php_pqtxn_object_t
*txn
;
235 typedef struct php_pqlob_object
{
237 zend_object_value zv
;
238 HashTable
*prophandler
;
240 } php_pqlob_object_t
;
242 typedef enum php_pqcopy_direction
{
243 PHP_PQCOPY_FROM_STDIN
,
245 } php_pqcopy_direction_t
;
247 typedef enum php_pqcopy_status
{
251 } php_pqcopy_status_t
;
253 typedef struct php_pqcopy
{
254 php_pqcopy_direction_t direction
;
257 php_pqconn_object_t
*conn
;
260 typedef struct php_pqcopy_object
{
262 zend_object_value zv
;
263 HashTable
*prophandler
;
264 php_pqcopy_t
*intern
;
265 } php_pqcopy_object_t
;
267 static HashTable php_pqconn_object_prophandlers
;
268 static HashTable php_pqtypes_object_prophandlers
;
269 static HashTable php_pqres_object_prophandlers
;
270 static HashTable php_pqstm_object_prophandlers
;
271 static HashTable php_pqtxn_object_prophandlers
;
272 static HashTable php_pqcancel_object_prophandlers
;
273 static HashTable php_pqevent_object_prophandlers
;
274 static HashTable php_pqlob_object_prophandlers
;
275 static HashTable php_pqcopy_object_prophandlers
;
277 typedef void (*php_pq_object_prophandler_func_t
)(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
);
279 typedef struct php_pq_object_prophandler
{
280 php_pq_object_prophandler_func_t read
;
281 php_pq_object_prophandler_func_t write
;
282 } php_pq_object_prophandler_t
;
284 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
286 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
288 php_pqres_iterator_t
*iter
;
289 zval
*prop
, *zfetch_type
;
291 iter
= ecalloc(1, sizeof(*iter
));
292 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
293 iter
->zi
.data
= object
;
296 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
297 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
298 convert_to_long_ex(&zfetch_type
);
300 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
301 if (zfetch_type
!= prop
) {
302 zval_ptr_dtor(&zfetch_type
);
304 if (Z_REFCOUNT_P(prop
)) {
305 zval_ptr_dtor(&prop
);
311 return (zend_object_iterator
*) iter
;
314 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
316 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
318 if (iter
->current_val
) {
319 zval_ptr_dtor(&iter
->current_val
);
320 iter
->current_val
= NULL
;
322 zval_ptr_dtor((zval
**) &iter
->zi
.data
);
326 static STATUS
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
328 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
329 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
331 if (PQresultStatus(obj
->intern
->res
) != PGRES_TUPLES_OK
) {
334 if (PQntuples(obj
->intern
->res
) <= iter
->index
) {
341 static zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type
, zval
**data_ptr TSRMLS_DC
)
351 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
361 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
362 if (PQgetisnull(res
, row
, c
)) {
363 switch (fetch_type
) {
364 case PHP_PQRES_FETCH_OBJECT
:
365 add_property_null(data
, PQfname(res
, c
));
368 case PHP_PQRES_FETCH_ASSOC
:
369 add_assoc_null(data
, PQfname(res
, c
));
372 case PHP_PQRES_FETCH_ARRAY
:
373 add_index_null(data
, c
);
377 char *val
= PQgetvalue(res
, row
, c
);
378 int len
= PQgetlength(res
, row
, c
);
380 switch (fetch_type
) {
381 case PHP_PQRES_FETCH_OBJECT
:
382 add_property_stringl(data
, PQfname(res
, c
), val
, len
, 1);
385 case PHP_PQRES_FETCH_ASSOC
:
386 add_assoc_stringl(data
, PQfname(res
, c
), val
, len
, 1);
389 case PHP_PQRES_FETCH_ARRAY
:
390 add_index_stringl(data
, c
, val
, len
,1);
399 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
401 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
402 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
404 if (iter
->current_val
) {
405 zval_ptr_dtor(&iter
->current_val
);
407 iter
->current_val
= php_pqres_row_to_zval(obj
->intern
->res
, iter
->index
, iter
->fetch_type
, NULL TSRMLS_CC
);
408 *data_ptr
= &iter
->current_val
;
411 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
413 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
415 *key_num
= (ulong
) iter
->index
;
417 return HASH_KEY_IS_LONG
;
420 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
422 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
427 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
429 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
434 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
435 php_pqres_iterator_dtor
,
436 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
437 php_pqres_iterator_valid
,
438 /* fetch the item data for the current element */
439 php_pqres_iterator_current
,
440 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
441 php_pqres_iterator_key
,
442 /* step forwards to next element */
443 php_pqres_iterator_next
,
444 /* rewind to start of data (optional, may be NULL) */
445 php_pqres_iterator_rewind
,
446 /* invalidate current value/key (optional, may be NULL) */
450 static int php_pqres_count_elements(zval
*object
, long *count TSRMLS_DC
)
452 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
455 *count
= (long) PQntuples(obj
->intern
->res
);
462 static STATUS
php_pqres_success(PGresult
*res TSRMLS_DC
)
464 switch (PQresultStatus(res
)) {
465 case PGRES_BAD_RESPONSE
:
466 case PGRES_NONFATAL_ERROR
:
467 case PGRES_FATAL_ERROR
:
468 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "%s", PHP_PQresultErrorMessage(res
));
475 static void php_pq_callback_dtor(php_pq_callback_t
*cb
) {
476 if (cb
->fci
.size
> 0) {
477 zend_fcall_info_args_clear(&cb
->fci
, 1);
478 zval_ptr_dtor(&cb
->fci
.function_name
);
479 if (cb
->fci
.object_ptr
) {
480 zval_ptr_dtor(&cb
->fci
.object_ptr
);
486 static void php_pq_callback_addref(php_pq_callback_t
*cb
)
488 Z_ADDREF_P(cb
->fci
.function_name
);
489 if (cb
->fci
.object_ptr
) {
490 Z_ADDREF_P(cb
->fci
.object_ptr
);
494 static void php_pq_object_to_zval(void *o
, zval
**zv TSRMLS_DC
)
496 php_pq_object_t
*obj
= o
;
502 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
504 (*zv
)->type
= IS_OBJECT
;
505 (*zv
)->value
.obj
= obj
->zv
;
508 static void php_pq_object_addref(void *o TSRMLS_DC
)
510 php_pq_object_t
*obj
= o
;
511 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
514 static void php_pq_object_delref(void *o TSRMLS_DC
)
516 php_pq_object_t
*obj
= o
;
517 zend_objects_store_del_ref_by_handle_ex(obj
->zv
.handle
, obj
->zv
.handlers TSRMLS_CC
);
520 static void php_pqconn_object_free(void *o TSRMLS_DC
)
522 php_pqconn_object_t
*obj
= o
;
525 PQfinish(obj
->intern
->conn
);
526 php_pq_callback_dtor(&obj
->intern
->onevent
);
527 zend_hash_destroy(&obj
->intern
->listeners
);
528 zend_hash_destroy(&obj
->intern
->eventhandlers
);
532 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
536 static void php_pqtypes_object_free(void *o TSRMLS_DC
)
538 php_pqtypes_object_t
*obj
= o
;
541 zend_hash_destroy(&obj
->intern
->types
);
542 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
546 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
550 static void php_pqres_object_free(void *o TSRMLS_DC
)
552 php_pqres_object_t
*obj
= o
;
555 if (obj
->intern
->res
) {
556 zval
*res
= PQresultInstanceData(obj
->intern
->res
, php_pqconn_event
);
558 if (1 == Z_REFCOUNT_P(res
)) {
559 PQresultSetInstanceData(obj
->intern
->res
, php_pqconn_event
, NULL
);
563 PQclear(obj
->intern
->res
);
564 obj
->intern
->res
= NULL
;
568 if (obj
->intern
->iter
) {
569 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
570 obj
->intern
->iter
= NULL
;
573 zend_hash_destroy(&obj
->intern
->bound
);
578 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
582 static void php_pqstm_object_free(void *o TSRMLS_DC
)
584 php_pqstm_object_t
*obj
= o
;
587 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
588 efree(obj
->intern
->name
);
589 zend_hash_destroy(&obj
->intern
->bound
);
593 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
597 static void php_pqtxn_object_free(void *o TSRMLS_DC
)
599 php_pqtxn_object_t
*obj
= o
;
602 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
606 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
610 static void php_pqcancel_object_free(void *o TSRMLS_DC
)
612 php_pqcancel_object_t
*obj
= o
;
615 PQfreeCancel(obj
->intern
->cancel
);
616 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
620 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
624 static void php_pqevent_object_free(void *o TSRMLS_DC
)
626 php_pqevent_object_t
*obj
= o
;
629 php_pq_callback_dtor(&obj
->intern
->cb
);
630 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
631 efree(obj
->intern
->type
);
635 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
639 static void php_pqlob_object_free(void *o TSRMLS_DC
)
641 php_pqlob_object_t
*obj
= o
;
644 if (obj
->intern
->lofd
) {
645 lo_close(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
647 php_pq_object_delref(obj
->intern
->txn TSRMLS_CC
);
651 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
655 static void php_pqcopy_object_free(void *o TSRMLS_DC
)
657 php_pqcopy_object_t
*obj
= o
;
660 efree(obj
->intern
->expression
);
661 efree(obj
->intern
->options
);
662 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
666 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
670 static zend_object_value
php_pqconn_create_object_ex(zend_class_entry
*ce
, php_pqconn_t
*intern
, php_pqconn_object_t
**ptr TSRMLS_DC
)
672 php_pqconn_object_t
*o
;
674 o
= ecalloc(1, sizeof(*o
));
675 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
676 object_properties_init((zend_object
*) o
, ce
);
677 o
->prophandler
= &php_pqconn_object_prophandlers
;
687 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqconn_object_free
, NULL TSRMLS_CC
);
688 o
->zv
.handlers
= &php_pqconn_object_handlers
;
693 static zend_object_value
php_pqtypes_create_object_ex(zend_class_entry
*ce
, php_pqtypes_t
*intern
, php_pqtypes_object_t
**ptr TSRMLS_DC
)
695 php_pqtypes_object_t
*o
;
697 o
= ecalloc(1, sizeof(*o
));
698 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
699 object_properties_init((zend_object
*) o
, ce
);
700 o
->prophandler
= &php_pqtypes_object_prophandlers
;
710 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtypes_object_free
, NULL TSRMLS_CC
);
711 o
->zv
.handlers
= &php_pqtypes_object_handlers
;
716 static zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, php_pqres_t
*intern
, php_pqres_object_t
**ptr TSRMLS_DC
)
718 php_pqres_object_t
*o
;
720 o
= ecalloc(1, sizeof(*o
));
721 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
722 object_properties_init((zend_object
*) o
, ce
);
723 o
->prophandler
= &php_pqres_object_prophandlers
;
733 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
734 o
->zv
.handlers
= &php_pqres_object_handlers
;
739 static zend_object_value
php_pqstm_create_object_ex(zend_class_entry
*ce
, php_pqstm_t
*intern
, php_pqstm_object_t
**ptr TSRMLS_DC
)
741 php_pqstm_object_t
*o
;
743 o
= ecalloc(1, sizeof(*o
));
744 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
745 object_properties_init((zend_object
*) o
, ce
);
746 o
->prophandler
= &php_pqstm_object_prophandlers
;
756 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqstm_object_free
, NULL TSRMLS_CC
);
757 o
->zv
.handlers
= &php_pqstm_object_handlers
;
762 static zend_object_value
php_pqtxn_create_object_ex(zend_class_entry
*ce
, php_pqtxn_t
*intern
, php_pqtxn_object_t
**ptr TSRMLS_DC
)
764 php_pqtxn_object_t
*o
;
766 o
= ecalloc(1, sizeof(*o
));
767 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
768 object_properties_init((zend_object
*) o
, ce
);
769 o
->prophandler
= &php_pqtxn_object_prophandlers
;
779 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtxn_object_free
, NULL TSRMLS_CC
);
780 o
->zv
.handlers
= &php_pqtxn_object_handlers
;
785 static zend_object_value
php_pqcancel_create_object_ex(zend_class_entry
*ce
, php_pqcancel_t
*intern
, php_pqcancel_object_t
**ptr TSRMLS_DC
)
787 php_pqcancel_object_t
*o
;
789 o
= ecalloc(1, sizeof(*o
));
790 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
791 object_properties_init((zend_object
*) o
, ce
);
792 o
->prophandler
= &php_pqcancel_object_prophandlers
;
802 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcancel_object_free
, NULL TSRMLS_CC
);
803 o
->zv
.handlers
= &php_pqcancel_object_handlers
;
808 static zend_object_value
php_pqevent_create_object_ex(zend_class_entry
*ce
, php_pqevent_t
*intern
, php_pqevent_object_t
**ptr TSRMLS_DC
)
810 php_pqevent_object_t
*o
;
812 o
= ecalloc(1, sizeof(*o
));
813 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
814 object_properties_init((zend_object
*) o
, ce
);
815 o
->prophandler
= &php_pqevent_object_prophandlers
;
825 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqevent_object_free
, NULL TSRMLS_CC
);
826 o
->zv
.handlers
= &php_pqevent_object_handlers
;
831 static zend_object_value
php_pqlob_create_object_ex(zend_class_entry
*ce
, php_pqlob_t
*intern
, php_pqlob_object_t
**ptr TSRMLS_DC
)
833 php_pqlob_object_t
*o
;
835 o
= ecalloc(1, sizeof(*o
));
836 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
837 object_properties_init((zend_object
*) o
, ce
);
838 o
->prophandler
= &php_pqlob_object_prophandlers
;
848 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqlob_object_free
, NULL TSRMLS_CC
);
849 o
->zv
.handlers
= &php_pqlob_object_handlers
;
854 static zend_object_value
php_pqcopy_create_object_ex(zend_class_entry
*ce
, php_pqcopy_t
*intern
, php_pqcopy_object_t
**ptr TSRMLS_DC
)
856 php_pqcopy_object_t
*o
;
858 o
= ecalloc(1, sizeof(*o
));
859 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
860 object_properties_init((zend_object
*) o
, ce
);
861 o
->prophandler
= &php_pqcopy_object_prophandlers
;
871 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcopy_object_free
, NULL TSRMLS_CC
);
872 o
->zv
.handlers
= &php_pqcopy_object_handlers
;
877 static zend_object_value
php_pqconn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
879 return php_pqconn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
882 static zend_object_value
php_pqtypes_create_object(zend_class_entry
*class_type TSRMLS_DC
)
884 return php_pqtypes_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
887 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
889 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
892 static zend_object_value
php_pqstm_create_object(zend_class_entry
*class_type TSRMLS_DC
)
894 return php_pqstm_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
897 static zend_object_value
php_pqtxn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
899 return php_pqtxn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
902 static zend_object_value
php_pqcancel_create_object(zend_class_entry
*class_type TSRMLS_DC
)
904 return php_pqcancel_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
907 static zend_object_value
php_pqevent_create_object(zend_class_entry
*class_type TSRMLS_DC
)
909 return php_pqevent_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
912 static zend_object_value
php_pqlob_create_object(zend_class_entry
*class_type TSRMLS_DC
)
914 return php_pqlob_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
917 static zend_object_value
php_pqcopy_create_object(zend_class_entry
*class_type TSRMLS_DC
)
919 return php_pqcopy_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
922 static int apply_ph_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
924 php_pq_object_prophandler_t
*ph
= p
;
925 HashTable
*ht
= va_arg(argv
, HashTable
*);
926 zval
**return_value
, *object
= va_arg(argv
, zval
*);
927 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
929 if (SUCCESS
== zend_hash_find(ht
, key
->arKey
, key
->nKeyLength
, (void *) &return_value
)) {
932 zval_ptr_dtor(return_value
);
933 MAKE_STD_ZVAL(*return_value
);
934 ZVAL_NULL(*return_value
);
936 ph
->read(object
, obj
, *return_value TSRMLS_CC
);
940 return ZEND_HASH_APPLY_KEEP
;
943 static int apply_pi_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
945 zend_property_info
*pi
= p
;
946 HashTable
*ht
= va_arg(argv
, HashTable
*);
947 zval
*object
= va_arg(argv
, zval
*);
948 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
949 zval
*property
= zend_read_property(obj
->zo
.ce
, object
, pi
->name
, pi
->name_length
, 0 TSRMLS_CC
);
951 if (1||!Z_REFCOUNT_P(property
)) {
952 Z_ADDREF_P(property
);
954 zend_hash_add(ht
, pi
->name
, pi
->name_length
+ 1, (void *) &property
, sizeof(zval
*), NULL
);
956 return ZEND_HASH_APPLY_KEEP
;
959 static HashTable
*php_pq_object_debug_info(zval
*object
, int *temp TSRMLS_DC
)
962 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
966 ZEND_INIT_SYMTABLE(ht
);
968 zend_hash_apply_with_arguments(&obj
->zo
.ce
->properties_info TSRMLS_CC
, apply_pi_to_debug
, 3, ht
, object
, obj
);
969 zend_hash_apply_with_arguments(obj
->prophandler TSRMLS_CC
, apply_ph_to_debug
, 3, ht
, object
, obj
);
974 static void php_pqconn_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
976 php_pqconn_object_t
*obj
= o
;
978 RETVAL_LONG(PQstatus(obj
->intern
->conn
));
981 static void php_pqconn_object_read_transaction_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
983 php_pqconn_object_t
*obj
= o
;
985 RETVAL_LONG(PQtransactionStatus(obj
->intern
->conn
));
988 static void php_pqconn_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
990 php_pqconn_object_t
*obj
= o
;
991 char *error
= PHP_PQerrorMessage(obj
->intern
->conn
);
994 RETVAL_STRING(error
, 1);
1000 static int apply_notify_listener(void *p
, void *arg TSRMLS_DC
)
1002 php_pq_callback_t
*listener
= p
;
1003 PGnotify
*nfy
= arg
;
1004 zval
*zpid
, *zchannel
, *zmessage
;
1006 MAKE_STD_ZVAL(zpid
);
1007 ZVAL_LONG(zpid
, nfy
->be_pid
);
1008 MAKE_STD_ZVAL(zchannel
);
1009 ZVAL_STRING(zchannel
, nfy
->relname
, 1);
1010 MAKE_STD_ZVAL(zmessage
);
1011 ZVAL_STRING(zmessage
, nfy
->extra
, 1);
1013 zend_fcall_info_argn(&listener
->fci TSRMLS_CC
, 3, &zchannel
, &zmessage
, &zpid
);
1014 zend_fcall_info_call(&listener
->fci
, &listener
->fcc
, NULL
, NULL TSRMLS_CC
);
1016 zval_ptr_dtor(&zchannel
);
1017 zval_ptr_dtor(&zmessage
);
1018 zval_ptr_dtor(&zpid
);
1020 return ZEND_HASH_APPLY_KEEP
;
1023 static int apply_notify_listeners(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
1025 HashTable
*listeners
= p
;
1026 PGnotify
*nfy
= va_arg(argv
, PGnotify
*);
1028 if (0 == fnmatch(key
->arKey
, nfy
->relname
, 0)) {
1029 zend_hash_apply_with_argument(listeners
, apply_notify_listener
, nfy TSRMLS_CC
);
1032 return ZEND_HASH_APPLY_KEEP
;
1035 static void php_pqconn_notify_listeners(php_pqconn_object_t
*obj TSRMLS_DC
)
1039 while ((nfy
= PQnotifies(obj
->intern
->conn
))) {
1040 zend_hash_apply_with_arguments(&obj
->intern
->listeners TSRMLS_CC
, apply_notify_listeners
, 1, nfy
);
1045 static void php_pqconn_object_read_busy(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1047 php_pqconn_object_t
*obj
= o
;
1049 RETVAL_BOOL(PQisBusy(obj
->intern
->conn
));
1052 static void php_pqconn_object_read_encoding(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1054 php_pqconn_object_t
*obj
= o
;
1056 RETVAL_STRING(pg_encoding_to_char(PQclientEncoding(obj
->intern
->conn
)), 1);
1059 static void php_pqconn_object_write_encoding(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1061 php_pqconn_object_t
*obj
= o
;
1064 if (Z_TYPE_P(value
) != IS_STRING
) {
1065 convert_to_string_ex(&zenc
);
1068 if (0 > PQsetClientEncoding(obj
->intern
->conn
, Z_STRVAL_P(zenc
))) {
1069 zend_error(E_NOTICE
, "Unrecognized encoding '%s'", Z_STRVAL_P(zenc
));
1072 if (zenc
!= value
) {
1073 zval_ptr_dtor(&zenc
);
1077 static void php_pqconn_object_read_unbuffered(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1079 php_pqconn_object_t
*obj
= o
;
1081 RETVAL_BOOL(obj
->intern
->unbuffered
);
1084 static void php_pqconn_object_write_unbuffered(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1086 php_pqconn_object_t
*obj
= o
;
1088 obj
->intern
->unbuffered
= zend_is_true(value
);
1091 static void php_pqconn_object_read_db(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1093 php_pqconn_object_t
*obj
= o
;
1094 char *db
= PQdb(obj
->intern
->conn
);
1097 RETVAL_STRING(db
, 1);
1099 RETVAL_EMPTY_STRING();
1103 static void php_pqconn_object_read_user(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1105 php_pqconn_object_t
*obj
= o
;
1106 char *user
= PQuser(obj
->intern
->conn
);
1109 RETVAL_STRING(user
, 1);
1111 RETVAL_EMPTY_STRING();
1115 static void php_pqconn_object_read_pass(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1117 php_pqconn_object_t
*obj
= o
;
1118 char *pass
= PQpass(obj
->intern
->conn
);
1121 RETVAL_STRING(pass
, 1);
1123 RETVAL_EMPTY_STRING();
1127 static void php_pqconn_object_read_host(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1129 php_pqconn_object_t
*obj
= o
;
1130 char *host
= PQhost(obj
->intern
->conn
);
1133 RETVAL_STRING(host
, 1);
1135 RETVAL_EMPTY_STRING();
1139 static void php_pqconn_object_read_port(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1141 php_pqconn_object_t
*obj
= o
;
1142 char *port
= PQport(obj
->intern
->conn
);
1145 RETVAL_STRING(port
, 1);
1147 RETVAL_EMPTY_STRING();
1151 static void php_pqconn_object_read_options(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1153 php_pqconn_object_t
*obj
= o
;
1154 char *options
= PQoptions(obj
->intern
->conn
);
1157 RETVAL_STRING(options
, 1);
1159 RETVAL_EMPTY_STRING();
1163 static void php_pqtypes_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1165 php_pqtypes_object_t
*obj
= o
;
1167 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1170 static int has_dimension(HashTable
*ht
, zval
*member
, char **key_str
, int *key_len
, long *index TSRMLS_DC
)
1175 switch (Z_TYPE_P(member
)) {
1177 convert_to_string_ex(&tmp
);
1180 if (!is_numeric_string(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
), &lval
, NULL
, 0)) {
1181 if (member
!= tmp
) {
1182 zval_ptr_dtor(&tmp
);
1185 *key_str
= estrndup(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
));
1187 *key_len
= Z_STRLEN_P(tmp
) + 1;
1190 return zend_hash_exists(ht
, Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
) + 1);
1194 lval
= Z_LVAL_P(member
);
1198 if (member
!= tmp
) {
1199 zval_ptr_dtor(&tmp
);
1204 return zend_hash_index_exists(ht
, lval
);
1207 static int php_pqtypes_object_has_dimension(zval
*object
, zval
*member
, int check_empty TSRMLS_DC
)
1209 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1210 char *key_str
= NULL
;
1215 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1218 if (key_str
&& key_len
) {
1219 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1221 return Z_TYPE_PP(data
) != IS_NULL
;
1225 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) data
)) {
1226 return Z_TYPE_PP(data
) != IS_NULL
;
1231 return has_dimension(&obj
->intern
->types
, member
, NULL
, NULL
, NULL TSRMLS_CC
);
1237 static zval
*php_pqtypes_object_read_dimension(zval
*object
, zval
*member
, int type TSRMLS_DC
)
1240 char *key_str
= NULL
;
1242 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1244 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1247 if (key_str
&& key_len
) {
1248 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1253 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) &data
)) {
1262 static void php_pqres_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1264 php_pqres_object_t
*obj
= o
;
1266 RETVAL_LONG(PQresultStatus(obj
->intern
->res
));
1269 static void php_pqres_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1271 php_pqres_object_t
*obj
= o
;
1272 char *error
= PHP_PQresultErrorMessage(obj
->intern
->res
);
1275 RETVAL_STRING(error
, 1);
1281 static void php_pqres_object_read_num_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1283 php_pqres_object_t
*obj
= o
;
1285 RETVAL_LONG(PQntuples(obj
->intern
->res
));
1288 static void php_pqres_object_read_num_cols(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1290 php_pqres_object_t
*obj
= o
;
1292 RETVAL_LONG(PQnfields(obj
->intern
->res
));
1295 static void php_pqres_object_read_affected_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1297 php_pqres_object_t
*obj
= o
;
1299 RETVAL_LONG(atoi(PQcmdTuples(obj
->intern
->res
)));
1302 static void php_pqres_object_read_fetch_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1304 php_pqres_object_t
*obj
= o
;
1306 if (obj
->intern
->iter
) {
1307 RETVAL_LONG(obj
->intern
->iter
->fetch_type
);
1309 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
1313 static void php_pqres_object_write_fetch_type(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1315 php_pqres_object_t
*obj
= o
;
1316 zval
*zfetch_type
= value
;
1318 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
1319 convert_to_long_ex(&zfetch_type
);
1322 if (!obj
->intern
->iter
) {
1323 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
1324 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
1326 obj
->intern
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
1328 if (zfetch_type
!= value
) {
1329 zval_ptr_dtor(&zfetch_type
);
1333 static void php_pqstm_object_read_name(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1335 php_pqstm_object_t
*obj
= o
;
1337 RETVAL_STRING(obj
->intern
->name
, 1);
1340 static void php_pqstm_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1342 php_pqstm_object_t
*obj
= o
;
1344 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1347 static void php_pqtxn_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1349 php_pqtxn_object_t
*obj
= o
;
1351 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1354 static void php_pqtxn_object_read_isolation(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1356 php_pqtxn_object_t
*obj
= o
;
1358 RETVAL_LONG(obj
->intern
->isolation
);
1361 static void php_pqtxn_object_read_readonly(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1363 php_pqtxn_object_t
*obj
= o
;
1365 RETVAL_LONG(obj
->intern
->readonly
);
1368 static void php_pqtxn_object_read_deferrable(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1370 php_pqtxn_object_t
*obj
= o
;
1372 RETVAL_LONG(obj
->intern
->deferrable
);
1375 static void php_pqtxn_object_write_isolation(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1377 php_pqtxn_object_t
*obj
= o
;
1378 php_pqtxn_isolation_t orig
= obj
->intern
->isolation
;
1379 zval
*zisolation
= value
;
1382 if (Z_TYPE_P(zisolation
) != IS_LONG
) {
1383 convert_to_long_ex(&zisolation
);
1386 switch ((obj
->intern
->isolation
= Z_LVAL_P(zisolation
))) {
1387 case PHP_PQTXN_READ_COMMITTED
:
1388 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ COMMITED");
1390 case PHP_PQTXN_REPEATABLE_READ
:
1391 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION REPEATABLE READ");
1393 case PHP_PQTXN_SERIALIZABLE
:
1394 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION SERIALIZABLE");
1397 obj
->intern
->isolation
= orig
;
1402 if (zisolation
!= value
) {
1403 zval_ptr_dtor(&zisolation
);
1407 php_pqres_success(res TSRMLS_CC
);
1412 static void php_pqtxn_object_write_readonly(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1414 php_pqtxn_object_t
*obj
= o
;
1417 if ((obj
->intern
->readonly
= zend_is_true(value
))) {
1418 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ ONLY");
1420 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ WRITE");
1424 php_pqres_success(res TSRMLS_CC
);
1429 static void php_pqtxn_object_write_deferrable(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1431 php_pqtxn_object_t
*obj
= o
;
1434 if ((obj
->intern
->deferrable
= zend_is_true(value
))) {
1435 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION DEFERRABLE");
1437 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION NOT DEFERRABLE");
1441 php_pqres_success(res TSRMLS_CC
);
1446 static void php_pqcancel_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1448 php_pqcancel_object_t
*obj
= o
;
1450 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1453 static void php_pqevent_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1455 php_pqevent_object_t
*obj
= o
;
1457 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1460 static void php_pqevent_object_read_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1462 php_pqevent_object_t
*obj
= o
;
1464 RETVAL_STRING(obj
->intern
->type
, 1);
1467 static void php_pqlob_object_read_transaction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1469 php_pqlob_object_t
*obj
= o
;
1471 php_pq_object_to_zval(obj
->intern
->txn
, &return_value TSRMLS_CC
);
1474 static void php_pqlob_object_read_oid(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1476 php_pqlob_object_t
*obj
= o
;
1478 RETVAL_LONG(obj
->intern
->loid
);
1481 static void php_pqcopy_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1483 php_pqcopy_object_t
*obj
= o
;
1485 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1488 static void php_pqcopy_object_read_direction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1490 php_pqcopy_object_t
*obj
= o
;
1492 RETVAL_LONG(obj
->intern
->direction
);
1495 static void php_pqcopy_object_read_expression(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1497 php_pqcopy_object_t
*obj
= o
;
1499 RETURN_STRING(obj
->intern
->expression
, 1);
1502 static void php_pqcopy_object_read_options(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1504 php_pqcopy_object_t
*obj
= o
;
1506 RETURN_STRING(obj
->intern
->options
, 1);
1509 static zend_class_entry
*ancestor(zend_class_entry
*ce
) {
1510 while (ce
->parent
) {
1516 static zval
*php_pq_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
1518 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1519 php_pq_object_prophandler_t
*handler
;
1523 zend_error(E_WARNING
, "%s not initialized", ancestor(obj
->zo
.ce
)->name
);
1524 } else if ((SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) && handler
->read
) {
1525 if (type
== BP_VAR_R
) {
1526 ALLOC_ZVAL(return_value
);
1527 Z_SET_REFCOUNT_P(return_value
, 0);
1528 Z_UNSET_ISREF_P(return_value
);
1530 handler
->read(object
, obj
, return_value TSRMLS_CC
);
1532 zend_error(E_ERROR
, "Cannot access %s properties by reference or array key/index", ancestor(obj
->zo
.ce
)->name
);
1533 return_value
= NULL
;
1536 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
1539 return return_value
;
1542 static void php_pq_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
1544 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1545 php_pq_object_prophandler_t
*handler
;
1547 if (SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
1548 if (handler
->write
) {
1549 handler
->write(object
, obj
, value TSRMLS_CC
);
1552 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
1556 static STATUS
php_pqconn_update_socket(zval
*this_ptr
, php_pqconn_object_t
*obj TSRMLS_DC
)
1558 zval
*zsocket
, zmember
;
1564 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1567 INIT_PZVAL(&zmember
);
1568 ZVAL_STRINGL(&zmember
, "socket", sizeof("socket")-1, 0);
1569 MAKE_STD_ZVAL(zsocket
);
1571 if ((CONNECTION_BAD
!= PQstatus(obj
->intern
->conn
))
1572 && (-1 < (socket
= PQsocket(obj
->intern
->conn
)))
1573 && (stream
= php_stream_fopen_from_fd(socket
, "r+b", NULL
))) {
1574 php_stream_to_zval(stream
, zsocket
);
1580 zend_get_std_object_handlers()->write_property(getThis(), &zmember
, zsocket
, NULL TSRMLS_CC
);
1581 zval_ptr_dtor(&zsocket
);
1587 # define TSRMLS_DF(d) TSRMLS_D = (d)->ts
1588 # define TSRMLS_CF(d) (d)->ts = TSRMLS_C
1590 # define TSRMLS_DF(d)
1591 # define TSRMLS_CF(d)
1594 static void php_pqconn_event_register(PGEventRegister
*event
, php_pqconn_event_data_t
*data
)
1596 PQsetInstanceData(event
->conn
, php_pqconn_event
, data
);
1599 static void php_pqconn_event_conndestroy(PGEventConnDestroy
*event
, php_pqconn_event_data_t
*data
)
1601 PQsetInstanceData(event
->conn
, php_pqconn_event
, NULL
);
1605 static int apply_event(void *p
, void *a TSRMLS_DC
)
1609 zval
*retval
= NULL
;
1611 zend_call_method_with_1_params(evh
, Z_OBJCE_PP(evh
), NULL
, "trigger", &retval
, args
);
1613 zval_ptr_dtor(&retval
);
1616 return ZEND_HASH_APPLY_KEEP
;
1619 static void php_pqconn_event_connreset(PGEventConnReset
*event
, php_pqconn_event_data_t
*data
)
1624 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("reset"), (void *) &evhs
)) {
1625 zval
*args
, *connection
= NULL
;
1627 MAKE_STD_ZVAL(args
);
1629 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1630 add_next_index_zval(args
, connection
);
1631 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1632 zval_ptr_dtor(&args
);
1636 static zval
*result_instance_zval(PGresult
*res TSRMLS_DC
)
1638 zval
*rid
= PQresultInstanceData(res
, php_pqconn_event
);
1641 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1645 ZEND_INIT_SYMTABLE(&r
->bound
);
1646 rid
->type
= IS_OBJECT
;
1647 rid
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1649 PQresultSetInstanceData(res
, php_pqconn_event
, rid
);
1656 static void php_pqconn_event_resultcreate(PGEventResultCreate
*event
, php_pqconn_event_data_t
*data
)
1661 /* event listener */
1662 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("result"), (void *) &evhs
)) {
1663 zval
*args
, *connection
= NULL
, *res
= result_instance_zval(event
->result TSRMLS_CC
);
1665 MAKE_STD_ZVAL(args
);
1667 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1668 add_next_index_zval(args
, connection
);
1669 add_next_index_zval(args
, res
);
1670 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1671 zval_ptr_dtor(&args
);
1674 /* async callback */
1675 if (data
->obj
->intern
->onevent
.fci
.size
> 0) {
1676 zval
*res
= result_instance_zval(event
->result TSRMLS_CC
);
1678 zend_fcall_info_argn(&data
->obj
->intern
->onevent
.fci TSRMLS_CC
, 1, &res
);
1679 zend_fcall_info_call(&data
->obj
->intern
->onevent
.fci
, &data
->obj
->intern
->onevent
.fcc
, NULL
, NULL TSRMLS_CC
);
1680 zval_ptr_dtor(&res
);
1684 static int php_pqconn_event(PGEventId id
, void *e
, void *data
)
1687 case PGEVT_REGISTER
:
1688 php_pqconn_event_register(e
, data
);
1690 case PGEVT_CONNDESTROY
:
1691 php_pqconn_event_conndestroy(e
, data
);
1693 case PGEVT_CONNRESET
:
1694 php_pqconn_event_connreset(e
, data
);
1696 case PGEVT_RESULTCREATE
:
1697 php_pqconn_event_resultcreate(e
, data
);
1706 static php_pqconn_event_data_t
*php_pqconn_event_data_init(php_pqconn_object_t
*obj TSRMLS_DC
)
1708 php_pqconn_event_data_t
*data
= emalloc(sizeof(*data
));
1716 static void php_pqconn_notice_recv(void *p
, const PGresult
*res
)
1718 php_pqconn_event_data_t
*data
= p
;
1722 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("notice"), (void *) &evhs
)) {
1723 zval
*args
, *connection
= NULL
;
1725 MAKE_STD_ZVAL(args
);
1727 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1728 add_next_index_zval(args
, connection
);
1729 add_next_index_string(args
, PHP_PQresultErrorMessage(res
), 1);
1730 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1731 zval_ptr_dtor(&args
);
1735 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
1736 ZEND_ARG_INFO(0, dsn
)
1737 ZEND_ARG_INFO(0, async
)
1738 ZEND_END_ARG_INFO();
1739 static PHP_METHOD(pqconn
, __construct
) {
1740 zend_error_handling zeh
;
1743 zend_bool async
= 0;
1745 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1746 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|sb", &dsn_str
, &dsn_len
, &async
)) {
1747 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1748 php_pqconn_event_data_t
*data
= php_pqconn_event_data_init(obj TSRMLS_CC
);
1750 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
1752 zend_hash_init(&obj
->intern
->listeners
, 0, NULL
, (dtor_func_t
) zend_hash_destroy
, 0);
1753 zend_hash_init(&obj
->intern
->eventhandlers
, 0, NULL
, ZVAL_PTR_DTOR
, 0);
1757 obj
->intern
->conn
= PQconnectStart(dsn_str
);
1758 obj
->intern
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
1760 obj
->intern
->conn
= PQconnectdb(dsn_str
);
1763 PQsetNoticeReceiver(obj
->intern
->conn
, php_pqconn_notice_recv
, data
);
1764 PQregisterEventProc(obj
->intern
->conn
, php_pqconn_event
, "ext-pq", data
);
1766 if (SUCCESS
!= php_pqconn_update_socket(getThis(), obj TSRMLS_CC
)) {
1767 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1770 zend_restore_error_handling(&zeh TSRMLS_CC
);
1773 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
1774 ZEND_END_ARG_INFO();
1775 static PHP_METHOD(pqconn
, reset
) {
1776 if (SUCCESS
== zend_parse_parameters_none()) {
1777 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1780 PQreset(obj
->intern
->conn
);
1782 if (CONNECTION_OK
== PQstatus(obj
->intern
->conn
)) {
1785 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection reset failed: (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1788 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1794 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset_async
, 0, 0, 0)
1795 ZEND_END_ARG_INFO();
1796 static PHP_METHOD(pqconn
, resetAsync
) {
1797 if (SUCCESS
== zend_parse_parameters_none()) {
1798 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1801 if (PQresetStart(obj
->intern
->conn
)) {
1802 obj
->intern
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
1806 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1812 static void php_pqconn_add_listener(php_pqconn_object_t
*obj
, const char *channel_str
, size_t channel_len
, php_pq_callback_t
*listener TSRMLS_DC
)
1814 HashTable ht
, *existing_listeners
;
1816 php_pq_callback_addref(listener
);
1818 if (SUCCESS
== zend_hash_find(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &existing_listeners
)) {
1819 zend_hash_next_index_insert(existing_listeners
, (void *) listener
, sizeof(*listener
), NULL
);
1821 zend_hash_init(&ht
, 1, NULL
, (dtor_func_t
) php_pq_callback_dtor
, 0);
1822 zend_hash_next_index_insert(&ht
, (void *) listener
, sizeof(*listener
), NULL
);
1823 zend_hash_add(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &ht
, sizeof(HashTable
), NULL
);
1827 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_listen
, 0, 0, 0)
1828 ZEND_ARG_INFO(0, channel
)
1829 ZEND_ARG_INFO(0, callable
)
1830 ZEND_END_ARG_INFO();
1831 static PHP_METHOD(pqconn
, listen
) {
1832 char *channel_str
= NULL
;
1833 int channel_len
= 0;
1834 php_pq_callback_t listener
;
1836 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sf", &channel_str
, &channel_len
, &listener
.fci
, &listener
.fcc
)) {
1837 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1839 obj
->intern
->poller
= PQconsumeInput
;
1842 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, channel_str
, channel_len
);
1844 if (quoted_channel
) {
1848 spprintf(&cmd
, 0, "LISTEN %s", channel_str
);
1849 res
= PQexec(obj
->intern
->conn
, cmd
);
1852 PQfreemem(quoted_channel
);
1855 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1856 php_pqconn_add_listener(obj
, channel_str
, channel_len
, &listener TSRMLS_CC
);
1863 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not install listener (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1867 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1869 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape channel identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1872 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1878 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_notify
, 0, 0, 2)
1879 ZEND_ARG_INFO(0, channel
)
1880 ZEND_ARG_INFO(0, message
)
1881 ZEND_END_ARG_INFO();
1882 static PHP_METHOD(pqconn
, notify
) {
1883 char *channel_str
, *message_str
;
1884 int channel_len
, message_len
;
1886 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &channel_str
, &channel_len
, &message_str
, &message_len
)) {
1887 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1891 char *params
[2] = {channel_str
, message_str
};
1893 res
= PQexecParams(obj
->intern
->conn
, "select pg_notify($1, $2)", 2, NULL
, (const char *const*) params
, NULL
, NULL
, 0);
1896 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1903 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not notify listeners (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1907 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1910 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1916 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
1917 ZEND_END_ARG_INFO();
1918 static PHP_METHOD(pqconn
, poll
) {
1919 if (SUCCESS
== zend_parse_parameters_none()) {
1920 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1923 if (obj
->intern
->poller
) {
1924 if (obj
->intern
->poller
== PQconsumeInput
) {
1925 RETVAL_LONG(obj
->intern
->poller(obj
->intern
->conn
) * PGRES_POLLING_OK
);
1926 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1929 RETURN_LONG(obj
->intern
->poller(obj
->intern
->conn
));
1932 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
1935 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1941 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
1942 ZEND_ARG_INFO(0, query
)
1943 ZEND_END_ARG_INFO();
1944 static PHP_METHOD(pqconn
, exec
) {
1945 zend_error_handling zeh
;
1949 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1950 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
1951 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1954 PGresult
*res
= PQexec(obj
->intern
->conn
, query_str
);
1956 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1959 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1960 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1963 ZEND_INIT_SYMTABLE(&r
->bound
);
1964 return_value
->type
= IS_OBJECT
;
1965 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1968 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1971 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1974 zend_restore_error_handling(&zeh TSRMLS_CC
);
1977 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_get_result
, 0, 0, 0)
1978 ZEND_END_ARG_INFO();
1979 static PHP_METHOD(pqconn
, getResult
) {
1980 if (SUCCESS
== zend_parse_parameters_none()) {
1981 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1984 PGresult
*res
= PQgetResult(obj
->intern
->conn
);
1987 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1990 ZEND_INIT_SYMTABLE(&r
->bound
);
1991 return_value
->type
= IS_OBJECT
;
1992 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1997 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2003 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_async
, 0, 0, 1)
2004 ZEND_ARG_INFO(0, query
)
2005 ZEND_ARG_INFO(0, callable
)
2006 ZEND_END_ARG_INFO();
2007 static PHP_METHOD(pqconn
, execAsync
) {
2008 zend_error_handling zeh
;
2009 php_pq_callback_t resolver
= {{0}};
2013 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2014 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|f", &query_str
, &query_len
, &resolver
.fci
, &resolver
.fcc
)) {
2015 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2018 php_pq_callback_dtor(&obj
->intern
->onevent
);
2019 if (resolver
.fci
.size
> 0) {
2020 obj
->intern
->onevent
= resolver
;
2021 php_pq_callback_addref(&obj
->intern
->onevent
);
2024 obj
->intern
->poller
= PQconsumeInput
;
2026 if (PQsendQuery(obj
->intern
->conn
, query_str
)) {
2027 if (obj
->intern
->unbuffered
) {
2028 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2029 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2034 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2038 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2042 zend_restore_error_handling(&zeh TSRMLS_CC
);
2045 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
2050 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
2051 convert_to_long_ex(ztype
);
2054 **types
= Z_LVAL_PP(ztype
);
2057 if (*ztype
!= *(zval
**)p
) {
2058 zval_ptr_dtor(ztype
);
2060 return ZEND_HASH_APPLY_KEEP
;
2063 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
2069 params
= (char ***) va_arg(argv
, char ***);
2070 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
2072 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
2076 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
2077 convert_to_string_ex(zparam
);
2080 **params
= Z_STRVAL_PP(zparam
);
2083 if (*zparam
!= *(zval
**)p
) {
2084 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
2087 return ZEND_HASH_APPLY_KEEP
;
2090 static int php_pq_types_to_array(HashTable
*ht
, Oid
**types TSRMLS_DC
)
2092 int count
= zend_hash_num_elements(ht
);
2099 /* +1 for when less types than params are specified */
2100 *types
= tmp
= ecalloc(count
+ 1, sizeof(Oid
));
2101 zend_hash_apply_with_argument(ht
, apply_to_oid
, &tmp TSRMLS_CC
);
2107 static int php_pq_params_to_array(HashTable
*ht
, char ***params
, HashTable
*zdtor TSRMLS_DC
)
2109 int count
= zend_hash_num_elements(ht
);
2116 *params
= tmp
= ecalloc(count
, sizeof(char *));
2117 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_param
, 2, &tmp
, zdtor
);
2123 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
2124 ZEND_ARG_INFO(0, query
)
2125 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2126 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2127 ZEND_END_ARG_INFO();
2128 static PHP_METHOD(pqconn
, execParams
) {
2129 zend_error_handling zeh
;
2133 zval
*ztypes
= NULL
;
2135 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2136 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
2137 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2143 char **params
= NULL
;
2146 ZEND_INIT_SYMTABLE(&zdtor
);
2147 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2150 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2153 res
= PQexecParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0);
2155 zend_hash_destroy(&zdtor
);
2163 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2166 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2167 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2170 ZEND_INIT_SYMTABLE(&r
->bound
);
2171 return_value
->type
= IS_OBJECT
;
2172 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2175 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2179 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2183 zend_restore_error_handling(&zeh TSRMLS_CC
);
2186 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params_async
, 0, 0, 2)
2187 ZEND_ARG_INFO(0, query
)
2188 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2189 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2190 ZEND_ARG_INFO(0, callable
)
2191 ZEND_END_ARG_INFO();
2192 static PHP_METHOD(pqconn
, execParamsAsync
) {
2193 zend_error_handling zeh
;
2194 php_pq_callback_t resolver
= {{0}};
2198 zval
*ztypes
= NULL
;
2200 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2201 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!f", &query_str
, &query_len
, &zparams
, &ztypes
, &resolver
.fci
, &resolver
.fcc
)) {
2202 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2207 char **params
= NULL
;
2210 ZEND_INIT_SYMTABLE(&zdtor
);
2211 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2214 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2217 php_pq_callback_dtor(&obj
->intern
->onevent
);
2218 if (resolver
.fci
.size
> 0) {
2219 obj
->intern
->onevent
= resolver
;
2220 php_pq_callback_addref(&obj
->intern
->onevent
);
2223 obj
->intern
->poller
= PQconsumeInput
;
2225 if (PQsendQueryParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0)) {
2226 if (obj
->intern
->unbuffered
) {
2227 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2228 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2233 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2237 zend_hash_destroy(&zdtor
);
2245 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2248 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2252 zend_restore_error_handling(&zeh TSRMLS_CC
);
2255 static STATUS
php_pqconn_prepare(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2263 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2267 count
= zend_hash_num_elements(typest
);
2268 php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2271 res
= PQprepare(obj
->intern
->conn
, name
, query
, count
, types
);
2278 rv
= php_pqres_success(res TSRMLS_CC
);
2282 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2288 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
2289 ZEND_ARG_INFO(0, type
)
2290 ZEND_ARG_INFO(0, query
)
2291 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2292 ZEND_END_ARG_INFO();
2293 static PHP_METHOD(pqconn
, prepare
) {
2294 zend_error_handling zeh
;
2295 zval
*ztypes
= NULL
;
2296 char *name_str
, *query_str
;
2297 int name_len
, *query_len
;
2299 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2300 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2301 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2304 if (SUCCESS
== php_pqconn_prepare(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2305 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2307 php_pq_object_addref(obj TSRMLS_CC
);
2309 stm
->name
= estrdup(name_str
);
2310 ZEND_INIT_SYMTABLE(&stm
->bound
);
2312 return_value
->type
= IS_OBJECT
;
2313 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2315 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2317 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2320 zend_restore_error_handling(&zeh TSRMLS_CC
);
2323 static STATUS
php_pqconn_prepare_async(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2330 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2334 count
= php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2337 if (PQsendPrepare(obj
->intern
->conn
, name
, query
, count
, types
)) {
2338 if (obj
->intern
->unbuffered
) {
2339 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2340 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2345 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2356 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare_async
, 0, 0, 2)
2357 ZEND_ARG_INFO(0, type
)
2358 ZEND_ARG_INFO(0, query
)
2359 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2360 ZEND_END_ARG_INFO();
2361 static PHP_METHOD(pqconn
, prepareAsync
) {
2362 zend_error_handling zeh
;
2363 zval
*ztypes
= NULL
;
2364 char *name_str
, *query_str
;
2365 int name_len
, *query_len
;
2367 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2368 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2369 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2372 obj
->intern
->poller
= PQconsumeInput
;
2373 if (SUCCESS
== php_pqconn_prepare_async(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2374 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2376 php_pq_object_addref(obj TSRMLS_CC
);
2378 stm
->name
= estrdup(name_str
);
2379 ZEND_INIT_SYMTABLE(&stm
->bound
);
2381 return_value
->type
= IS_OBJECT
;
2382 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2384 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2386 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2389 zend_restore_error_handling(&zeh TSRMLS_CC
);
2392 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote
, 0, 0, 1)
2393 ZEND_ARG_INFO(0, string
)
2394 ZEND_END_ARG_INFO();
2395 static PHP_METHOD(pqconn
, quote
) {
2399 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2400 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2403 char *quoted
= PQescapeLiteral(obj
->intern
->conn
, str
, len
);
2406 RETVAL_STRING(quoted
, 1);
2409 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote string (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2413 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2419 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote_name
, 0, 0, 1)
2420 ZEND_ARG_INFO(0, type
)
2421 ZEND_END_ARG_INFO();
2422 static PHP_METHOD(pqconn
, quoteName
) {
2426 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2427 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2430 char *quoted
= PQescapeIdentifier(obj
->intern
->conn
, str
, len
);
2433 RETVAL_STRING(quoted
, 1);
2436 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote name (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2440 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2446 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_escape_bytea
, 0, 0, 1)
2447 ZEND_ARG_INFO(0, bytea
)
2448 ZEND_END_ARG_INFO();
2449 static PHP_METHOD(pqconn
, escapeBytea
) {
2453 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2454 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2458 char *escaped_str
= (char *) PQescapeByteaConn(obj
->intern
->conn
, (unsigned char *) str
, len
, &escaped_len
);
2461 RETVAL_STRINGL(escaped_str
, escaped_len
- 1, 1);
2462 PQfreemem(escaped_str
);
2464 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2468 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2474 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_unescape_bytea
, 0, 0, 1)
2475 ZEND_ARG_INFO(0, bytea
)
2476 ZEND_END_ARG_INFO();
2477 static PHP_METHOD(pqconn
, unescapeBytea
) {
2481 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2482 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2485 size_t unescaped_len
;
2486 char *unescaped_str
= (char *) PQunescapeBytea((unsigned char *)str
, &unescaped_len
);
2488 if (unescaped_str
) {
2489 RETVAL_STRINGL(unescaped_str
, unescaped_len
, 1);
2490 PQfreemem(unescaped_str
);
2492 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not unescape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2496 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2502 static const char *isolation_level(long *isolation
) {
2503 switch (*isolation
) {
2504 case PHP_PQTXN_SERIALIZABLE
:
2505 return "SERIALIZABLE";
2506 case PHP_PQTXN_REPEATABLE_READ
:
2507 return "REPEATABLE READ";
2509 *isolation
= PHP_PQTXN_READ_COMMITTED
;
2511 case PHP_PQTXN_READ_COMMITTED
:
2512 return "READ COMMITTED";
2516 static STATUS
php_pqconn_start_transaction(zval
*zconn
, php_pqconn_object_t
*conn_obj
, long isolation
, zend_bool readonly
, zend_bool deferrable TSRMLS_DC
)
2519 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2522 if (conn_obj
->intern
) {
2526 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2527 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2529 res
= PQexec(conn_obj
->intern
->conn
, cmd
);
2534 STATUS rv
= php_pqres_success(res TSRMLS_CC
);
2539 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2543 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2548 static STATUS
php_pqconn_start_transaction_async(zval
*zconn
, php_pqconn_object_t
*conn_obj
, long isolation
, zend_bool readonly
, zend_bool deferrable TSRMLS_DC
)
2551 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2554 if (conn_obj
->intern
->conn
) {
2557 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2558 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2560 if (PQsendQuery(conn_obj
->intern
->conn
, cmd
)) {
2561 conn_obj
->intern
->poller
= PQconsumeInput
;
2566 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2570 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2575 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction
, 0, 0, 0)
2576 ZEND_ARG_INFO(0, isolation
)
2577 ZEND_ARG_INFO(0, readonly
)
2578 ZEND_ARG_INFO(0, deferrable
)
2579 ZEND_END_ARG_INFO();
2580 static PHP_METHOD(pqconn
, startTransaction
) {
2581 zend_error_handling zeh
;
2582 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2583 zend_bool readonly
= 0, deferrable
= 0;
2585 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2586 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2588 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2590 rv
= php_pqconn_start_transaction(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2592 if (SUCCESS
== rv
) {
2593 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2595 php_pq_object_addref(obj TSRMLS_CC
);
2597 txn
->isolation
= isolation
;
2598 txn
->readonly
= readonly
;
2599 txn
->deferrable
= deferrable
;
2601 return_value
->type
= IS_OBJECT
;
2602 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2605 zend_restore_error_handling(&zeh TSRMLS_CC
);
2609 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction_async
, 0, 0, 0)
2610 ZEND_ARG_INFO(0, isolation
)
2611 ZEND_ARG_INFO(0, readonly
)
2612 ZEND_ARG_INFO(0, deferrable
)
2613 ZEND_END_ARG_INFO();
2614 static PHP_METHOD(pqconn
, startTransactionAsync
) {
2615 zend_error_handling zeh
;
2616 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2617 zend_bool readonly
= 0, deferrable
= 0;
2619 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2620 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2622 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2624 rv
= php_pqconn_start_transaction_async(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2626 if (SUCCESS
== rv
) {
2627 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2629 php_pq_object_addref(obj TSRMLS_CC
);
2631 txn
->isolation
= isolation
;
2632 txn
->readonly
= readonly
;
2633 txn
->deferrable
= deferrable
;
2635 return_value
->type
= IS_OBJECT
;
2636 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2639 zend_restore_error_handling(&zeh TSRMLS_CC
);
2642 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_trace
, 0, 0, 0)
2643 ZEND_ARG_INFO(0, stdio_stream
)
2644 ZEND_END_ARG_INFO();
2645 static PHP_METHOD(pqconn
, trace
) {
2646 zval
*zstream
= NULL
;
2648 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|r!", &zstream
)) {
2649 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2653 php_stream
*stream
= NULL
;
2655 php_stream_from_zval(stream
, &zstream
);
2657 if (SUCCESS
== php_stream_cast(stream
, PHP_STREAM_AS_STDIO
, (void *) &fp
, REPORT_ERRORS
)) {
2658 stream
->flags
|= PHP_STREAM_FLAG_NO_CLOSE
;
2659 PQtrace(obj
->intern
->conn
, fp
);
2665 PQuntrace(obj
->intern
->conn
);
2669 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2675 static zend_function_entry php_pqconn_methods
[] = {
2676 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2677 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
2678 PHP_ME(pqconn
, resetAsync
, ai_pqconn_reset_async
, ZEND_ACC_PUBLIC
)
2679 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
2680 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
2681 PHP_ME(pqconn
, execAsync
, ai_pqconn_exec_async
, ZEND_ACC_PUBLIC
)
2682 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
2683 PHP_ME(pqconn
, execParamsAsync
, ai_pqconn_exec_params_async
, ZEND_ACC_PUBLIC
)
2684 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
2685 PHP_ME(pqconn
, prepareAsync
, ai_pqconn_prepare_async
, ZEND_ACC_PUBLIC
)
2686 PHP_ME(pqconn
, listen
, ai_pqconn_listen
, ZEND_ACC_PUBLIC
)
2687 PHP_ME(pqconn
, notify
, ai_pqconn_notify
, ZEND_ACC_PUBLIC
)
2688 PHP_ME(pqconn
, getResult
, ai_pqconn_get_result
, ZEND_ACC_PUBLIC
)
2689 PHP_ME(pqconn
, quote
, ai_pqconn_quote
, ZEND_ACC_PUBLIC
)
2690 PHP_ME(pqconn
, quoteName
, ai_pqconn_quote_name
, ZEND_ACC_PUBLIC
)
2691 PHP_ME(pqconn
, escapeBytea
, ai_pqconn_escape_bytea
, ZEND_ACC_PUBLIC
)
2692 PHP_ME(pqconn
, unescapeBytea
, ai_pqconn_unescape_bytea
, ZEND_ACC_PUBLIC
)
2693 PHP_ME(pqconn
, startTransaction
, ai_pqconn_start_transaction
, ZEND_ACC_PUBLIC
)
2694 PHP_ME(pqconn
, startTransactionAsync
, ai_pqconn_start_transaction_async
, ZEND_ACC_PUBLIC
)
2695 PHP_ME(pqconn
, trace
, ai_pqconn_trace
, ZEND_ACC_PUBLIC
)
2699 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_construct
, 0, 0, 1)
2700 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
2701 ZEND_END_ARG_INFO();
2702 static PHP_METHOD(pqtypes
, __construct
) {
2703 zend_error_handling zeh
;
2706 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2707 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
2708 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2710 if (conn_obj
->intern
) {
2711 zval
*retval
= NULL
;
2712 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2714 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
2715 obj
->intern
->conn
= conn_obj
;
2716 php_pq_object_addref(conn_obj TSRMLS_CC
);
2717 zend_hash_init(&obj
->intern
->types
, 300, NULL
, ZVAL_PTR_DTOR
, 0);
2719 zend_call_method_with_0_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "refresh", &retval
);
2721 zval_ptr_dtor(&retval
);
2724 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2727 zend_restore_error_handling(&zeh TSRMLS_CC
);
2730 #define PHP_PQ_TYPES_QUERY \
2731 "select t.oid, t.* " \
2732 "from pg_type t join pg_namespace n on t.typnamespace=n.oid " \
2733 "where typisdefined " \
2735 "and nspname in ('public', 'pg_catalog')"
2737 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_refresh
, 0, 0, 0)
2738 ZEND_END_ARG_INFO();
2739 static PHP_METHOD(pqtypes
, refresh
) {
2740 if (SUCCESS
== zend_parse_parameters_none()) {
2741 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2744 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, PHP_PQ_TYPES_QUERY
);
2746 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2749 if (PGRES_TUPLES_OK
== PQresultStatus(res
)) {
2752 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
2753 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT
, NULL TSRMLS_CC
);
2754 long oid
= atol(PQgetvalue(res
, r
, 0 ));
2755 char *name
= PQgetvalue(res
, r
, 1);
2759 zend_hash_index_update(&obj
->intern
->types
, oid
, (void *) &row
, sizeof(zval
*), NULL
);
2760 zend_hash_add(&obj
->intern
->types
, name
, strlen(name
) + 1, (void *) &row
, sizeof(zval
*), NULL
);
2763 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQresultErrorMessage(res
));
2767 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2771 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Types not initialized");
2776 static zend_function_entry php_pqtypes_methods
[] = {
2777 PHP_ME(pqtypes
, __construct
, ai_pqtypes_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2778 PHP_ME(pqtypes
, refresh
, ai_pqtypes_refresh
, ZEND_ACC_PUBLIC
)
2782 static STATUS
php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type
, zval
***row TSRMLS_DC
)
2785 php_pqres_fetch_t orig_fetch
;
2788 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2791 if (!obj
->intern
->iter
) {
2792 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
2793 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2795 orig_fetch
= obj
->intern
->iter
->fetch_type
;
2796 obj
->intern
->iter
->fetch_type
= fetch_type
;
2797 if (SUCCESS
== (rv
= obj
->intern
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
))) {
2798 obj
->intern
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->intern
->iter
, row TSRMLS_CC
);
2799 obj
->intern
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2801 obj
->intern
->iter
->fetch_type
= orig_fetch
;
2806 typedef struct php_pqres_col
{
2811 static STATUS
column_nn(php_pqres_object_t
*obj
, zval
*zcol
, php_pqres_col_t
*col TSRMLS_DC
)
2816 switch (Z_TYPE_P(zcol
)) {
2818 convert_to_string(zcol
);
2822 if (!is_numeric_string(Z_STRVAL_P(zcol
), Z_STRLEN_P(zcol
), &index
, NULL
, 0)) {
2823 name
= Z_STRVAL_P(zcol
);
2828 index
= Z_LVAL_P(zcol
);
2834 col
->num
= PQfnumber(obj
->intern
->res
, name
);
2836 col
->name
= PQfname(obj
->intern
->res
, index
);
2841 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column at index %ld", index
);
2844 if (col
->num
== -1) {
2845 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column with name '%s'", name
);
2851 static int compare_index(const void *lptr
, const void *rptr TSRMLS_DC
)
2853 const Bucket
*l
= *(const Bucket
**) lptr
;
2854 const Bucket
*r
= *(const Bucket
**) rptr
;
2865 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_bind
, 0, 0, 2)
2866 ZEND_ARG_INFO(0, col
)
2867 ZEND_ARG_INFO(1, ref
)
2868 ZEND_END_ARG_INFO();
2869 static PHP_METHOD(pqres
, bind
) {
2872 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z/z", &zcol
, &zref
)) {
2873 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2876 php_pqres_col_t col
;
2878 if (SUCCESS
== column_nn(obj
, zcol
, &col TSRMLS_CC
)) {
2880 if (SUCCESS
== zend_hash_index_update(&obj
->intern
->bound
, col
.num
, (void *) &zref
, sizeof(zval
*), NULL
)) {
2881 zend_hash_sort(&obj
->intern
->bound
, zend_qsort
, compare_index
, 0 TSRMLS_CC
);
2884 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to bind column %s@%d", col
.name
, col
.num
);
2891 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
2897 static int apply_bound(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
2899 zval
**zvalue
, **zbound
= p
;
2900 zval
**zrow
= va_arg(argv
, zval
**);
2902 if (SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(zrow
), key
->h
, (void *) &zvalue
)) {
2904 ZVAL_COPY_VALUE(*zbound
, *zvalue
);
2906 zval_ptr_dtor(zvalue
);
2907 Z_ADDREF_P(*zbound
);
2909 return ZEND_HASH_APPLY_KEEP
;
2911 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column ad index %lu", key
->h
);
2912 return ZEND_HASH_APPLY_STOP
;
2916 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_bound
, 0, 0, 0)
2917 ZEND_END_ARG_INFO();
2918 static PHP_METHOD(pqres
, fetchBound
) {
2919 zend_error_handling zeh
;
2921 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2922 if (SUCCESS
== zend_parse_parameters_none()) {
2923 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2928 if (SUCCESS
== php_pqres_iteration(getThis(), obj
, PHP_PQRES_FETCH_ARRAY
, &row TSRMLS_CC
)) {
2930 zend_hash_apply_with_arguments(&obj
->intern
->bound TSRMLS_CC
, apply_bound
, 1, row
);
2931 RETVAL_ZVAL(*row
, 1, 0);
2936 zend_restore_error_handling(&zeh TSRMLS_CC
);
2939 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
2940 ZEND_ARG_INFO(0, fetch_type
)
2941 ZEND_END_ARG_INFO();
2942 static PHP_METHOD(pqres
, fetchRow
) {
2943 zend_error_handling zeh
;
2944 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2945 long fetch_type
= -1;
2947 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2948 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
2952 if (fetch_type
== -1) {
2953 fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
2955 php_pqres_iteration(getThis(), obj
, fetch_type
, &row TSRMLS_CC
);
2958 RETVAL_ZVAL(*row
, 1, 0);
2961 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
2964 zend_restore_error_handling(&zeh TSRMLS_CC
);
2967 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
2970 HashTable
*ht
= HASH_OF(row
);
2971 int count
= zend_hash_num_elements(ht
);
2974 zend_hash_internal_pointer_reset(ht
);
2976 zend_hash_move_forward(ht
);
2978 zend_hash_get_current_data(ht
, (void *) &data
);
2980 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d exceeds column count %d", col
, count
);
2985 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 0)
2986 ZEND_ARG_INFO(0, col_num
)
2987 ZEND_END_ARG_INFO();
2988 static PHP_METHOD(pqres
, fetchCol
) {
2989 zend_error_handling zeh
;
2992 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2993 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_col
)) {
2994 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2999 php_pqres_iteration(getThis(), obj
, obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: 0, &row TSRMLS_CC
);
3002 zval
**col
= column_at(*row
, fetch_col TSRMLS_CC
);
3005 RETVAL_ZVAL(*col
, 1, 0);
3009 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3012 zend_restore_error_handling(&zeh TSRMLS_CC
);
3015 static int apply_to_col(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
3018 php_pqres_object_t
*obj
= va_arg(argv
, php_pqres_object_t
*);
3019 php_pqres_col_t
*col
, **cols
= va_arg(argv
, php_pqres_col_t
**);
3020 STATUS
*rv
= va_arg(argv
, STATUS
*);
3023 if (SUCCESS
== column_nn(obj
, *c
, col TSRMLS_CC
)) {
3027 return ZEND_HASH_APPLY_STOP
;
3031 return ZEND_HASH_APPLY_KEEP
;
3034 static php_pqres_col_t
*php_pqres_convert_to_cols(php_pqres_object_t
*obj
, HashTable
*ht TSRMLS_DC
)
3036 php_pqres_col_t
*tmp
, *cols
= ecalloc(zend_hash_num_elements(ht
), sizeof(*cols
));
3037 STATUS rv
= SUCCESS
;
3040 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_col
, 2, obj
, &tmp
, &rv
);
3042 if (SUCCESS
== rv
) {
3050 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_map
, 0, 0, 0)
3051 ZEND_ARG_INFO(0, keys
)
3052 ZEND_ARG_INFO(0, vals
)
3053 ZEND_ARG_INFO(0, fetch_type
)
3054 ZEND_END_ARG_INFO();
3055 static PHP_METHOD(pqres
, map
) {
3056 zend_error_handling zeh
;
3057 zval
*zkeys
= 0, *zvals
= 0;
3058 long fetch_type
= -1;
3061 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3062 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z/!z/!l", &zkeys
, &zvals
, &fetch_type
)) {
3063 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3067 php_pqres_col_t def
= {PQfname(obj
->intern
->res
, 0), 0}, *keys
= NULL
, *vals
= NULL
;
3070 convert_to_array(zkeys
);
3072 if ((ks
= zend_hash_num_elements(Z_ARRVAL_P(zkeys
)))) {
3073 keys
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zkeys
) TSRMLS_CC
);
3083 convert_to_array(zvals
);
3085 if ((vs
= zend_hash_num_elements(Z_ARRVAL_P(zvals
)))) {
3086 vals
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zvals
) TSRMLS_CC
);
3090 if (fetch_type
== -1) {
3091 fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
3098 switch (fetch_type
) {
3099 case PHP_PQRES_FETCH_ARRAY
:
3100 case PHP_PQRES_FETCH_ASSOC
:
3101 array_init(return_value
);
3103 case PHP_PQRES_FETCH_OBJECT
:
3104 object_init(return_value
);
3107 for (r
= 0, rows
= PQntuples(obj
->intern
->res
); r
< rows
; ++r
) {
3110 cur
= &return_value
;
3111 for (k
= 0; k
< ks
; ++k
) {
3112 char *key
= PQgetvalue(obj
->intern
->res
, r
, keys
[k
].num
);
3113 int len
= PQgetlength(obj
->intern
->res
, r
, keys
[k
].num
);
3115 if (SUCCESS
!= zend_symtable_find(HASH_OF(*cur
), key
, len
+ 1, (void *) &cur
)) {
3119 switch (fetch_type
) {
3120 case PHP_PQRES_FETCH_ARRAY
:
3121 case PHP_PQRES_FETCH_ASSOC
:
3124 case PHP_PQRES_FETCH_OBJECT
:
3128 if (SUCCESS
!= zend_symtable_update(HASH_OF(*cur
), key
, len
+ 1, (void *) &tmp
, sizeof(zval
*), (void *) &cur
)) {
3129 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create map");
3135 for (v
= 0; v
< vs
; ++v
) {
3136 char *val
= PQgetvalue(obj
->intern
->res
, r
, vals
[v
].num
);
3137 int len
= PQgetlength(obj
->intern
->res
, r
, vals
[v
].num
);
3139 switch (fetch_type
) {
3140 case PHP_PQRES_FETCH_ARRAY
:
3141 add_index_stringl(*cur
, vals
[v
].num
, val
, len
, 1);
3143 case PHP_PQRES_FETCH_ASSOC
:
3144 add_assoc_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
3146 case PHP_PQRES_FETCH_OBJECT
:
3147 add_property_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
3152 php_pqres_row_to_zval(obj
->intern
->res
, r
, fetch_type
, cur TSRMLS_CC
);
3158 if (keys
&& keys
!= &def
) {
3165 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3168 zend_restore_error_handling(&zeh TSRMLS_CC
);
3171 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_count
, 0, 0, 0)
3172 ZEND_END_ARG_INFO();
3173 static PHP_METHOD(pqres
, count
) {
3174 if (SUCCESS
== zend_parse_parameters_none()) {
3177 if (SUCCESS
== php_pqres_count_elements(getThis(), &count TSRMLS_CC
)) {
3180 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3185 static zend_function_entry php_pqres_methods
[] = {
3186 PHP_ME(pqres
, bind
, ai_pqres_bind
, ZEND_ACC_PUBLIC
)
3187 PHP_ME(pqres
, fetchBound
, ai_pqres_fetch_bound
, ZEND_ACC_PUBLIC
)
3188 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
3189 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
3190 PHP_ME(pqres
, count
, ai_pqres_count
, ZEND_ACC_PUBLIC
)
3191 PHP_ME(pqres
, map
, ai_pqres_map
, ZEND_ACC_PUBLIC
)
3195 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
3196 ZEND_ARG_OBJ_INFO(0, Connection
, pq
\\Connection
, 0)
3197 ZEND_ARG_INFO(0, type
)
3198 ZEND_ARG_INFO(0, query
)
3199 ZEND_ARG_ARRAY_INFO(0, types
, 1)
3200 ZEND_ARG_INFO(0, async
)
3201 ZEND_END_ARG_INFO();
3202 static PHP_METHOD(pqstm
, __construct
) {
3203 zend_error_handling zeh
;
3204 zval
*zconn
, *ztypes
= NULL
;
3205 char *name_str
, *query_str
;
3206 int name_len
, *query_len
;
3207 zend_bool async
= 0;
3209 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3210 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Oss|a/!b", &zconn
, php_pqconn_class_entry
, &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
, &async
)) {
3211 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3212 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3214 if (conn_obj
->intern
) {
3217 conn_obj
->intern
->poller
= PQconsumeInput
;
3218 rv
= php_pqconn_prepare_async(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
3220 rv
= php_pqconn_prepare(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
3221 php_pqconn_notify_listeners(conn_obj TSRMLS_CC
);
3224 if (SUCCESS
== rv
) {
3225 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
3227 php_pq_object_addref(conn_obj TSRMLS_CC
);
3228 stm
->conn
= conn_obj
;
3229 stm
->name
= estrdup(name_str
);
3230 ZEND_INIT_SYMTABLE(&stm
->bound
);
3234 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3237 zend_restore_error_handling(&zeh TSRMLS_CC
);
3239 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_bind
, 0, 0, 2)
3240 ZEND_ARG_INFO(0, param_no
)
3241 ZEND_ARG_INFO(1, param_ref
)
3242 ZEND_END_ARG_INFO();
3243 static PHP_METHOD(pqstm
, bind
) {
3247 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "lz", ¶m_no
, ¶m_ref
)) {
3248 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3251 Z_ADDREF_P(param_ref
);
3252 zend_hash_index_update(&obj
->intern
->bound
, param_no
, (void *) ¶m_ref
, sizeof(zval
*), NULL
);
3253 zend_hash_sort(&obj
->intern
->bound
, zend_qsort
, compare_index
, 0 TSRMLS_CC
);
3255 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3260 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
3261 ZEND_ARG_ARRAY_INFO(0, params
, 1)
3262 ZEND_END_ARG_INFO();
3263 static PHP_METHOD(pqstm
, exec
) {
3264 zend_error_handling zeh
;
3265 zval
*zparams
= NULL
;
3267 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3268 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
3269 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3272 if (obj
->intern
->conn
->intern
) {
3274 char **params
= NULL
;
3278 ZEND_INIT_SYMTABLE(&zdtor
);
3281 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
3283 count
= php_pq_params_to_array(&obj
->intern
->bound
, ¶ms
, &zdtor TSRMLS_CC
);
3286 res
= PQexecPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0);
3291 zend_hash_destroy(&zdtor
);
3293 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3296 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3297 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
3300 ZEND_INIT_SYMTABLE(&r
->bound
);
3301 return_value
->type
= IS_OBJECT
;
3302 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
3305 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3308 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3311 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3314 zend_restore_error_handling(&zeh TSRMLS_CC
);
3317 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec_async
, 0, 0, 0)
3318 ZEND_ARG_ARRAY_INFO(0, params
, 1)
3319 ZEND_ARG_INFO(0, callable
)
3320 ZEND_END_ARG_INFO();
3321 static PHP_METHOD(pqstm
, execAsync
) {
3322 zend_error_handling zeh
;
3323 zval
*zparams
= NULL
;
3324 php_pq_callback_t resolver
= {{0}};
3326 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3327 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!f", &zparams
, &resolver
.fci
, &resolver
.fcc
)) {
3328 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3331 if (obj
->intern
->conn
->intern
) {
3333 char **params
= NULL
;
3337 ZEND_INIT_SYMTABLE(&zdtor
);
3338 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
3341 php_pq_callback_dtor(&obj
->intern
->conn
->intern
->onevent
);
3342 if (resolver
.fci
.size
> 0) {
3343 obj
->intern
->conn
->intern
->onevent
= resolver
;
3344 php_pq_callback_addref(&obj
->intern
->conn
->intern
->onevent
);
3347 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3349 if (PQsendQueryPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0)) {
3350 if (obj
->intern
->conn
->intern
->unbuffered
) {
3351 if (!PQsetSingleRowMode(obj
->intern
->conn
->intern
->conn
)) {
3352 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3357 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3365 zend_hash_destroy(&zdtor
);
3368 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3371 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3375 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3379 zend_restore_error_handling(&zeh TSRMLS_CC
);
3382 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc
, 0, 0, 0)
3383 ZEND_END_ARG_INFO();
3384 static PHP_METHOD(pqstm
, desc
) {
3385 zend_error_handling zeh
;
3387 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3388 if (SUCCESS
== zend_parse_parameters_none()) {
3389 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3392 if (obj
->intern
->conn
->intern
) {
3393 PGresult
*res
= PQdescribePrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
);
3395 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3398 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3401 array_init(return_value
);
3402 for (p
= 0, params
= PQnparams(res
); p
< params
; ++p
) {
3403 add_next_index_long(return_value
, PQparamtype(res
, p
));
3407 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3410 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3413 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3416 zend_restore_error_handling(&zeh TSRMLS_CC
);
3419 static zend_function_entry php_pqstm_methods
[] = {
3420 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3421 PHP_ME(pqstm
, bind
, ai_pqstm_bind
, ZEND_ACC_PUBLIC
)
3422 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
3423 PHP_ME(pqstm
, desc
, ai_pqstm_desc
, ZEND_ACC_PUBLIC
)
3424 PHP_ME(pqstm
, execAsync
, ai_pqstm_exec_async
, ZEND_ACC_PUBLIC
)
3428 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_construct
, 0, 0, 1)
3429 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3430 ZEND_ARG_INFO(0, async
)
3431 ZEND_ARG_INFO(0, isolation
)
3432 ZEND_ARG_INFO(0, readonly
)
3433 ZEND_ARG_INFO(0, deferrable
)
3434 ZEND_END_ARG_INFO();
3435 static PHP_METHOD(pqtxn
, __construct
) {
3436 zend_error_handling zeh
;
3438 long isolation
= PHP_PQTXN_READ_COMMITTED
;
3439 zend_bool async
= 0, readonly
= 0, deferrable
= 0;
3441 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3442 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|blbb", &zconn
, php_pqconn_class_entry
, &async
, &isolation
, &readonly
, &deferrable
)) {
3444 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3445 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3447 if (conn_obj
->intern
) {
3449 rv
= php_pqconn_start_transaction_async(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3451 rv
= php_pqconn_start_transaction(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3454 if (SUCCESS
== rv
) {
3455 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3457 php_pq_object_addref(conn_obj TSRMLS_CC
);
3458 obj
->intern
->conn
= conn_obj
;
3459 obj
->intern
->isolation
= isolation
;
3460 obj
->intern
->readonly
= readonly
;
3461 obj
->intern
->deferrable
= deferrable
;
3464 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3467 zend_restore_error_handling(&zeh TSRMLS_CC
);
3470 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_savepoint
, 0, 0, 0)
3471 ZEND_END_ARG_INFO();
3472 static PHP_METHOD(pqtxn
, savepoint
) {
3473 zend_error_handling zeh
;
3475 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3476 if (SUCCESS
== zend_parse_parameters_none()) {
3477 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3483 spprintf(&cmd
, 0, "SAVEPOINT \"%u\"", ++obj
->intern
->savepoint
);
3484 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3487 php_pqres_success(res TSRMLS_CC
);
3490 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3495 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3498 zend_restore_error_handling(&zeh TSRMLS_CC
);
3501 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_savepoint_async
, 0, 0, 0)
3502 ZEND_END_ARG_INFO();
3503 static PHP_METHOD(pqtxn
, savepointAsync
) {
3504 zend_error_handling zeh
;
3506 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3507 if (SUCCESS
== zend_parse_parameters_none()) {
3508 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3513 spprintf(&cmd
, 0, "SAVEPOINT \"%u\"", ++obj
->intern
->savepoint
);
3514 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3515 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3520 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3523 zend_restore_error_handling(&zeh TSRMLS_CC
);
3526 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit
, 0, 0, 0)
3527 ZEND_END_ARG_INFO();
3528 static PHP_METHOD(pqtxn
, commit
) {
3529 zend_error_handling zeh
;
3531 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3532 if (SUCCESS
== zend_parse_parameters_none()) {
3533 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3538 if (obj
->intern
->savepoint
) {
3541 spprintf(&cmd
, 0, "RELEASE SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3542 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3545 php_pqres_success(res TSRMLS_CC
);
3548 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3553 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "COMMIT");
3556 php_pqres_success(res TSRMLS_CC
);
3559 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3563 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3566 zend_restore_error_handling(&zeh TSRMLS_CC
);
3569 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit_async
, 0, 0, 0)
3570 ZEND_END_ARG_INFO();
3571 static PHP_METHOD(pqtxn
, commitAsync
) {
3572 zend_error_handling zeh
;
3574 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3575 if (SUCCESS
== zend_parse_parameters_none()) {
3576 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3579 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3581 if (obj
->intern
->savepoint
) {
3584 spprintf(&cmd
, 0, "RELEASE SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3585 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3586 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3591 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "COMMIT")) {
3592 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3596 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3599 zend_restore_error_handling(&zeh TSRMLS_CC
);
3602 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback
, 0, 0, 0)
3603 ZEND_END_ARG_INFO();
3604 static PHP_METHOD(pqtxn
, rollback
) {
3605 zend_error_handling zeh
;
3607 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3608 if (SUCCESS
== zend_parse_parameters_none()) {
3609 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3614 if (obj
->intern
->savepoint
) {
3617 spprintf(&cmd
, 0, "ROLLBACK TO SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3618 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3621 php_pqres_success(res TSRMLS_CC
);
3624 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3629 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "ROLLBACK");
3632 php_pqres_success(res TSRMLS_CC
);
3635 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3639 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3642 zend_restore_error_handling(&zeh TSRMLS_CC
);
3645 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback_async
, 0, 0, 0)
3646 ZEND_END_ARG_INFO();
3647 static PHP_METHOD(pqtxn
, rollbackAsync
) {
3648 zend_error_handling zeh
;
3650 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3651 if (SUCCESS
== zend_parse_parameters_none()) {
3652 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3655 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3657 if (obj
->intern
->savepoint
) {
3660 spprintf(&cmd
, 0, "ROLLBACK TO SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3661 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3662 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3667 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "ROLLBACK")) {
3668 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3672 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3675 zend_restore_error_handling(&zeh TSRMLS_CC
);
3678 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_export_snapshot
, 0, 0, 0)
3679 ZEND_END_ARG_INFO();
3680 static PHP_METHOD(pqtxn
, exportSnapshot
) {
3681 zend_error_handling zeh
;
3683 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3684 if (SUCCESS
== zend_parse_parameters_none()) {
3685 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3688 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SELECT pg_export_snapshot()");
3691 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3692 RETVAL_STRING(PQgetvalue(res
, 0, 0), 1);
3697 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to export transaction snapshot (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3700 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3703 zend_restore_error_handling(&zeh TSRMLS_CC
);
3706 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_export_snapshot_async
, 0, 0, 0)
3707 ZEND_END_ARG_INFO();
3708 static PHP_METHOD(pqtxn
, exportSnapshotAsync
) {
3709 zend_error_handling zeh
;
3711 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3712 if (SUCCESS
== zend_parse_parameters_none()) {
3713 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3716 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3718 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "SELECT pg_export_snapshot()")) {
3719 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to export transaction snapshot (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3722 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3725 zend_restore_error_handling(&zeh TSRMLS_CC
);
3728 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_import_snapshot
, 0, 0, 1)
3729 ZEND_ARG_INFO(0, snapshot_id
)
3730 ZEND_END_ARG_INFO();
3731 static PHP_METHOD(pqtxn
, importSnapshot
) {
3732 zend_error_handling zeh
;
3736 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3737 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &snapshot_str
, &snapshot_len
)) {
3738 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3741 if (obj
->intern
->isolation
>= PHP_PQTXN_REPEATABLE_READ
) {
3742 char *cmd
, *sid
= PQescapeLiteral(obj
->intern
->conn
->intern
->conn
, snapshot_str
, snapshot_len
);
3745 spprintf(&cmd
, 0, "SET TRANSACTION SNAPSHOT %s", sid
);
3746 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3749 php_pqres_success(res TSRMLS_CC
);
3752 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3755 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "A transaction must have at least isolation level REPEATABLE READ to be able to import a snapshot");
3758 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3761 zend_restore_error_handling(&zeh TSRMLS_CC
);
3764 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_import_snapshot_async
, 0, 0, 1)
3765 ZEND_ARG_INFO(0, snapshot_id
)
3766 ZEND_END_ARG_INFO();
3767 static PHP_METHOD(pqtxn
, importSnapshotAsync
) {
3768 zend_error_handling zeh
;
3772 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3773 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &snapshot_str
, &snapshot_len
)) {
3774 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3777 if (obj
->intern
->isolation
>= PHP_PQTXN_REPEATABLE_READ
) {
3778 char *sid
= PQescapeLiteral(obj
->intern
->conn
->intern
->conn
, snapshot_str
, snapshot_len
);
3782 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3784 spprintf(&cmd
, 0, "SET TRANSACTION SNAPSHOT %s", sid
);
3785 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3786 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3790 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to quote snapshot identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3793 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "A transaction must have at least isolation level REPEATABLE READ to be able to import a snapshot");
3796 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3799 zend_restore_error_handling(&zeh TSRMLS_CC
);
3802 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_open_lob
, 0, 0, 1)
3803 ZEND_ARG_INFO(0, oid
)
3804 ZEND_ARG_INFO(0, mode
)
3805 ZEND_END_ARG_INFO();
3806 static PHP_METHOD(pqtxn
, openLOB
) {
3807 zend_error_handling zeh
;
3808 long mode
= INV_WRITE
|INV_READ
, loid
;
3810 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3811 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &loid
, &mode
)) {
3812 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3815 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3818 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3822 php_pq_object_addref(obj TSRMLS_CC
);
3825 return_value
->type
= IS_OBJECT
;
3826 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3828 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
3829 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3830 (mode
& INV_READ
? "r" :
3831 (mode
& INV_WRITE
? "w" : "-"))),
3832 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3836 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3839 zend_restore_error_handling(&zeh TSRMLS_CC
);
3842 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_create_lob
, 0, 0, 0)
3843 ZEND_ARG_INFO(0, mode
)
3844 ZEND_END_ARG_INFO();
3845 static PHP_METHOD(pqtxn
, createLOB
) {
3846 zend_error_handling zeh
;
3847 long mode
= INV_WRITE
|INV_READ
;
3849 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3850 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &mode
)) {
3851 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3854 Oid loid
= lo_creat(obj
->intern
->conn
->intern
->conn
, mode
);
3856 if (loid
!= InvalidOid
) {
3857 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3860 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3863 php_pq_object_addref(obj TSRMLS_CC
);
3866 return_value
->type
= IS_OBJECT
;
3867 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3869 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s': %s",
3870 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3871 (mode
& INV_READ
? "r" :
3872 (mode
& INV_WRITE
? "w" : "-"))),
3873 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3877 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s': %s",
3878 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3879 (mode
& INV_READ
? "r" :
3880 (mode
& INV_WRITE
? "w" : "-"))),
3881 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3885 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3888 zend_restore_error_handling(&zeh TSRMLS_CC
);
3891 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_unlink_lob
, 0, 0, 1)
3892 ZEND_ARG_INFO(0, oid
)
3893 ZEND_END_ARG_INFO();
3894 static PHP_METHOD(pqtxn
, unlinkLOB
) {
3897 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l", &loid
)) {
3898 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3901 if (1 == lo_unlink(obj
->intern
->conn
->intern
->conn
, loid
)) {
3904 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to unlink LOB (oid=%ld): %s", loid
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3908 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3914 static zend_function_entry php_pqtxn_methods
[] = {
3915 PHP_ME(pqtxn
, __construct
, ai_pqtxn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3916 PHP_ME(pqtxn
, commit
, ai_pqtxn_commit
, ZEND_ACC_PUBLIC
)
3917 PHP_ME(pqtxn
, rollback
, ai_pqtxn_rollback
, ZEND_ACC_PUBLIC
)
3918 PHP_ME(pqtxn
, commitAsync
, ai_pqtxn_commit_async
, ZEND_ACC_PUBLIC
)
3919 PHP_ME(pqtxn
, rollbackAsync
, ai_pqtxn_rollback_async
, ZEND_ACC_PUBLIC
)
3920 PHP_ME(pqtxn
, savepoint
, ai_pqtxn_savepoint
, ZEND_ACC_PUBLIC
)
3921 PHP_ME(pqtxn
, savepointAsync
, ai_pqtxn_savepoint_async
, ZEND_ACC_PUBLIC
)
3922 PHP_ME(pqtxn
, exportSnapshot
, ai_pqtxn_export_snapshot
, ZEND_ACC_PUBLIC
)
3923 PHP_ME(pqtxn
, exportSnapshotAsync
, ai_pqtxn_export_snapshot_async
, ZEND_ACC_PUBLIC
)
3924 PHP_ME(pqtxn
, importSnapshot
, ai_pqtxn_import_snapshot
, ZEND_ACC_PUBLIC
)
3925 PHP_ME(pqtxn
, importSnapshotAsync
, ai_pqtxn_import_snapshot_async
, ZEND_ACC_PUBLIC
)
3926 PHP_ME(pqtxn
, openLOB
, ai_pqtxn_open_lob
, ZEND_ACC_PUBLIC
)
3927 PHP_ME(pqtxn
, createLOB
, ai_pqtxn_create_lob
, ZEND_ACC_PUBLIC
)
3928 PHP_ME(pqtxn
, unlinkLOB
, ai_pqtxn_unlink_lob
, ZEND_ACC_PUBLIC
)
3932 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_construct
, 0, 0, 1)
3933 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3934 ZEND_END_ARG_INFO();
3935 static PHP_METHOD(pqcancel
, __construct
) {
3936 zend_error_handling zeh
;
3939 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3940 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
3941 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3943 if (conn_obj
->intern
) {
3944 PGcancel
*cancel
= PQgetCancel(conn_obj
->intern
->conn
);
3947 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3949 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3950 obj
->intern
->cancel
= cancel
;
3951 php_pq_object_addref(conn_obj TSRMLS_CC
);
3952 obj
->intern
->conn
= conn_obj
;
3954 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not acquire cancel (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
3957 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3960 zend_restore_error_handling(&zeh TSRMLS_CC
);
3963 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_cancel
, 0, 0, 0)
3964 ZEND_END_ARG_INFO();
3965 static PHP_METHOD(pqcancel
, cancel
) {
3966 zend_error_handling zeh
;
3968 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3969 if (SUCCESS
== zend_parse_parameters_none()) {
3970 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3975 if (!PQcancel(obj
->intern
->cancel
, err
, sizeof(err
))) {
3976 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not request cancellation: %s", err
);
3979 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Cancel not initialized");
3982 zend_restore_error_handling(&zeh TSRMLS_CC
);
3985 static zend_function_entry php_pqcancel_methods
[] = {
3986 PHP_ME(pqcancel
, __construct
, ai_pqcancel_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3987 PHP_ME(pqcancel
, cancel
, ai_pqcancel_cancel
, ZEND_ACC_PUBLIC
)
3991 static void php_pqconn_add_eventhandler(zval
*zconn
, php_pqconn_object_t
*conn_obj
, const char *type_str
, size_t type_len
, zval
*zevent TSRMLS_DC
)
3995 if (SUCCESS
== zend_hash_find(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evhs
)) {
3997 add_next_index_zval(*evhs
, zevent
);
4004 add_next_index_zval(evh
, zevent
);
4005 zend_hash_add(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evh
, sizeof(zval
*), NULL
);
4009 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_construct
, 0, 0, 3)
4010 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
4011 ZEND_ARG_INFO(0, type
)
4012 ZEND_ARG_INFO(0, callable
)
4013 ZEND_END_ARG_INFO();
4014 static PHP_METHOD(pqevent
, __construct
) {
4015 zend_error_handling zeh
;
4019 php_pq_callback_t cb
;
4021 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4022 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Osf", &zconn
, php_pqconn_class_entry
, &type_str
, &type_len
, &cb
.fci
, &cb
.fcc
)) {
4023 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4025 if (conn_obj
->intern
) {
4026 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4028 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4029 php_pq_callback_addref(&cb
);
4030 obj
->intern
->cb
= cb
;
4031 php_pq_object_addref(conn_obj TSRMLS_CC
);
4032 obj
->intern
->conn
= conn_obj
;
4033 obj
->intern
->type
= estrdup(type_str
);
4035 php_pqconn_add_eventhandler(zconn
, conn_obj
, type_str
, type_len
, getThis() TSRMLS_CC
);
4038 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4041 zend_restore_error_handling(&zeh TSRMLS_CC
);
4044 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_trigger
, 0, 0, 1)
4045 ZEND_ARG_ARRAY_INFO(0, args
, 1)
4046 ZEND_END_ARG_INFO();
4047 static PHP_METHOD(pqevent
, trigger
) {
4050 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "a/", &args
)) {
4051 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4056 if (SUCCESS
== zend_fcall_info_call(&obj
->intern
->cb
.fci
, &obj
->intern
->cb
.fcc
, &rv
, args TSRMLS_CC
)) {
4058 RETVAL_ZVAL(rv
, 0, 1);
4064 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Event not initialized");
4070 static zend_function_entry php_pqevent_methods
[] = {
4071 PHP_ME(pqevent
, __construct
, ai_pqevent_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4072 PHP_ME(pqevent
, trigger
, ai_pqevent_trigger
, ZEND_ACC_PUBLIC
)
4076 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_construct
, 0, 0, 1)
4077 ZEND_ARG_OBJ_INFO(0, transaction
, pq
\\Transaction
, 0)
4078 ZEND_ARG_INFO(0, oid
)
4079 ZEND_ARG_INFO(0, mode
)
4080 ZEND_END_ARG_INFO();
4081 static PHP_METHOD(pqlob
, __construct
) {
4082 zend_error_handling zeh
;
4084 long mode
= INV_WRITE
|INV_READ
, loid
= InvalidOid
;
4086 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4087 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|ll", &ztxn
, php_pqtxn_class_entry
, &loid
, &mode
)) {
4088 php_pqtxn_object_t
*txn_obj
= zend_object_store_get_object(ztxn TSRMLS_CC
);
4090 if (txn_obj
->intern
) {
4092 if (loid
== InvalidOid
) {
4093 loid
= lo_creat(txn_obj
->intern
->conn
->intern
->conn
, mode
);
4096 if (loid
!= InvalidOid
) {
4097 int lofd
= lo_open(txn_obj
->intern
->conn
->intern
->conn
, loid
, mode
);
4100 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4102 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4103 obj
->intern
->lofd
= lofd
;
4104 obj
->intern
->loid
= loid
;
4105 php_pq_object_addref(txn_obj TSRMLS_CC
);
4106 obj
->intern
->txn
= txn_obj
;
4108 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
4109 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4110 (mode
& INV_READ
? "r" :
4111 (mode
& INV_WRITE
? "w" : "-"))),
4112 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
4116 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s' (%s)",
4117 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4118 (mode
& INV_READ
? "r" :
4119 (mode
& INV_WRITE
? "w" : "-"))),
4120 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
4124 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
4127 zend_restore_error_handling(&zeh TSRMLS_CC
);
4130 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_write
, 0, 0, 1)
4131 ZEND_ARG_INFO(0, data
)
4132 ZEND_END_ARG_INFO();
4133 static PHP_METHOD(pqlob
, write
) {
4137 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
4138 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4141 int written
= lo_write(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, data_str
, data_len
);
4144 RETVAL_LONG(written
);
4146 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to write to LOB, oid=%d (%s)", obj
->intern
->loid
,
4147 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4151 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4157 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_read
, 0, 0, 0)
4158 ZEND_ARG_INFO(0, length
)
4159 ZEND_ARG_INFO(1, read
)
4160 ZEND_END_ARG_INFO();
4161 static PHP_METHOD(pqlob
, read
) {
4162 long length
= 0x1000;
4165 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lz!", &length
, &zread
)) {
4166 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4169 char *buffer
= emalloc(length
+ 1);
4170 int read
= lo_read(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, buffer
, length
);
4175 ZVAL_LONG(zread
, read
);
4177 buffer
[read
] = '\0';
4178 RETVAL_STRINGL(buffer
, read
, 0);
4181 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to read from LOB, oid=%d (%s)", obj
->intern
->loid
,
4182 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4187 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4193 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_seek
, 0, 0, 1)
4194 ZEND_ARG_INFO(0, offset
)
4195 ZEND_ARG_INFO(0, whence
)
4196 ZEND_END_ARG_INFO();
4197 static PHP_METHOD(pqlob
, seek
) {
4198 long offset
, whence
= SEEK_SET
;
4200 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &offset
, &whence
)) {
4201 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4204 int position
= lo_lseek(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, offset
, whence
);
4206 if (position
>= 0) {
4207 RETVAL_LONG(position
);
4209 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to seek offset in LOB, oid=%d (%s)", obj
->intern
->loid
,
4210 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4214 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4220 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_tell
, 0, 0, 0)
4221 ZEND_END_ARG_INFO();
4222 static PHP_METHOD(pqlob
, tell
) {
4223 if (SUCCESS
== zend_parse_parameters_none()) {
4224 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4227 int position
= lo_tell(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
4229 if (position
>= 0) {
4230 RETVAL_LONG(position
);
4232 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to tell offset in LOB (oid=%d): %s", obj
->intern
->loid
,
4233 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4237 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4243 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_truncate
, 0, 0, 0)
4244 ZEND_ARG_INFO(0, length
)
4245 ZEND_END_ARG_INFO();
4246 static PHP_METHOD(pqlob
, truncate
) {
4249 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &length
)) {
4250 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4253 if (0 == lo_truncate(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, length
)) {
4256 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to truncate LOB (oid=%d): %s", obj
->intern
->loid
,
4257 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4261 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4267 static zend_function_entry php_pqlob_methods
[] = {
4268 PHP_ME(pqlob
, __construct
, ai_pqlob_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4269 PHP_ME(pqlob
, write
, ai_pqlob_write
, ZEND_ACC_PUBLIC
)
4270 PHP_ME(pqlob
, read
, ai_pqlob_read
, ZEND_ACC_PUBLIC
)
4271 PHP_ME(pqlob
, seek
, ai_pqlob_seek
, ZEND_ACC_PUBLIC
)
4272 PHP_ME(pqlob
, tell
, ai_pqlob_tell
, ZEND_ACC_PUBLIC
)
4273 PHP_ME(pqlob
, truncate
, ai_pqlob_truncate
, ZEND_ACC_PUBLIC
)
4277 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_construct
, 0, 0, 3)
4278 ZEND_ARG_OBJ_INFO(0, "connection", pq
\\Connection
, 0)
4279 ZEND_ARG_INFO(0, expression
)
4280 ZEND_ARG_INFO(0, direction
)
4281 ZEND_ARG_INFO(0, options
)
4282 ZEND_END_ARG_INFO();
4283 static PHP_METHOD(pqcopy
, __construct
) {
4284 zend_error_handling zeh
;
4286 char *expr_str
, *opt_str
= "";
4287 int expr_len
, opt_len
= 0;
4290 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4291 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Osl|s", &zconn
, php_pqconn_class_entry
, &expr_str
, &expr_len
, &direction
, &opt_str
, &opt_len
)) {
4292 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4294 if (conn_obj
->intern
) {
4297 switch (direction
) {
4298 case PHP_PQCOPY_FROM_STDIN
:
4299 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "FROM STDIN", opt_str
);
4302 case PHP_PQCOPY_TO_STDOUT
:
4303 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "TO STDOUT", opt_str
);
4307 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Invalid COPY direction, expected one of FROM_STDIN (%d) TO_STDOUT (%d), got %ld",
4308 PHP_PQCOPY_FROM_STDIN
, PHP_PQCOPY_TO_STDOUT
, direction
);
4313 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4314 PGresult
*res
= PQexec(conn_obj
->intern
->conn
, copy
);
4318 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4319 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4320 obj
->intern
->direction
= direction
;
4321 obj
->intern
->expression
= estrdup(expr_str
);
4322 obj
->intern
->options
= estrdup(opt_str
);
4323 obj
->intern
->conn
= conn_obj
;
4324 php_pq_object_addref(conn_obj TSRMLS_CC
);
4330 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4333 zend_restore_error_handling(&zeh TSRMLS_CC
);
4336 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_put
, 0, 0, 1)
4337 ZEND_ARG_INFO(0, data
)
4338 ZEND_END_ARG_INFO();
4339 static PHP_METHOD(pqcopy
, put
) {
4340 zend_error_handling zeh
;
4344 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4345 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
4346 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4349 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
4350 if (1 == PQputCopyData(obj
->intern
->conn
->intern
->conn
, data_str
, data_len
)) {
4353 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to send COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4356 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
4359 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
4362 zend_restore_error_handling(&zeh TSRMLS_CC
);
4365 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_end
, 0, 0, 0)
4366 ZEND_ARG_INFO(0, error
)
4367 ZEND_END_ARG_INFO();
4368 static PHP_METHOD(pqcopy
, end
) {
4369 zend_error_handling zeh
;
4370 char *error_str
= NULL
;
4373 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4374 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|s!", &error_str
, &error_len
)) {
4375 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4378 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
4379 if (1 == PQputCopyEnd(obj
->intern
->conn
->intern
->conn
, error_str
)) {
4380 PGresult
*res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
4383 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4389 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4392 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to end COPY (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4395 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
4398 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
4401 zend_restore_error_handling(&zeh TSRMLS_CC
);
4404 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_get
, 0, 0, 1)
4405 ZEND_ARG_INFO(1, data
)
4406 ZEND_END_ARG_INFO();
4407 static PHP_METHOD(pqcopy
, get
) {
4408 zend_error_handling zeh
;
4411 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4412 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &zdata
)) {
4413 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4414 char *buffer
= NULL
;
4417 if (PHP_PQCOPY_TO_STDOUT
== obj
->intern
->direction
) {
4419 int bytes
= PQgetCopyData(obj
->intern
->conn
->intern
->conn
, &buffer
, 0);
4423 res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
4426 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4432 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4437 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4443 ZVAL_STRINGL(zdata
, buffer
, bytes
, 1);
4445 ZVAL_EMPTY_STRING(zdata
);
4457 zend_restore_error_handling(&zeh TSRMLS_CC
);
4460 static zend_function_entry php_pqcopy_methods
[] = {
4461 PHP_ME(pqcopy
, __construct
, ai_pqcopy_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4462 PHP_ME(pqcopy
, put
, ai_pqcopy_put
, ZEND_ACC_PUBLIC
)
4463 PHP_ME(pqcopy
, end
, ai_pqcopy_end
, ZEND_ACC_PUBLIC
)
4464 PHP_ME(pqcopy
, get
, ai_pqcopy_get
, ZEND_ACC_PUBLIC
)
4468 /* {{{ PHP_MINIT_FUNCTION
4470 static PHP_MINIT_FUNCTION(pq
)
4472 zend_class_entry ce
= {0};
4473 php_pq_object_prophandler_t ph
= {0};
4475 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
4476 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4477 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
4479 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4480 php_pqconn_object_handlers
.read_property
= php_pq_object_read_prop
;
4481 php_pqconn_object_handlers
.write_property
= php_pq_object_write_prop
;
4482 php_pqconn_object_handlers
.clone_obj
= NULL
;
4483 php_pqconn_object_handlers
.get_property_ptr_ptr
= NULL
;
4484 php_pqconn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4486 zend_hash_init(&php_pqconn_object_prophandlers
, 13, NULL
, NULL
, 1);
4488 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4489 ph
.read
= php_pqconn_object_read_status
;
4490 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4492 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4493 ph
.read
= php_pqconn_object_read_transaction_status
;
4494 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
4496 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4497 ph
.read
= NULL
; /* forward to std prophandler */
4498 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
4500 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4501 ph
.read
= php_pqconn_object_read_error_message
;
4502 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4504 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("busy"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4505 ph
.read
= php_pqconn_object_read_busy
;
4506 zend_hash_add(&php_pqconn_object_prophandlers
, "busy", sizeof("busy"), (void *) &ph
, sizeof(ph
), NULL
);
4508 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("encoding"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4509 ph
.read
= php_pqconn_object_read_encoding
;
4510 ph
.write
= php_pqconn_object_write_encoding
;
4511 zend_hash_add(&php_pqconn_object_prophandlers
, "encoding", sizeof("encoding"), (void *) &ph
, sizeof(ph
), NULL
);
4514 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("unbuffered"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4515 ph
.read
= php_pqconn_object_read_unbuffered
;
4516 ph
.write
= php_pqconn_object_write_unbuffered
;
4517 zend_hash_add(&php_pqconn_object_prophandlers
, "unbuffered", sizeof("unbuffered"), (void *) &ph
, sizeof(ph
), NULL
);
4520 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("db"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4521 ph
.read
= php_pqconn_object_read_db
;
4522 zend_hash_add(&php_pqconn_object_prophandlers
, "db", sizeof("db"), (void *) &ph
, sizeof(ph
), NULL
);
4524 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4525 ph
.read
= php_pqconn_object_read_user
;
4526 zend_hash_add(&php_pqconn_object_prophandlers
, "user", sizeof("user"), (void *) &ph
, sizeof(ph
), NULL
);
4528 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("pass"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4529 ph
.read
= php_pqconn_object_read_pass
;
4530 zend_hash_add(&php_pqconn_object_prophandlers
, "pass", sizeof("pass"), (void *) &ph
, sizeof(ph
), NULL
);
4532 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("host"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4533 ph
.read
= php_pqconn_object_read_host
;
4534 zend_hash_add(&php_pqconn_object_prophandlers
, "host", sizeof("host"), (void *) &ph
, sizeof(ph
), NULL
);
4536 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("port"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4537 ph
.read
= php_pqconn_object_read_port
;
4538 zend_hash_add(&php_pqconn_object_prophandlers
, "port", sizeof("port"), (void *) &ph
, sizeof(ph
), NULL
);
4540 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4541 ph
.read
= php_pqconn_object_read_options
;
4542 zend_hash_add(&php_pqconn_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
4544 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
4545 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
4546 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
4547 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
4548 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
4549 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
4550 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
4551 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
4553 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
4554 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
4555 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
4556 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
4557 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
4559 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
4560 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
4561 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
4562 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
4564 memset(&ce
, 0, sizeof(ce
));
4565 INIT_NS_CLASS_ENTRY(ce
, "pq", "Types", php_pqtypes_methods
);
4566 php_pqtypes_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4567 php_pqtypes_class_entry
->create_object
= php_pqtypes_create_object
;
4569 memcpy(&php_pqtypes_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4570 php_pqtypes_object_handlers
.read_property
= php_pq_object_read_prop
;
4571 php_pqtypes_object_handlers
.write_property
= php_pq_object_write_prop
;
4572 php_pqtypes_object_handlers
.clone_obj
= NULL
;
4573 php_pqtypes_object_handlers
.get_property_ptr_ptr
= NULL
;
4574 php_pqtypes_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4575 php_pqtypes_object_handlers
.has_dimension
= php_pqtypes_object_has_dimension
;
4576 php_pqtypes_object_handlers
.read_dimension
= php_pqtypes_object_read_dimension
;
4577 php_pqtypes_object_handlers
.unset_dimension
= NULL
;
4578 php_pqtypes_object_handlers
.write_dimension
= NULL
;
4580 zend_hash_init(&php_pqtypes_object_prophandlers
, 1, NULL
, NULL
, 1);
4582 zend_declare_property_null(php_pqtypes_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4583 ph
.read
= php_pqtypes_object_read_connection
;
4584 zend_hash_add(&php_pqtypes_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4586 memset(&ce
, 0, sizeof(ce
));
4587 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
4588 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4589 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
4590 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
4591 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
4592 zend_class_implements(php_pqres_class_entry TSRMLS_CC
, 2, zend_ce_traversable
, spl_ce_Countable
);
4594 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4595 php_pqres_object_handlers
.read_property
= php_pq_object_read_prop
;
4596 php_pqres_object_handlers
.write_property
= php_pq_object_write_prop
;
4597 php_pqres_object_handlers
.clone_obj
= NULL
;
4598 php_pqres_object_handlers
.get_property_ptr_ptr
= NULL
;
4599 php_pqres_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4600 php_pqres_object_handlers
.count_elements
= php_pqres_count_elements
;
4602 zend_hash_init(&php_pqres_object_prophandlers
, 6, NULL
, NULL
, 1);
4604 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4605 ph
.read
= php_pqres_object_read_status
;
4606 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4608 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4609 ph
.read
= php_pqres_object_read_error_message
;
4610 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4612 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4613 ph
.read
= php_pqres_object_read_num_rows
;
4614 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
4616 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4617 ph
.read
= php_pqres_object_read_num_cols
;
4618 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
4620 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4621 ph
.read
= php_pqres_object_read_affected_rows
;
4622 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
4624 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4625 ph
.read
= php_pqres_object_read_fetch_type
;
4626 ph
.write
= php_pqres_object_write_fetch_type
;
4627 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
4630 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
4631 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
4632 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
4633 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
4634 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
4635 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
4636 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
4637 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
4638 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
4639 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
4641 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
4642 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
4643 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
4645 memset(&ce
, 0, sizeof(ce
));
4646 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
4647 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4648 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
4650 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4651 php_pqstm_object_handlers
.read_property
= php_pq_object_read_prop
;
4652 php_pqstm_object_handlers
.write_property
= php_pq_object_write_prop
;
4653 php_pqstm_object_handlers
.clone_obj
= NULL
;
4654 php_pqstm_object_handlers
.get_property_ptr_ptr
= NULL
;
4655 php_pqstm_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4657 zend_hash_init(&php_pqstm_object_prophandlers
, 2, NULL
, NULL
, 1);
4659 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4660 ph
.read
= php_pqstm_object_read_name
;
4661 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
4663 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4664 ph
.read
= php_pqstm_object_read_connection
;
4665 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4667 memset(&ce
, 0, sizeof(ce
));
4668 INIT_NS_CLASS_ENTRY(ce
, "pq", "Transaction", php_pqtxn_methods
);
4669 php_pqtxn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4670 php_pqtxn_class_entry
->create_object
= php_pqtxn_create_object
;
4672 memcpy(&php_pqtxn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4673 php_pqtxn_object_handlers
.read_property
= php_pq_object_read_prop
;
4674 php_pqtxn_object_handlers
.write_property
= php_pq_object_write_prop
;
4675 php_pqtxn_object_handlers
.clone_obj
= NULL
;
4676 php_pqtxn_object_handlers
.get_property_ptr_ptr
= NULL
;
4677 php_pqtxn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4679 zend_hash_init(&php_pqtxn_object_prophandlers
, 4, NULL
, NULL
, 1);
4681 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4682 ph
.read
= php_pqtxn_object_read_connection
;
4683 zend_hash_add(&php_pqtxn_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4685 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("isolation"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4686 ph
.read
= php_pqtxn_object_read_isolation
;
4687 ph
.write
= php_pqtxn_object_write_isolation
;
4688 zend_hash_add(&php_pqtxn_object_prophandlers
, "isolation", sizeof("isolation"), (void *) &ph
, sizeof(ph
), NULL
);
4690 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("readonly"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4691 ph
.read
= php_pqtxn_object_read_readonly
;
4692 ph
.write
= php_pqtxn_object_write_readonly
;
4693 zend_hash_add(&php_pqtxn_object_prophandlers
, "readonly", sizeof("readonly"), (void *) &ph
, sizeof(ph
), NULL
);
4695 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("deferrable"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4696 ph
.read
= php_pqtxn_object_read_deferrable
;
4697 ph
.write
= php_pqtxn_object_write_deferrable
;
4698 zend_hash_add(&php_pqtxn_object_prophandlers
, "deferrable", sizeof("deferrable"), (void *) &ph
, sizeof(ph
), NULL
);
4701 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("READ_COMMITTED"), PHP_PQTXN_READ_COMMITTED TSRMLS_CC
);
4702 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("REPEATABLE READ"), PHP_PQTXN_REPEATABLE_READ TSRMLS_CC
);
4703 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("SERIALIZABLE"), PHP_PQTXN_SERIALIZABLE TSRMLS_CC
);
4705 memset(&ce
, 0, sizeof(ce
));
4706 INIT_NS_CLASS_ENTRY(ce
, "pq", "Cancel", php_pqcancel_methods
);
4707 php_pqcancel_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4708 php_pqcancel_class_entry
->create_object
= php_pqcancel_create_object
;
4710 memcpy(&php_pqcancel_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4711 php_pqcancel_object_handlers
.read_property
= php_pq_object_read_prop
;
4712 php_pqcancel_object_handlers
.write_property
= php_pq_object_write_prop
;
4713 php_pqcancel_object_handlers
.clone_obj
= NULL
;
4714 php_pqcancel_object_handlers
.get_property_ptr_ptr
= NULL
;
4715 php_pqcancel_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4717 zend_hash_init(&php_pqcancel_object_prophandlers
, 1, NULL
, NULL
, 1);
4719 zend_declare_property_null(php_pqcancel_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4720 ph
.read
= php_pqcancel_object_read_connection
;
4721 zend_hash_add(&php_pqcancel_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4723 memset(&ce
, 0, sizeof(ce
));
4724 INIT_NS_CLASS_ENTRY(ce
, "pq", "Event", php_pqevent_methods
);
4725 php_pqevent_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4726 php_pqevent_class_entry
->create_object
= php_pqevent_create_object
;
4728 memcpy(&php_pqevent_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4729 php_pqevent_object_handlers
.read_property
= php_pq_object_read_prop
;
4730 php_pqevent_object_handlers
.write_property
= php_pq_object_write_prop
;
4731 php_pqevent_object_handlers
.clone_obj
= NULL
;
4732 php_pqevent_object_handlers
.get_property_ptr_ptr
= NULL
;
4733 php_pqevent_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4735 zend_hash_init(&php_pqevent_object_prophandlers
, 2, NULL
, NULL
, 1);
4737 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4738 ph
.read
= php_pqevent_object_read_connection
;
4739 zend_hash_add(&php_pqevent_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4741 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("type"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4742 ph
.read
= php_pqevent_object_read_type
;
4743 zend_hash_add(&php_pqevent_object_prophandlers
, "type", sizeof("type"), (void *) &ph
, sizeof(ph
), NULL
);
4745 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("NOTICE"), ZEND_STRL("notice") TSRMLS_CC
);
4746 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESULT"), ZEND_STRL("result") TSRMLS_CC
);
4747 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESET"), ZEND_STRL("reset") TSRMLS_CC
);
4749 memset(&ce
, 0, sizeof(ce
));
4750 INIT_NS_CLASS_ENTRY(ce
, "pq", "LOB", php_pqlob_methods
);
4751 php_pqlob_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4752 php_pqlob_class_entry
->create_object
= php_pqlob_create_object
;
4754 memcpy(&php_pqlob_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4755 php_pqlob_object_handlers
.read_property
= php_pq_object_read_prop
;
4756 php_pqlob_object_handlers
.write_property
= php_pq_object_write_prop
;
4757 php_pqlob_object_handlers
.clone_obj
= NULL
;
4758 php_pqlob_object_handlers
.get_property_ptr_ptr
= NULL
;
4759 php_pqlob_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4761 zend_hash_init(&php_pqlob_object_prophandlers
, 2, NULL
, NULL
, 1);
4763 zend_declare_property_null(php_pqlob_class_entry
, ZEND_STRL("transaction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4764 ph
.read
= php_pqlob_object_read_transaction
;
4765 zend_hash_add(&php_pqlob_object_prophandlers
, "transaction", sizeof("transaction"), (void *) &ph
, sizeof(ph
), NULL
);
4767 zend_declare_property_long(php_pqlob_class_entry
, ZEND_STRL("oid"), InvalidOid
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4768 ph
.read
= php_pqlob_object_read_oid
;
4769 zend_hash_add(&php_pqlob_object_prophandlers
, "oid", sizeof("oid"), (void *) &ph
, sizeof(ph
), NULL
);
4771 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("INVALID_OID"), InvalidOid TSRMLS_CC
);
4772 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("R"), INV_READ TSRMLS_CC
);
4773 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("W"), INV_WRITE TSRMLS_CC
);
4774 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("RW"), INV_READ
|INV_WRITE TSRMLS_CC
);
4776 memset(&ce
, 0, sizeof(ce
));
4777 INIT_NS_CLASS_ENTRY(ce
, "pq", "COPY", php_pqcopy_methods
);
4778 php_pqcopy_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4779 php_pqcopy_class_entry
->create_object
= php_pqcopy_create_object
;
4781 memcpy(&php_pqcopy_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4782 php_pqcopy_object_handlers
.read_property
= php_pq_object_read_prop
;
4783 php_pqcopy_object_handlers
.write_property
= php_pq_object_write_prop
;
4784 php_pqcopy_object_handlers
.clone_obj
= NULL
;
4785 php_pqcopy_object_handlers
.get_property_ptr_ptr
= NULL
;
4786 php_pqcopy_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4788 zend_hash_init(&php_pqcopy_object_prophandlers
, 4, NULL
, NULL
, 1);
4790 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4791 ph
.read
= php_pqcopy_object_read_connection
;
4792 zend_hash_add(&php_pqcopy_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4794 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("expression"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4795 ph
.read
= php_pqcopy_object_read_expression
;
4796 zend_hash_add(&php_pqcopy_object_prophandlers
, "expression", sizeof("expression"), (void *) &ph
, sizeof(ph
), NULL
);
4798 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("direction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4799 ph
.read
= php_pqcopy_object_read_direction
;
4800 zend_hash_add(&php_pqcopy_object_prophandlers
, "direction", sizeof("direction"), (void *) &ph
, sizeof(ph
), NULL
);
4802 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4803 ph
.read
= php_pqcopy_object_read_options
;
4804 zend_hash_add(&php_pqcopy_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
4806 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("FROM_STDIN"), PHP_PQCOPY_FROM_STDIN TSRMLS_CC
);
4807 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("TO_STDOUT"), PHP_PQCOPY_TO_STDOUT TSRMLS_CC
);
4810 REGISTER_INI_ENTRIES();
4816 /* {{{ PHP_MSHUTDOWN_FUNCTION
4818 static PHP_MSHUTDOWN_FUNCTION(pq
)
4820 /* uncomment this line if you have INI entries
4821 UNREGISTER_INI_ENTRIES();
4827 /* {{{ PHP_MINFO_FUNCTION
4829 static PHP_MINFO_FUNCTION(pq
)
4831 #ifdef HAVE_PQLIBVERSION
4834 char libpq_version
[10] = "pre-9.1";
4836 php_info_print_table_start();
4837 php_info_print_table_header(2, "PQ Support", "enabled");
4838 php_info_print_table_row(2, "Extension Version", PHP_PQ_EXT_VERSION
);
4839 php_info_print_table_end();
4841 php_info_print_table_start();
4842 php_info_print_table_header(2, "Used Library", "Version");
4843 #ifdef HAVE_PQLIBVERSION
4844 libpq_v
= PQlibVersion();
4845 slprintf(libpq_version
, sizeof(libpq_version
), "%d.%d.%d", libpq_v
/10000%100, libpq_v
/100%100, libpq_v
%100);
4847 php_info_print_table_row(2, "libpq", libpq_version
);
4848 php_info_print_table_end();
4850 /* Remove comments if you have entries in php.ini
4851 DISPLAY_INI_ENTRIES();
4856 const zend_function_entry pq_functions
[] = {
4860 /* {{{ pq_module_entry
4862 zend_module_entry pq_module_entry
= {
4863 STANDARD_MODULE_HEADER
,
4868 NULL
,/*PHP_RINIT(pq),*/
4869 NULL
,/*PHP_RSHUTDOWN(pq),*/
4872 STANDARD_MODULE_PROPERTIES
4876 #ifdef COMPILE_DL_PQ
4886 * vim600: noet sw=4 ts=4 fdm=marker
4887 * vim<600: noet sw=4 ts=4