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>
21 #include <ext/raphf/php_raphf.h>
23 #include <libpq-events.h>
24 #include <libpq/libpq-fs.h>
29 typedef int STATUS
; /* SUCCESS/FAILURE */
31 static char *rtrim(char *e
) {
34 while (l
-- > 0 && e
[l
] == '\n') {
40 #define PHP_PQerrorMessage(c) rtrim(PQerrorMessage((c)))
41 #define PHP_PQresultErrorMessage(r) rtrim(PQresultErrorMessage((r)))
43 static int php_pqconn_event(PGEventId id
, void *e
, void *data
);
45 #define PHP_PQclear(_r) \
47 zval *_resinszv = PQresultInstanceData((_r), php_pqconn_event); \
48 if (!_resinszv) PQclear((_r)); \
52 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 #define PHP_PQCONN_ASYNC 0x01
110 #define PHP_PQCONN_PERSISTENT 0x02
112 typedef struct php_pqconn
{
114 int (*poller
)(PGconn
*);
115 php_resource_factory_t factory
;
117 HashTable eventhandlers
;
118 php_pq_callback_t onevent
;
119 unsigned unbuffered
:1;
122 typedef struct php_pqconn_object
{
124 zend_object_value zv
;
125 HashTable
*prophandler
;
126 php_pqconn_t
*intern
;
127 } php_pqconn_object_t
;
129 typedef struct php_pqtypes
{
131 php_pqconn_object_t
*conn
;
134 typedef struct php_pqtypes_object
{
136 zend_object_value zv
;
137 HashTable
*prophandler
;
138 php_pqtypes_t
*intern
;
139 } php_pqtypes_object_t
;
141 typedef struct php_pqconn_event_data
{
142 php_pqconn_object_t
*obj
;
146 } php_pqconn_event_data_t
;
148 typedef enum php_pqres_fetch
{
149 PHP_PQRES_FETCH_ARRAY
,
150 PHP_PQRES_FETCH_ASSOC
,
151 PHP_PQRES_FETCH_OBJECT
154 typedef struct php_pqres_iterator
{
155 zend_object_iterator zi
;
158 php_pqres_fetch_t fetch_type
;
159 } php_pqres_iterator_t
;
161 typedef struct php_pqres
{
163 php_pqres_iterator_t
*iter
;
167 typedef struct php_pqres_object
{
169 zend_object_value zv
;
170 HashTable
*prophandler
;
172 } php_pqres_object_t
;
174 typedef struct php_pqstm
{
175 php_pqconn_object_t
*conn
;
180 typedef struct php_pqstm_object
{
182 zend_object_value zv
;
183 HashTable
*prophandler
;
185 } php_pqstm_object_t
;
187 typedef enum php_pqtxn_isolation
{
188 PHP_PQTXN_READ_COMMITTED
,
189 PHP_PQTXN_REPEATABLE_READ
,
190 PHP_PQTXN_SERIALIZABLE
,
191 } php_pqtxn_isolation_t
;
193 typedef struct php_pqtxn
{
194 php_pqconn_object_t
*conn
;
195 php_pqtxn_isolation_t isolation
;
198 unsigned deferrable
:1;
201 typedef struct php_pqtxn_object
{
203 zend_object_value zv
;
204 HashTable
*prophandler
;
206 } php_pqtxn_object_t
;
208 typedef struct php_pqcancel
{
210 php_pqconn_object_t
*conn
;
213 typedef struct php_pqcancel_object
{
215 zend_object_value zv
;
216 HashTable
*prophandler
;
217 php_pqcancel_t
*intern
;
218 } php_pqcancel_object_t
;
220 typedef struct php_pqevent
{
221 php_pq_callback_t cb
;
222 php_pqconn_object_t
*conn
;
226 typedef struct php_pqevent_object
{
228 zend_object_value zv
;
229 HashTable
*prophandler
;
230 php_pqevent_t
*intern
;
231 } php_pqevent_object_t
;
233 typedef struct php_pqlob
{
236 php_pqtxn_object_t
*txn
;
239 typedef struct php_pqlob_object
{
241 zend_object_value zv
;
242 HashTable
*prophandler
;
244 } php_pqlob_object_t
;
246 typedef enum php_pqcopy_direction
{
247 PHP_PQCOPY_FROM_STDIN
,
249 } php_pqcopy_direction_t
;
251 typedef enum php_pqcopy_status
{
255 } php_pqcopy_status_t
;
257 typedef struct php_pqcopy
{
258 php_pqcopy_direction_t direction
;
261 php_pqconn_object_t
*conn
;
264 typedef struct php_pqcopy_object
{
266 zend_object_value zv
;
267 HashTable
*prophandler
;
268 php_pqcopy_t
*intern
;
269 } php_pqcopy_object_t
;
271 static HashTable php_pqconn_object_prophandlers
;
272 static HashTable php_pqtypes_object_prophandlers
;
273 static HashTable php_pqres_object_prophandlers
;
274 static HashTable php_pqstm_object_prophandlers
;
275 static HashTable php_pqtxn_object_prophandlers
;
276 static HashTable php_pqcancel_object_prophandlers
;
277 static HashTable php_pqevent_object_prophandlers
;
278 static HashTable php_pqlob_object_prophandlers
;
279 static HashTable php_pqcopy_object_prophandlers
;
281 typedef void (*php_pq_object_prophandler_func_t
)(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
);
283 typedef struct php_pq_object_prophandler
{
284 php_pq_object_prophandler_func_t read
;
285 php_pq_object_prophandler_func_t write
;
286 } php_pq_object_prophandler_t
;
288 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
290 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
292 php_pqres_iterator_t
*iter
;
293 zval
*prop
, *zfetch_type
;
295 iter
= ecalloc(1, sizeof(*iter
));
296 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
297 iter
->zi
.data
= object
;
300 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
301 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
302 convert_to_long_ex(&zfetch_type
);
304 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
305 if (zfetch_type
!= prop
) {
306 zval_ptr_dtor(&zfetch_type
);
308 if (Z_REFCOUNT_P(prop
)) {
309 zval_ptr_dtor(&prop
);
315 return (zend_object_iterator
*) iter
;
318 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
320 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
322 if (iter
->current_val
) {
323 zval_ptr_dtor(&iter
->current_val
);
324 iter
->current_val
= NULL
;
326 zval_ptr_dtor((zval
**) &iter
->zi
.data
);
330 static STATUS
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
332 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
333 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
335 if (PQresultStatus(obj
->intern
->res
) != PGRES_TUPLES_OK
) {
338 if (PQntuples(obj
->intern
->res
) <= iter
->index
) {
345 static zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type
, zval
**data_ptr TSRMLS_DC
)
355 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
365 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
366 if (PQgetisnull(res
, row
, c
)) {
367 switch (fetch_type
) {
368 case PHP_PQRES_FETCH_OBJECT
:
369 add_property_null(data
, PQfname(res
, c
));
372 case PHP_PQRES_FETCH_ASSOC
:
373 add_assoc_null(data
, PQfname(res
, c
));
376 case PHP_PQRES_FETCH_ARRAY
:
377 add_index_null(data
, c
);
381 char *val
= PQgetvalue(res
, row
, c
);
382 int len
= PQgetlength(res
, row
, c
);
384 switch (fetch_type
) {
385 case PHP_PQRES_FETCH_OBJECT
:
386 add_property_stringl(data
, PQfname(res
, c
), val
, len
, 1);
389 case PHP_PQRES_FETCH_ASSOC
:
390 add_assoc_stringl(data
, PQfname(res
, c
), val
, len
, 1);
393 case PHP_PQRES_FETCH_ARRAY
:
394 add_index_stringl(data
, c
, val
, len
,1);
403 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
405 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
406 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
408 if (iter
->current_val
) {
409 zval_ptr_dtor(&iter
->current_val
);
411 iter
->current_val
= php_pqres_row_to_zval(obj
->intern
->res
, iter
->index
, iter
->fetch_type
, NULL TSRMLS_CC
);
412 *data_ptr
= &iter
->current_val
;
415 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
417 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
419 *key_num
= (ulong
) iter
->index
;
421 return HASH_KEY_IS_LONG
;
424 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
426 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
431 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
433 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
438 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
439 php_pqres_iterator_dtor
,
440 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
441 php_pqres_iterator_valid
,
442 /* fetch the item data for the current element */
443 php_pqres_iterator_current
,
444 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
445 php_pqres_iterator_key
,
446 /* step forwards to next element */
447 php_pqres_iterator_next
,
448 /* rewind to start of data (optional, may be NULL) */
449 php_pqres_iterator_rewind
,
450 /* invalidate current value/key (optional, may be NULL) */
454 static int php_pqres_count_elements(zval
*object
, long *count TSRMLS_DC
)
456 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
459 *count
= (long) PQntuples(obj
->intern
->res
);
466 static STATUS
php_pqres_success(PGresult
*res TSRMLS_DC
)
468 switch (PQresultStatus(res
)) {
469 case PGRES_BAD_RESPONSE
:
470 case PGRES_NONFATAL_ERROR
:
471 case PGRES_FATAL_ERROR
:
472 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "%s", PHP_PQresultErrorMessage(res
));
479 static void php_pq_callback_dtor(php_pq_callback_t
*cb
) {
480 if (cb
->fci
.size
> 0) {
481 zend_fcall_info_args_clear(&cb
->fci
, 1);
482 zval_ptr_dtor(&cb
->fci
.function_name
);
483 if (cb
->fci
.object_ptr
) {
484 zval_ptr_dtor(&cb
->fci
.object_ptr
);
490 static void php_pq_callback_addref(php_pq_callback_t
*cb
)
492 Z_ADDREF_P(cb
->fci
.function_name
);
493 if (cb
->fci
.object_ptr
) {
494 Z_ADDREF_P(cb
->fci
.object_ptr
);
498 static void php_pq_object_to_zval(void *o
, zval
**zv TSRMLS_DC
)
500 php_pq_object_t
*obj
= o
;
506 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
508 (*zv
)->type
= IS_OBJECT
;
509 (*zv
)->value
.obj
= obj
->zv
;
512 static void php_pq_object_addref(void *o TSRMLS_DC
)
514 php_pq_object_t
*obj
= o
;
515 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
518 static void php_pq_object_delref(void *o TSRMLS_DC
)
520 php_pq_object_t
*obj
= o
;
521 zend_objects_store_del_ref_by_handle_ex(obj
->zv
.handle
, obj
->zv
.handlers TSRMLS_CC
);
524 static void php_pqconn_object_free(void *o TSRMLS_DC
)
526 php_pqconn_object_t
*obj
= o
;
529 php_resource_factory_handle_dtor(&obj
->intern
->factory
, obj
->intern
->conn TSRMLS_CC
);
530 php_resource_factory_dtor(&obj
->intern
->factory
);
531 php_pq_callback_dtor(&obj
->intern
->onevent
);
532 zend_hash_destroy(&obj
->intern
->listeners
);
533 zend_hash_destroy(&obj
->intern
->eventhandlers
);
537 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
541 static void php_pqtypes_object_free(void *o TSRMLS_DC
)
543 php_pqtypes_object_t
*obj
= o
;
546 zend_hash_destroy(&obj
->intern
->types
);
547 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
551 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
555 static void php_pqres_object_free(void *o TSRMLS_DC
)
557 php_pqres_object_t
*obj
= o
;
560 if (obj
->intern
->res
) {
561 zval
*res
= PQresultInstanceData(obj
->intern
->res
, php_pqconn_event
);
563 if (1 == Z_REFCOUNT_P(res
)) {
564 PQresultSetInstanceData(obj
->intern
->res
, php_pqconn_event
, NULL
);
568 PQclear(obj
->intern
->res
);
569 obj
->intern
->res
= NULL
;
573 if (obj
->intern
->iter
) {
574 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
575 obj
->intern
->iter
= NULL
;
578 zend_hash_destroy(&obj
->intern
->bound
);
583 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
587 static void php_pqstm_object_free(void *o TSRMLS_DC
)
589 php_pqstm_object_t
*obj
= o
;
592 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
593 efree(obj
->intern
->name
);
594 zend_hash_destroy(&obj
->intern
->bound
);
598 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
602 static void php_pqtxn_object_free(void *o TSRMLS_DC
)
604 php_pqtxn_object_t
*obj
= o
;
607 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
611 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
615 static void php_pqcancel_object_free(void *o TSRMLS_DC
)
617 php_pqcancel_object_t
*obj
= o
;
620 PQfreeCancel(obj
->intern
->cancel
);
621 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
625 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
629 static void php_pqevent_object_free(void *o TSRMLS_DC
)
631 php_pqevent_object_t
*obj
= o
;
634 php_pq_callback_dtor(&obj
->intern
->cb
);
635 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
636 efree(obj
->intern
->type
);
640 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
644 static void php_pqlob_object_free(void *o TSRMLS_DC
)
646 php_pqlob_object_t
*obj
= o
;
649 if (obj
->intern
->lofd
) {
650 lo_close(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
652 php_pq_object_delref(obj
->intern
->txn TSRMLS_CC
);
656 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
660 static void php_pqcopy_object_free(void *o TSRMLS_DC
)
662 php_pqcopy_object_t
*obj
= o
;
665 efree(obj
->intern
->expression
);
666 efree(obj
->intern
->options
);
667 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
671 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
675 static zend_object_value
php_pqconn_create_object_ex(zend_class_entry
*ce
, php_pqconn_t
*intern
, php_pqconn_object_t
**ptr TSRMLS_DC
)
677 php_pqconn_object_t
*o
;
679 o
= ecalloc(1, sizeof(*o
));
680 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
681 object_properties_init((zend_object
*) o
, ce
);
682 o
->prophandler
= &php_pqconn_object_prophandlers
;
692 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqconn_object_free
, NULL TSRMLS_CC
);
693 o
->zv
.handlers
= &php_pqconn_object_handlers
;
698 static zend_object_value
php_pqtypes_create_object_ex(zend_class_entry
*ce
, php_pqtypes_t
*intern
, php_pqtypes_object_t
**ptr TSRMLS_DC
)
700 php_pqtypes_object_t
*o
;
702 o
= ecalloc(1, sizeof(*o
));
703 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
704 object_properties_init((zend_object
*) o
, ce
);
705 o
->prophandler
= &php_pqtypes_object_prophandlers
;
715 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtypes_object_free
, NULL TSRMLS_CC
);
716 o
->zv
.handlers
= &php_pqtypes_object_handlers
;
721 static zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, php_pqres_t
*intern
, php_pqres_object_t
**ptr TSRMLS_DC
)
723 php_pqres_object_t
*o
;
725 o
= ecalloc(1, sizeof(*o
));
726 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
727 object_properties_init((zend_object
*) o
, ce
);
728 o
->prophandler
= &php_pqres_object_prophandlers
;
738 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
739 o
->zv
.handlers
= &php_pqres_object_handlers
;
744 static zend_object_value
php_pqstm_create_object_ex(zend_class_entry
*ce
, php_pqstm_t
*intern
, php_pqstm_object_t
**ptr TSRMLS_DC
)
746 php_pqstm_object_t
*o
;
748 o
= ecalloc(1, sizeof(*o
));
749 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
750 object_properties_init((zend_object
*) o
, ce
);
751 o
->prophandler
= &php_pqstm_object_prophandlers
;
761 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqstm_object_free
, NULL TSRMLS_CC
);
762 o
->zv
.handlers
= &php_pqstm_object_handlers
;
767 static zend_object_value
php_pqtxn_create_object_ex(zend_class_entry
*ce
, php_pqtxn_t
*intern
, php_pqtxn_object_t
**ptr TSRMLS_DC
)
769 php_pqtxn_object_t
*o
;
771 o
= ecalloc(1, sizeof(*o
));
772 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
773 object_properties_init((zend_object
*) o
, ce
);
774 o
->prophandler
= &php_pqtxn_object_prophandlers
;
784 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtxn_object_free
, NULL TSRMLS_CC
);
785 o
->zv
.handlers
= &php_pqtxn_object_handlers
;
790 static zend_object_value
php_pqcancel_create_object_ex(zend_class_entry
*ce
, php_pqcancel_t
*intern
, php_pqcancel_object_t
**ptr TSRMLS_DC
)
792 php_pqcancel_object_t
*o
;
794 o
= ecalloc(1, sizeof(*o
));
795 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
796 object_properties_init((zend_object
*) o
, ce
);
797 o
->prophandler
= &php_pqcancel_object_prophandlers
;
807 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcancel_object_free
, NULL TSRMLS_CC
);
808 o
->zv
.handlers
= &php_pqcancel_object_handlers
;
813 static zend_object_value
php_pqevent_create_object_ex(zend_class_entry
*ce
, php_pqevent_t
*intern
, php_pqevent_object_t
**ptr TSRMLS_DC
)
815 php_pqevent_object_t
*o
;
817 o
= ecalloc(1, sizeof(*o
));
818 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
819 object_properties_init((zend_object
*) o
, ce
);
820 o
->prophandler
= &php_pqevent_object_prophandlers
;
830 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqevent_object_free
, NULL TSRMLS_CC
);
831 o
->zv
.handlers
= &php_pqevent_object_handlers
;
836 static zend_object_value
php_pqlob_create_object_ex(zend_class_entry
*ce
, php_pqlob_t
*intern
, php_pqlob_object_t
**ptr TSRMLS_DC
)
838 php_pqlob_object_t
*o
;
840 o
= ecalloc(1, sizeof(*o
));
841 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
842 object_properties_init((zend_object
*) o
, ce
);
843 o
->prophandler
= &php_pqlob_object_prophandlers
;
853 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqlob_object_free
, NULL TSRMLS_CC
);
854 o
->zv
.handlers
= &php_pqlob_object_handlers
;
859 static zend_object_value
php_pqcopy_create_object_ex(zend_class_entry
*ce
, php_pqcopy_t
*intern
, php_pqcopy_object_t
**ptr TSRMLS_DC
)
861 php_pqcopy_object_t
*o
;
863 o
= ecalloc(1, sizeof(*o
));
864 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
865 object_properties_init((zend_object
*) o
, ce
);
866 o
->prophandler
= &php_pqcopy_object_prophandlers
;
876 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcopy_object_free
, NULL TSRMLS_CC
);
877 o
->zv
.handlers
= &php_pqcopy_object_handlers
;
882 static zend_object_value
php_pqconn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
884 return php_pqconn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
887 static zend_object_value
php_pqtypes_create_object(zend_class_entry
*class_type TSRMLS_DC
)
889 return php_pqtypes_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
892 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
894 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
897 static zend_object_value
php_pqstm_create_object(zend_class_entry
*class_type TSRMLS_DC
)
899 return php_pqstm_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
902 static zend_object_value
php_pqtxn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
904 return php_pqtxn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
907 static zend_object_value
php_pqcancel_create_object(zend_class_entry
*class_type TSRMLS_DC
)
909 return php_pqcancel_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
912 static zend_object_value
php_pqevent_create_object(zend_class_entry
*class_type TSRMLS_DC
)
914 return php_pqevent_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
917 static zend_object_value
php_pqlob_create_object(zend_class_entry
*class_type TSRMLS_DC
)
919 return php_pqlob_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
922 static zend_object_value
php_pqcopy_create_object(zend_class_entry
*class_type TSRMLS_DC
)
924 return php_pqcopy_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
927 static int apply_ph_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
929 php_pq_object_prophandler_t
*ph
= p
;
930 HashTable
*ht
= va_arg(argv
, HashTable
*);
931 zval
**return_value
, *object
= va_arg(argv
, zval
*);
932 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
934 if (SUCCESS
== zend_hash_find(ht
, key
->arKey
, key
->nKeyLength
, (void *) &return_value
)) {
937 zval_ptr_dtor(return_value
);
938 MAKE_STD_ZVAL(*return_value
);
939 ZVAL_NULL(*return_value
);
941 ph
->read(object
, obj
, *return_value TSRMLS_CC
);
945 return ZEND_HASH_APPLY_KEEP
;
948 static int apply_pi_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
950 zend_property_info
*pi
= p
;
951 HashTable
*ht
= va_arg(argv
, HashTable
*);
952 zval
*object
= va_arg(argv
, zval
*);
953 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
954 zval
*property
= zend_read_property(obj
->zo
.ce
, object
, pi
->name
, pi
->name_length
, 0 TSRMLS_CC
);
956 if (1||!Z_REFCOUNT_P(property
)) {
957 Z_ADDREF_P(property
);
959 zend_hash_add(ht
, pi
->name
, pi
->name_length
+ 1, (void *) &property
, sizeof(zval
*), NULL
);
961 return ZEND_HASH_APPLY_KEEP
;
964 static HashTable
*php_pq_object_debug_info(zval
*object
, int *temp TSRMLS_DC
)
967 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
971 ZEND_INIT_SYMTABLE(ht
);
973 zend_hash_apply_with_arguments(&obj
->zo
.ce
->properties_info TSRMLS_CC
, apply_pi_to_debug
, 3, ht
, object
, obj
);
974 zend_hash_apply_with_arguments(obj
->prophandler TSRMLS_CC
, apply_ph_to_debug
, 3, ht
, object
, obj
);
979 static void php_pqconn_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
981 php_pqconn_object_t
*obj
= o
;
983 RETVAL_LONG(PQstatus(obj
->intern
->conn
));
986 static void php_pqconn_object_read_transaction_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
988 php_pqconn_object_t
*obj
= o
;
990 RETVAL_LONG(PQtransactionStatus(obj
->intern
->conn
));
993 static void php_pqconn_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
995 php_pqconn_object_t
*obj
= o
;
996 char *error
= PHP_PQerrorMessage(obj
->intern
->conn
);
999 RETVAL_STRING(error
, 1);
1005 static int apply_notify_listener(void *p
, void *arg TSRMLS_DC
)
1007 php_pq_callback_t
*listener
= p
;
1008 PGnotify
*nfy
= arg
;
1009 zval
*zpid
, *zchannel
, *zmessage
;
1011 MAKE_STD_ZVAL(zpid
);
1012 ZVAL_LONG(zpid
, nfy
->be_pid
);
1013 MAKE_STD_ZVAL(zchannel
);
1014 ZVAL_STRING(zchannel
, nfy
->relname
, 1);
1015 MAKE_STD_ZVAL(zmessage
);
1016 ZVAL_STRING(zmessage
, nfy
->extra
, 1);
1018 zend_fcall_info_argn(&listener
->fci TSRMLS_CC
, 3, &zchannel
, &zmessage
, &zpid
);
1019 zend_fcall_info_call(&listener
->fci
, &listener
->fcc
, NULL
, NULL TSRMLS_CC
);
1021 zval_ptr_dtor(&zchannel
);
1022 zval_ptr_dtor(&zmessage
);
1023 zval_ptr_dtor(&zpid
);
1025 return ZEND_HASH_APPLY_KEEP
;
1028 static int apply_notify_listeners(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
1030 HashTable
*listeners
= p
;
1031 PGnotify
*nfy
= va_arg(argv
, PGnotify
*);
1033 if (0 == fnmatch(key
->arKey
, nfy
->relname
, 0)) {
1034 zend_hash_apply_with_argument(listeners
, apply_notify_listener
, nfy TSRMLS_CC
);
1037 return ZEND_HASH_APPLY_KEEP
;
1040 static void php_pqconn_notify_listeners(php_pqconn_object_t
*obj TSRMLS_DC
)
1044 while ((nfy
= PQnotifies(obj
->intern
->conn
))) {
1045 zend_hash_apply_with_arguments(&obj
->intern
->listeners TSRMLS_CC
, apply_notify_listeners
, 1, nfy
);
1050 static void php_pqconn_object_read_busy(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1052 php_pqconn_object_t
*obj
= o
;
1054 RETVAL_BOOL(PQisBusy(obj
->intern
->conn
));
1057 static void php_pqconn_object_read_encoding(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1059 php_pqconn_object_t
*obj
= o
;
1061 RETVAL_STRING(pg_encoding_to_char(PQclientEncoding(obj
->intern
->conn
)), 1);
1064 static void php_pqconn_object_write_encoding(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1066 php_pqconn_object_t
*obj
= o
;
1069 if (Z_TYPE_P(value
) != IS_STRING
) {
1070 convert_to_string_ex(&zenc
);
1073 if (0 > PQsetClientEncoding(obj
->intern
->conn
, Z_STRVAL_P(zenc
))) {
1074 zend_error(E_NOTICE
, "Unrecognized encoding '%s'", Z_STRVAL_P(zenc
));
1077 if (zenc
!= value
) {
1078 zval_ptr_dtor(&zenc
);
1082 static void php_pqconn_object_read_unbuffered(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1084 php_pqconn_object_t
*obj
= o
;
1086 RETVAL_BOOL(obj
->intern
->unbuffered
);
1089 static void php_pqconn_object_write_unbuffered(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1091 php_pqconn_object_t
*obj
= o
;
1093 obj
->intern
->unbuffered
= zend_is_true(value
);
1096 static void php_pqconn_object_read_db(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1098 php_pqconn_object_t
*obj
= o
;
1099 char *db
= PQdb(obj
->intern
->conn
);
1102 RETVAL_STRING(db
, 1);
1104 RETVAL_EMPTY_STRING();
1108 static void php_pqconn_object_read_user(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1110 php_pqconn_object_t
*obj
= o
;
1111 char *user
= PQuser(obj
->intern
->conn
);
1114 RETVAL_STRING(user
, 1);
1116 RETVAL_EMPTY_STRING();
1120 static void php_pqconn_object_read_pass(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1122 php_pqconn_object_t
*obj
= o
;
1123 char *pass
= PQpass(obj
->intern
->conn
);
1126 RETVAL_STRING(pass
, 1);
1128 RETVAL_EMPTY_STRING();
1132 static void php_pqconn_object_read_host(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1134 php_pqconn_object_t
*obj
= o
;
1135 char *host
= PQhost(obj
->intern
->conn
);
1138 RETVAL_STRING(host
, 1);
1140 RETVAL_EMPTY_STRING();
1144 static void php_pqconn_object_read_port(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1146 php_pqconn_object_t
*obj
= o
;
1147 char *port
= PQport(obj
->intern
->conn
);
1150 RETVAL_STRING(port
, 1);
1152 RETVAL_EMPTY_STRING();
1156 static void php_pqconn_object_read_options(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1158 php_pqconn_object_t
*obj
= o
;
1159 char *options
= PQoptions(obj
->intern
->conn
);
1162 RETVAL_STRING(options
, 1);
1164 RETVAL_EMPTY_STRING();
1168 static void php_pqtypes_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1170 php_pqtypes_object_t
*obj
= o
;
1172 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1175 static int has_dimension(HashTable
*ht
, zval
*member
, char **key_str
, int *key_len
, long *index TSRMLS_DC
)
1180 switch (Z_TYPE_P(member
)) {
1182 convert_to_string_ex(&tmp
);
1185 if (!is_numeric_string(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
), &lval
, NULL
, 0)) {
1186 if (member
!= tmp
) {
1187 zval_ptr_dtor(&tmp
);
1190 *key_str
= estrndup(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
));
1192 *key_len
= Z_STRLEN_P(tmp
) + 1;
1195 return zend_hash_exists(ht
, Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
) + 1);
1199 lval
= Z_LVAL_P(member
);
1203 if (member
!= tmp
) {
1204 zval_ptr_dtor(&tmp
);
1209 return zend_hash_index_exists(ht
, lval
);
1212 static int php_pqtypes_object_has_dimension(zval
*object
, zval
*member
, int check_empty TSRMLS_DC
)
1214 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1215 char *key_str
= NULL
;
1220 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1223 if (key_str
&& key_len
) {
1224 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1226 return Z_TYPE_PP(data
) != IS_NULL
;
1230 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) data
)) {
1231 return Z_TYPE_PP(data
) != IS_NULL
;
1236 return has_dimension(&obj
->intern
->types
, member
, NULL
, NULL
, NULL TSRMLS_CC
);
1242 static zval
*php_pqtypes_object_read_dimension(zval
*object
, zval
*member
, int type TSRMLS_DC
)
1245 char *key_str
= NULL
;
1247 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1249 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1252 if (key_str
&& key_len
) {
1253 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1258 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) &data
)) {
1267 static void php_pqres_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1269 php_pqres_object_t
*obj
= o
;
1271 RETVAL_LONG(PQresultStatus(obj
->intern
->res
));
1274 static void php_pqres_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1276 php_pqres_object_t
*obj
= o
;
1277 char *error
= PHP_PQresultErrorMessage(obj
->intern
->res
);
1280 RETVAL_STRING(error
, 1);
1286 static void php_pqres_object_read_num_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1288 php_pqres_object_t
*obj
= o
;
1290 RETVAL_LONG(PQntuples(obj
->intern
->res
));
1293 static void php_pqres_object_read_num_cols(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1295 php_pqres_object_t
*obj
= o
;
1297 RETVAL_LONG(PQnfields(obj
->intern
->res
));
1300 static void php_pqres_object_read_affected_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1302 php_pqres_object_t
*obj
= o
;
1304 RETVAL_LONG(atoi(PQcmdTuples(obj
->intern
->res
)));
1307 static void php_pqres_object_read_fetch_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1309 php_pqres_object_t
*obj
= o
;
1311 if (obj
->intern
->iter
) {
1312 RETVAL_LONG(obj
->intern
->iter
->fetch_type
);
1314 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
1318 static void php_pqres_object_write_fetch_type(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1320 php_pqres_object_t
*obj
= o
;
1321 zval
*zfetch_type
= value
;
1323 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
1324 convert_to_long_ex(&zfetch_type
);
1327 if (!obj
->intern
->iter
) {
1328 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
1329 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
1331 obj
->intern
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
1333 if (zfetch_type
!= value
) {
1334 zval_ptr_dtor(&zfetch_type
);
1338 static void php_pqstm_object_read_name(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1340 php_pqstm_object_t
*obj
= o
;
1342 RETVAL_STRING(obj
->intern
->name
, 1);
1345 static void php_pqstm_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1347 php_pqstm_object_t
*obj
= o
;
1349 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1352 static void php_pqtxn_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1354 php_pqtxn_object_t
*obj
= o
;
1356 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1359 static void php_pqtxn_object_read_isolation(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1361 php_pqtxn_object_t
*obj
= o
;
1363 RETVAL_LONG(obj
->intern
->isolation
);
1366 static void php_pqtxn_object_read_readonly(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1368 php_pqtxn_object_t
*obj
= o
;
1370 RETVAL_LONG(obj
->intern
->readonly
);
1373 static void php_pqtxn_object_read_deferrable(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1375 php_pqtxn_object_t
*obj
= o
;
1377 RETVAL_LONG(obj
->intern
->deferrable
);
1380 static void php_pqtxn_object_write_isolation(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1382 php_pqtxn_object_t
*obj
= o
;
1383 php_pqtxn_isolation_t orig
= obj
->intern
->isolation
;
1384 zval
*zisolation
= value
;
1387 if (Z_TYPE_P(zisolation
) != IS_LONG
) {
1388 convert_to_long_ex(&zisolation
);
1391 switch ((obj
->intern
->isolation
= Z_LVAL_P(zisolation
))) {
1392 case PHP_PQTXN_READ_COMMITTED
:
1393 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ COMMITED");
1395 case PHP_PQTXN_REPEATABLE_READ
:
1396 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION REPEATABLE READ");
1398 case PHP_PQTXN_SERIALIZABLE
:
1399 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION SERIALIZABLE");
1402 obj
->intern
->isolation
= orig
;
1407 if (zisolation
!= value
) {
1408 zval_ptr_dtor(&zisolation
);
1412 php_pqres_success(res TSRMLS_CC
);
1417 static void php_pqtxn_object_write_readonly(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1419 php_pqtxn_object_t
*obj
= o
;
1422 if ((obj
->intern
->readonly
= zend_is_true(value
))) {
1423 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ ONLY");
1425 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ WRITE");
1429 php_pqres_success(res TSRMLS_CC
);
1434 static void php_pqtxn_object_write_deferrable(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1436 php_pqtxn_object_t
*obj
= o
;
1439 if ((obj
->intern
->deferrable
= zend_is_true(value
))) {
1440 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION DEFERRABLE");
1442 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION NOT DEFERRABLE");
1446 php_pqres_success(res TSRMLS_CC
);
1451 static void php_pqcancel_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1453 php_pqcancel_object_t
*obj
= o
;
1455 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1458 static void php_pqevent_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1460 php_pqevent_object_t
*obj
= o
;
1462 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1465 static void php_pqevent_object_read_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1467 php_pqevent_object_t
*obj
= o
;
1469 RETVAL_STRING(obj
->intern
->type
, 1);
1472 static void php_pqlob_object_read_transaction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1474 php_pqlob_object_t
*obj
= o
;
1476 php_pq_object_to_zval(obj
->intern
->txn
, &return_value TSRMLS_CC
);
1479 static void php_pqlob_object_read_oid(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1481 php_pqlob_object_t
*obj
= o
;
1483 RETVAL_LONG(obj
->intern
->loid
);
1486 static void php_pqcopy_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1488 php_pqcopy_object_t
*obj
= o
;
1490 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1493 static void php_pqcopy_object_read_direction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1495 php_pqcopy_object_t
*obj
= o
;
1497 RETVAL_LONG(obj
->intern
->direction
);
1500 static void php_pqcopy_object_read_expression(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1502 php_pqcopy_object_t
*obj
= o
;
1504 RETURN_STRING(obj
->intern
->expression
, 1);
1507 static void php_pqcopy_object_read_options(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1509 php_pqcopy_object_t
*obj
= o
;
1511 RETURN_STRING(obj
->intern
->options
, 1);
1514 static zend_class_entry
*ancestor(zend_class_entry
*ce
) {
1515 while (ce
->parent
) {
1521 static zval
*php_pq_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
1523 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1524 php_pq_object_prophandler_t
*handler
;
1528 zend_error(E_WARNING
, "%s not initialized", ancestor(obj
->zo
.ce
)->name
);
1529 } else if ((SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) && handler
->read
) {
1530 if (type
== BP_VAR_R
) {
1531 ALLOC_ZVAL(return_value
);
1532 Z_SET_REFCOUNT_P(return_value
, 0);
1533 Z_UNSET_ISREF_P(return_value
);
1535 handler
->read(object
, obj
, return_value TSRMLS_CC
);
1537 zend_error(E_ERROR
, "Cannot access %s properties by reference or array key/index", ancestor(obj
->zo
.ce
)->name
);
1538 return_value
= NULL
;
1541 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
1544 return return_value
;
1547 static void php_pq_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
1549 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1550 php_pq_object_prophandler_t
*handler
;
1552 if (SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
1553 if (handler
->write
) {
1554 handler
->write(object
, obj
, value TSRMLS_CC
);
1557 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
1561 static STATUS
php_pqconn_update_socket(zval
*this_ptr
, php_pqconn_object_t
*obj TSRMLS_DC
)
1563 zval
*zsocket
, zmember
;
1569 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1572 INIT_PZVAL(&zmember
);
1573 ZVAL_STRINGL(&zmember
, "socket", sizeof("socket")-1, 0);
1574 MAKE_STD_ZVAL(zsocket
);
1576 if ((CONNECTION_BAD
!= PQstatus(obj
->intern
->conn
))
1577 && (-1 < (socket
= PQsocket(obj
->intern
->conn
)))
1578 && (stream
= php_stream_fopen_from_fd(socket
, "r+b", NULL
))) {
1579 stream
->flags
|= PHP_STREAM_FLAG_NO_CLOSE
;
1580 php_stream_to_zval(stream
, zsocket
);
1586 zend_get_std_object_handlers()->write_property(getThis(), &zmember
, zsocket
, NULL TSRMLS_CC
);
1587 zval_ptr_dtor(&zsocket
);
1593 # define TSRMLS_DF(d) TSRMLS_D = (d)->ts
1594 # define TSRMLS_CF(d) (d)->ts = TSRMLS_C
1596 # define TSRMLS_DF(d)
1597 # define TSRMLS_CF(d)
1600 static int apply_event(void *p
, void *a TSRMLS_DC
)
1604 zval
*retval
= NULL
;
1606 zend_call_method_with_1_params(evh
, Z_OBJCE_PP(evh
), NULL
, "trigger", &retval
, args
);
1608 zval_ptr_dtor(&retval
);
1611 return ZEND_HASH_APPLY_KEEP
;
1614 static void php_pqconn_event_connreset(PGEventConnReset
*event
)
1616 php_pqconn_event_data_t
*data
= PQinstanceData(event
->conn
, php_pqconn_event
);
1622 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("reset"), (void *) &evhs
)) {
1623 zval
*args
, *connection
= NULL
;
1625 MAKE_STD_ZVAL(args
);
1627 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1628 add_next_index_zval(args
, connection
);
1629 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1630 zval_ptr_dtor(&args
);
1635 static zval
*result_instance_zval(PGresult
*res TSRMLS_DC
)
1637 zval
*rid
= PQresultInstanceData(res
, php_pqconn_event
);
1640 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1644 ZEND_INIT_SYMTABLE(&r
->bound
);
1645 rid
->type
= IS_OBJECT
;
1646 rid
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1648 PQresultSetInstanceData(res
, php_pqconn_event
, rid
);
1655 static void php_pqconn_event_resultcreate(PGEventResultCreate
*event
)
1657 php_pqconn_event_data_t
*data
= PQinstanceData(event
->conn
, php_pqconn_event
);
1663 /* event listener */
1664 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("result"), (void *) &evhs
)) {
1665 zval
*args
, *connection
= NULL
, *res
= result_instance_zval(event
->result TSRMLS_CC
);
1667 MAKE_STD_ZVAL(args
);
1669 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1670 add_next_index_zval(args
, connection
);
1671 add_next_index_zval(args
, res
);
1672 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1673 zval_ptr_dtor(&args
);
1676 /* async callback */
1677 if (data
->obj
->intern
->onevent
.fci
.size
> 0) {
1678 zval
*res
= result_instance_zval(event
->result TSRMLS_CC
);
1680 zend_fcall_info_argn(&data
->obj
->intern
->onevent
.fci TSRMLS_CC
, 1, &res
);
1681 zend_fcall_info_call(&data
->obj
->intern
->onevent
.fci
, &data
->obj
->intern
->onevent
.fcc
, NULL
, NULL TSRMLS_CC
);
1682 zval_ptr_dtor(&res
);
1687 static int php_pqconn_event(PGEventId id
, void *e
, void *data
)
1690 case PGEVT_CONNRESET
:
1691 php_pqconn_event_connreset(e
);
1693 case PGEVT_RESULTCREATE
:
1694 php_pqconn_event_resultcreate(e
);
1703 static php_pqconn_event_data_t
*php_pqconn_event_data_init(php_pqconn_object_t
*obj TSRMLS_DC
)
1705 php_pqconn_event_data_t
*data
= emalloc(sizeof(*data
));
1713 static void php_pqconn_notice_recv(void *p
, const PGresult
*res
)
1715 php_pqconn_event_data_t
*data
= p
;
1721 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("notice"), (void *) &evhs
)) {
1722 zval
*args
, *connection
= NULL
;
1724 MAKE_STD_ZVAL(args
);
1726 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1727 add_next_index_zval(args
, connection
);
1728 add_next_index_string(args
, PHP_PQresultErrorMessage(res
), 1);
1729 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1730 zval_ptr_dtor(&args
);
1735 typedef struct php_pqconn_resource_factory_data
{
1738 } php_pqconn_resource_factory_data_t
;
1740 static void *php_pqconn_resource_factory_ctor(void *data
, void *init_arg TSRMLS_DC
)
1742 php_pqconn_resource_factory_data_t
*o
= init_arg
;
1743 PGconn
*conn
= NULL
;;
1745 if (o
->flags
& PHP_PQCONN_ASYNC
) {
1746 conn
= PQconnectStart(o
->dsn
);
1748 conn
= PQconnectdb(o
->dsn
);
1752 PQregisterEventProc(conn
, php_pqconn_event
, "ext-pq", NULL
);
1758 static void php_pqconn_resource_factory_dtor(void *opaque
, void *handle TSRMLS_DC
)
1760 php_pqconn_event_data_t
*evdata
= PQinstanceData(handle
, php_pqconn_event
);
1762 /* we don't care for anthing, except free'ing evdata */
1764 PQsetInstanceData(handle
, php_pqconn_event
, NULL
);
1765 memset(evdata
, 0, sizeof(*evdata
));
1772 static php_resource_factory_ops_t php_pqconn_resource_factory_ops
= {
1773 php_pqconn_resource_factory_ctor
,
1775 php_pqconn_resource_factory_dtor
1778 static void php_pqconn_wakeup(php_persistent_handle_factory_t
*f
, void **handle TSRMLS_DC
)
1782 static int apply_unlisten(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
1784 php_pqconn_object_t
*obj
= va_arg(argv
, php_pqconn_object_t
*);
1785 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, key
->arKey
, key
->nKeyLength
- 1);
1787 if (quoted_channel
) {
1791 spprintf(&cmd
, 0, "UNLISTEN %s", quoted_channel
);
1792 if ((res
= PQexec(obj
->intern
->conn
, cmd
))) {
1797 PQfreemem(quoted_channel
);
1800 return ZEND_HASH_APPLY_REMOVE
;
1803 static void php_pqconn_notice_ignore(void *p
, const PGresult
*res
)
1807 static void php_pqconn_retire(php_persistent_handle_factory_t
*f
, void **handle TSRMLS_DC
)
1809 php_pqconn_event_data_t
*evdata
= PQinstanceData(*handle
, php_pqconn_event
);
1813 PQsetInstanceData(*handle
, php_pqconn_event
, NULL
);
1815 /* ignore notices */
1816 PQsetNoticeReceiver(*handle
, php_pqconn_notice_ignore
, NULL
);
1818 /* clean up async results */
1819 while ((res
= PQgetResult(*handle
))) {
1823 /* clean up transaction & session */
1824 switch (PQtransactionStatus(*handle
)) {
1826 res
= PQexec(*handle
, "RESET ALL");
1829 res
= PQexec(*handle
, "ROLLBACK; RESET ALL");
1838 /* clean up notify listeners */
1839 zend_hash_apply_with_arguments(&evdata
->obj
->intern
->listeners TSRMLS_CC
, apply_unlisten
, 1, evdata
->obj
);
1841 /* release instance data */
1842 memset(evdata
, 0, sizeof(*evdata
));
1847 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
1848 ZEND_ARG_INFO(0, dsn
)
1849 ZEND_ARG_INFO(0, async
)
1850 ZEND_END_ARG_INFO();
1851 static PHP_METHOD(pqconn
, __construct
) {
1852 zend_error_handling zeh
;
1857 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1858 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|sl", &dsn_str
, &dsn_len
, &flags
)) {
1859 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1860 php_pqconn_event_data_t
*evdata
= php_pqconn_event_data_init(obj TSRMLS_CC
);
1861 php_pqconn_resource_factory_data_t rfdata
= {dsn_str
, flags
};
1863 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
1865 zend_hash_init(&obj
->intern
->listeners
, 0, NULL
, (dtor_func_t
) zend_hash_destroy
, 0);
1866 zend_hash_init(&obj
->intern
->eventhandlers
, 0, NULL
, ZVAL_PTR_DTOR
, 0);
1868 if (flags
& PHP_PQCONN_PERSISTENT
) {
1869 php_persistent_handle_factory_t
*phf
= php_persistent_handle_concede(NULL
, ZEND_STRL("pq\\Connection"), dsn_str
, dsn_len
, php_pqconn_wakeup
, php_pqconn_retire TSRMLS_CC
);
1870 php_resource_factory_init(&obj
->intern
->factory
, php_persistent_handle_get_resource_factory_ops(), phf
, (void (*)(void*)) php_persistent_handle_abandon
);
1872 php_resource_factory_init(&obj
->intern
->factory
, &php_pqconn_resource_factory_ops
, NULL
, NULL
);
1875 if (flags
& PHP_PQCONN_ASYNC
) {
1876 obj
->intern
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
1879 obj
->intern
->conn
= php_resource_factory_handle_ctor(&obj
->intern
->factory
, &rfdata TSRMLS_CC
);
1881 PQsetInstanceData(obj
->intern
->conn
, php_pqconn_event
, evdata
);
1882 PQsetNoticeReceiver(obj
->intern
->conn
, php_pqconn_notice_recv
, evdata
);
1884 if (SUCCESS
!= php_pqconn_update_socket(getThis(), obj TSRMLS_CC
)) {
1885 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1888 zend_restore_error_handling(&zeh TSRMLS_CC
);
1891 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
1892 ZEND_END_ARG_INFO();
1893 static PHP_METHOD(pqconn
, reset
) {
1894 if (SUCCESS
== zend_parse_parameters_none()) {
1895 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1898 PQreset(obj
->intern
->conn
);
1900 if (CONNECTION_OK
== PQstatus(obj
->intern
->conn
)) {
1903 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection reset failed: (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1906 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1912 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset_async
, 0, 0, 0)
1913 ZEND_END_ARG_INFO();
1914 static PHP_METHOD(pqconn
, resetAsync
) {
1915 if (SUCCESS
== zend_parse_parameters_none()) {
1916 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1919 if (PQresetStart(obj
->intern
->conn
)) {
1920 obj
->intern
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
1924 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1930 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
)
1932 HashTable ht
, *existing_listeners
;
1934 php_pq_callback_addref(listener
);
1936 if (SUCCESS
== zend_hash_find(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &existing_listeners
)) {
1937 zend_hash_next_index_insert(existing_listeners
, (void *) listener
, sizeof(*listener
), NULL
);
1939 zend_hash_init(&ht
, 1, NULL
, (dtor_func_t
) php_pq_callback_dtor
, 0);
1940 zend_hash_next_index_insert(&ht
, (void *) listener
, sizeof(*listener
), NULL
);
1941 zend_hash_add(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &ht
, sizeof(HashTable
), NULL
);
1945 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_listen
, 0, 0, 0)
1946 ZEND_ARG_INFO(0, channel
)
1947 ZEND_ARG_INFO(0, callable
)
1948 ZEND_END_ARG_INFO();
1949 static PHP_METHOD(pqconn
, listen
) {
1950 char *channel_str
= NULL
;
1951 int channel_len
= 0;
1952 php_pq_callback_t listener
;
1954 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sf", &channel_str
, &channel_len
, &listener
.fci
, &listener
.fcc
)) {
1955 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1957 obj
->intern
->poller
= PQconsumeInput
;
1960 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, channel_str
, channel_len
);
1962 if (quoted_channel
) {
1966 spprintf(&cmd
, 0, "LISTEN %s", quoted_channel
);
1967 res
= PQexec(obj
->intern
->conn
, cmd
);
1970 PQfreemem(quoted_channel
);
1973 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1974 php_pqconn_add_listener(obj
, channel_str
, channel_len
, &listener TSRMLS_CC
);
1981 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not install listener (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1985 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1987 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape channel identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1990 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1996 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_listen_async
, 0, 0, 0)
1997 ZEND_ARG_INFO(0, channel
)
1998 ZEND_ARG_INFO(0, callable
)
1999 ZEND_END_ARG_INFO();
2000 static PHP_METHOD(pqconn
, listenAsync
) {
2001 char *channel_str
= NULL
;
2002 int channel_len
= 0;
2003 php_pq_callback_t listener
;
2005 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sf", &channel_str
, &channel_len
, &listener
.fci
, &listener
.fcc
)) {
2006 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2008 obj
->intern
->poller
= PQconsumeInput
;
2011 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, channel_str
, channel_len
);
2013 if (quoted_channel
) {
2016 obj
->intern
->poller
= PQconsumeInput
;
2018 spprintf(&cmd
, 0, "LISTEN %s", channel_str
);
2019 if (PQsendQuery(obj
->intern
->conn
, cmd
)) {
2020 php_pqconn_add_listener(obj
, channel_str
, channel_len
, &listener TSRMLS_CC
);
2023 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not install listener (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2028 PQfreemem(quoted_channel
);
2030 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2032 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape channel identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2035 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2041 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_notify
, 0, 0, 2)
2042 ZEND_ARG_INFO(0, channel
)
2043 ZEND_ARG_INFO(0, message
)
2044 ZEND_END_ARG_INFO();
2045 static PHP_METHOD(pqconn
, notify
) {
2046 char *channel_str
, *message_str
;
2047 int channel_len
, message_len
;
2049 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &channel_str
, &channel_len
, &message_str
, &message_len
)) {
2050 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2054 char *params
[2] = {channel_str
, message_str
};
2056 res
= PQexecParams(obj
->intern
->conn
, "select pg_notify($1, $2)", 2, NULL
, (const char *const*) params
, NULL
, NULL
, 0);
2059 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2066 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not notify listeners (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2070 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2073 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2079 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_notify_async
, 0, 0, 2)
2080 ZEND_ARG_INFO(0, channel
)
2081 ZEND_ARG_INFO(0, message
)
2082 ZEND_END_ARG_INFO();
2083 static PHP_METHOD(pqconn
, notifyAsync
) {
2084 char *channel_str
, *message_str
;
2085 int channel_len
, message_len
;
2087 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &channel_str
, &channel_len
, &message_str
, &message_len
)) {
2088 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2091 char *params
[2] = {channel_str
, message_str
};
2093 obj
->intern
->poller
= PQconsumeInput
;
2095 if (PQsendQueryParams(obj
->intern
->conn
, "select pg_notify($1, $2)", 2, NULL
, (const char *const*) params
, NULL
, NULL
, 0)) {
2098 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not notify listeners (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2102 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2105 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2111 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
2112 ZEND_END_ARG_INFO();
2113 static PHP_METHOD(pqconn
, poll
) {
2114 if (SUCCESS
== zend_parse_parameters_none()) {
2115 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2118 if (obj
->intern
->poller
) {
2119 if (obj
->intern
->poller
== PQconsumeInput
) {
2120 RETVAL_LONG(obj
->intern
->poller(obj
->intern
->conn
) * PGRES_POLLING_OK
);
2121 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2124 RETURN_LONG(obj
->intern
->poller(obj
->intern
->conn
));
2127 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
2130 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2136 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
2137 ZEND_ARG_INFO(0, query
)
2138 ZEND_END_ARG_INFO();
2139 static PHP_METHOD(pqconn
, exec
) {
2140 zend_error_handling zeh
;
2144 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2145 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
2146 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2149 PGresult
*res
= PQexec(obj
->intern
->conn
, query_str
);
2151 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2154 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2155 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2158 ZEND_INIT_SYMTABLE(&r
->bound
);
2159 return_value
->type
= IS_OBJECT
;
2160 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2163 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2166 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2169 zend_restore_error_handling(&zeh TSRMLS_CC
);
2172 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_get_result
, 0, 0, 0)
2173 ZEND_END_ARG_INFO();
2174 static PHP_METHOD(pqconn
, getResult
) {
2175 if (SUCCESS
== zend_parse_parameters_none()) {
2176 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2179 PGresult
*res
= PQgetResult(obj
->intern
->conn
);
2182 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2185 ZEND_INIT_SYMTABLE(&r
->bound
);
2186 return_value
->type
= IS_OBJECT
;
2187 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2192 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2198 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_async
, 0, 0, 1)
2199 ZEND_ARG_INFO(0, query
)
2200 ZEND_ARG_INFO(0, callable
)
2201 ZEND_END_ARG_INFO();
2202 static PHP_METHOD(pqconn
, execAsync
) {
2203 zend_error_handling zeh
;
2204 php_pq_callback_t resolver
= {{0}};
2208 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2209 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|f", &query_str
, &query_len
, &resolver
.fci
, &resolver
.fcc
)) {
2210 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2213 php_pq_callback_dtor(&obj
->intern
->onevent
);
2214 if (resolver
.fci
.size
> 0) {
2215 obj
->intern
->onevent
= resolver
;
2216 php_pq_callback_addref(&obj
->intern
->onevent
);
2219 obj
->intern
->poller
= PQconsumeInput
;
2221 if (PQsendQuery(obj
->intern
->conn
, query_str
)) {
2222 if (obj
->intern
->unbuffered
) {
2223 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2224 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2229 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2233 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2237 zend_restore_error_handling(&zeh TSRMLS_CC
);
2240 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
2245 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
2246 convert_to_long_ex(ztype
);
2249 **types
= Z_LVAL_PP(ztype
);
2252 if (*ztype
!= *(zval
**)p
) {
2253 zval_ptr_dtor(ztype
);
2255 return ZEND_HASH_APPLY_KEEP
;
2258 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
2264 params
= (char ***) va_arg(argv
, char ***);
2265 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
2267 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
2271 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
2272 convert_to_string_ex(zparam
);
2275 **params
= Z_STRVAL_PP(zparam
);
2278 if (*zparam
!= *(zval
**)p
) {
2279 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
2282 return ZEND_HASH_APPLY_KEEP
;
2285 static int php_pq_types_to_array(HashTable
*ht
, Oid
**types TSRMLS_DC
)
2287 int count
= zend_hash_num_elements(ht
);
2294 /* +1 for when less types than params are specified */
2295 *types
= tmp
= ecalloc(count
+ 1, sizeof(Oid
));
2296 zend_hash_apply_with_argument(ht
, apply_to_oid
, &tmp TSRMLS_CC
);
2302 static int php_pq_params_to_array(HashTable
*ht
, char ***params
, HashTable
*zdtor TSRMLS_DC
)
2304 int count
= zend_hash_num_elements(ht
);
2311 *params
= tmp
= ecalloc(count
, sizeof(char *));
2312 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_param
, 2, &tmp
, zdtor
);
2318 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
2319 ZEND_ARG_INFO(0, query
)
2320 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2321 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2322 ZEND_END_ARG_INFO();
2323 static PHP_METHOD(pqconn
, execParams
) {
2324 zend_error_handling zeh
;
2328 zval
*ztypes
= NULL
;
2330 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2331 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
2332 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2338 char **params
= NULL
;
2341 ZEND_INIT_SYMTABLE(&zdtor
);
2342 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2345 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2348 res
= PQexecParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0);
2350 zend_hash_destroy(&zdtor
);
2358 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2361 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2362 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2365 ZEND_INIT_SYMTABLE(&r
->bound
);
2366 return_value
->type
= IS_OBJECT
;
2367 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2370 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2374 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2378 zend_restore_error_handling(&zeh TSRMLS_CC
);
2381 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params_async
, 0, 0, 2)
2382 ZEND_ARG_INFO(0, query
)
2383 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2384 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2385 ZEND_ARG_INFO(0, callable
)
2386 ZEND_END_ARG_INFO();
2387 static PHP_METHOD(pqconn
, execParamsAsync
) {
2388 zend_error_handling zeh
;
2389 php_pq_callback_t resolver
= {{0}};
2393 zval
*ztypes
= NULL
;
2395 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2396 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!f", &query_str
, &query_len
, &zparams
, &ztypes
, &resolver
.fci
, &resolver
.fcc
)) {
2397 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2402 char **params
= NULL
;
2405 ZEND_INIT_SYMTABLE(&zdtor
);
2406 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2409 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2412 php_pq_callback_dtor(&obj
->intern
->onevent
);
2413 if (resolver
.fci
.size
> 0) {
2414 obj
->intern
->onevent
= resolver
;
2415 php_pq_callback_addref(&obj
->intern
->onevent
);
2418 obj
->intern
->poller
= PQconsumeInput
;
2420 if (PQsendQueryParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0)) {
2421 if (obj
->intern
->unbuffered
) {
2422 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2423 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2428 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2432 zend_hash_destroy(&zdtor
);
2440 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2443 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2447 zend_restore_error_handling(&zeh TSRMLS_CC
);
2450 static STATUS
php_pqconn_prepare(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2458 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2462 count
= zend_hash_num_elements(typest
);
2463 php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2466 res
= PQprepare(obj
->intern
->conn
, name
, query
, count
, types
);
2473 rv
= php_pqres_success(res TSRMLS_CC
);
2477 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2483 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
2484 ZEND_ARG_INFO(0, type
)
2485 ZEND_ARG_INFO(0, query
)
2486 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2487 ZEND_END_ARG_INFO();
2488 static PHP_METHOD(pqconn
, prepare
) {
2489 zend_error_handling zeh
;
2490 zval
*ztypes
= NULL
;
2491 char *name_str
, *query_str
;
2492 int name_len
, *query_len
;
2494 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2495 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2496 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2499 if (SUCCESS
== php_pqconn_prepare(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2500 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2502 php_pq_object_addref(obj TSRMLS_CC
);
2504 stm
->name
= estrdup(name_str
);
2505 ZEND_INIT_SYMTABLE(&stm
->bound
);
2507 return_value
->type
= IS_OBJECT
;
2508 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2510 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2512 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2515 zend_restore_error_handling(&zeh TSRMLS_CC
);
2518 static STATUS
php_pqconn_prepare_async(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2525 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2529 count
= php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2532 if (PQsendPrepare(obj
->intern
->conn
, name
, query
, count
, types
)) {
2533 if (obj
->intern
->unbuffered
) {
2534 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2535 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2540 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2551 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare_async
, 0, 0, 2)
2552 ZEND_ARG_INFO(0, type
)
2553 ZEND_ARG_INFO(0, query
)
2554 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2555 ZEND_END_ARG_INFO();
2556 static PHP_METHOD(pqconn
, prepareAsync
) {
2557 zend_error_handling zeh
;
2558 zval
*ztypes
= NULL
;
2559 char *name_str
, *query_str
;
2560 int name_len
, *query_len
;
2562 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2563 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2564 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2567 obj
->intern
->poller
= PQconsumeInput
;
2568 if (SUCCESS
== php_pqconn_prepare_async(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2569 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2571 php_pq_object_addref(obj TSRMLS_CC
);
2573 stm
->name
= estrdup(name_str
);
2574 ZEND_INIT_SYMTABLE(&stm
->bound
);
2576 return_value
->type
= IS_OBJECT
;
2577 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2579 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2581 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2584 zend_restore_error_handling(&zeh TSRMLS_CC
);
2587 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote
, 0, 0, 1)
2588 ZEND_ARG_INFO(0, string
)
2589 ZEND_END_ARG_INFO();
2590 static PHP_METHOD(pqconn
, quote
) {
2594 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2595 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2598 char *quoted
= PQescapeLiteral(obj
->intern
->conn
, str
, len
);
2601 RETVAL_STRING(quoted
, 1);
2604 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote string (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2608 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2614 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote_name
, 0, 0, 1)
2615 ZEND_ARG_INFO(0, type
)
2616 ZEND_END_ARG_INFO();
2617 static PHP_METHOD(pqconn
, quoteName
) {
2621 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2622 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2625 char *quoted
= PQescapeIdentifier(obj
->intern
->conn
, str
, len
);
2628 RETVAL_STRING(quoted
, 1);
2631 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote name (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2635 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2641 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_escape_bytea
, 0, 0, 1)
2642 ZEND_ARG_INFO(0, bytea
)
2643 ZEND_END_ARG_INFO();
2644 static PHP_METHOD(pqconn
, escapeBytea
) {
2648 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2649 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2653 char *escaped_str
= (char *) PQescapeByteaConn(obj
->intern
->conn
, (unsigned char *) str
, len
, &escaped_len
);
2656 RETVAL_STRINGL(escaped_str
, escaped_len
- 1, 1);
2657 PQfreemem(escaped_str
);
2659 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2663 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2669 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_unescape_bytea
, 0, 0, 1)
2670 ZEND_ARG_INFO(0, bytea
)
2671 ZEND_END_ARG_INFO();
2672 static PHP_METHOD(pqconn
, unescapeBytea
) {
2676 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2677 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2680 size_t unescaped_len
;
2681 char *unescaped_str
= (char *) PQunescapeBytea((unsigned char *)str
, &unescaped_len
);
2683 if (unescaped_str
) {
2684 RETVAL_STRINGL(unescaped_str
, unescaped_len
, 1);
2685 PQfreemem(unescaped_str
);
2687 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not unescape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2691 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2697 static const char *isolation_level(long *isolation
) {
2698 switch (*isolation
) {
2699 case PHP_PQTXN_SERIALIZABLE
:
2700 return "SERIALIZABLE";
2701 case PHP_PQTXN_REPEATABLE_READ
:
2702 return "REPEATABLE READ";
2704 *isolation
= PHP_PQTXN_READ_COMMITTED
;
2706 case PHP_PQTXN_READ_COMMITTED
:
2707 return "READ COMMITTED";
2711 static STATUS
php_pqconn_start_transaction(zval
*zconn
, php_pqconn_object_t
*conn_obj
, long isolation
, zend_bool readonly
, zend_bool deferrable TSRMLS_DC
)
2714 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2717 if (conn_obj
->intern
) {
2721 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2722 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2724 res
= PQexec(conn_obj
->intern
->conn
, cmd
);
2729 STATUS rv
= php_pqres_success(res TSRMLS_CC
);
2734 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2738 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2743 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
)
2746 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2749 if (conn_obj
->intern
->conn
) {
2752 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2753 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2755 if (PQsendQuery(conn_obj
->intern
->conn
, cmd
)) {
2756 conn_obj
->intern
->poller
= PQconsumeInput
;
2761 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2765 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2770 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction
, 0, 0, 0)
2771 ZEND_ARG_INFO(0, isolation
)
2772 ZEND_ARG_INFO(0, readonly
)
2773 ZEND_ARG_INFO(0, deferrable
)
2774 ZEND_END_ARG_INFO();
2775 static PHP_METHOD(pqconn
, startTransaction
) {
2776 zend_error_handling zeh
;
2777 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2778 zend_bool readonly
= 0, deferrable
= 0;
2780 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2781 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2783 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2785 rv
= php_pqconn_start_transaction(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2787 if (SUCCESS
== rv
) {
2788 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2790 php_pq_object_addref(obj TSRMLS_CC
);
2792 txn
->isolation
= isolation
;
2793 txn
->readonly
= readonly
;
2794 txn
->deferrable
= deferrable
;
2796 return_value
->type
= IS_OBJECT
;
2797 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2800 zend_restore_error_handling(&zeh TSRMLS_CC
);
2804 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction_async
, 0, 0, 0)
2805 ZEND_ARG_INFO(0, isolation
)
2806 ZEND_ARG_INFO(0, readonly
)
2807 ZEND_ARG_INFO(0, deferrable
)
2808 ZEND_END_ARG_INFO();
2809 static PHP_METHOD(pqconn
, startTransactionAsync
) {
2810 zend_error_handling zeh
;
2811 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2812 zend_bool readonly
= 0, deferrable
= 0;
2814 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2815 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2817 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2819 rv
= php_pqconn_start_transaction_async(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2821 if (SUCCESS
== rv
) {
2822 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2824 php_pq_object_addref(obj TSRMLS_CC
);
2826 txn
->isolation
= isolation
;
2827 txn
->readonly
= readonly
;
2828 txn
->deferrable
= deferrable
;
2830 return_value
->type
= IS_OBJECT
;
2831 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2834 zend_restore_error_handling(&zeh TSRMLS_CC
);
2837 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_trace
, 0, 0, 0)
2838 ZEND_ARG_INFO(0, stdio_stream
)
2839 ZEND_END_ARG_INFO();
2840 static PHP_METHOD(pqconn
, trace
) {
2841 zval
*zstream
= NULL
;
2843 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|r!", &zstream
)) {
2844 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2848 php_stream
*stream
= NULL
;
2850 php_stream_from_zval(stream
, &zstream
);
2852 if (SUCCESS
== php_stream_cast(stream
, PHP_STREAM_AS_STDIO
, (void *) &fp
, REPORT_ERRORS
)) {
2853 stream
->flags
|= PHP_STREAM_FLAG_NO_CLOSE
;
2854 PQtrace(obj
->intern
->conn
, fp
);
2860 PQuntrace(obj
->intern
->conn
);
2864 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2870 static zend_function_entry php_pqconn_methods
[] = {
2871 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2872 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
2873 PHP_ME(pqconn
, resetAsync
, ai_pqconn_reset_async
, ZEND_ACC_PUBLIC
)
2874 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
2875 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
2876 PHP_ME(pqconn
, execAsync
, ai_pqconn_exec_async
, ZEND_ACC_PUBLIC
)
2877 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
2878 PHP_ME(pqconn
, execParamsAsync
, ai_pqconn_exec_params_async
, ZEND_ACC_PUBLIC
)
2879 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
2880 PHP_ME(pqconn
, prepareAsync
, ai_pqconn_prepare_async
, ZEND_ACC_PUBLIC
)
2881 PHP_ME(pqconn
, listen
, ai_pqconn_listen
, ZEND_ACC_PUBLIC
)
2882 PHP_ME(pqconn
, listenAsync
, ai_pqconn_listen_async
, ZEND_ACC_PUBLIC
)
2883 PHP_ME(pqconn
, notify
, ai_pqconn_notify
, ZEND_ACC_PUBLIC
)
2884 PHP_ME(pqconn
, notifyAsync
, ai_pqconn_notify_async
, ZEND_ACC_PUBLIC
)
2885 PHP_ME(pqconn
, getResult
, ai_pqconn_get_result
, ZEND_ACC_PUBLIC
)
2886 PHP_ME(pqconn
, quote
, ai_pqconn_quote
, ZEND_ACC_PUBLIC
)
2887 PHP_ME(pqconn
, quoteName
, ai_pqconn_quote_name
, ZEND_ACC_PUBLIC
)
2888 PHP_ME(pqconn
, escapeBytea
, ai_pqconn_escape_bytea
, ZEND_ACC_PUBLIC
)
2889 PHP_ME(pqconn
, unescapeBytea
, ai_pqconn_unescape_bytea
, ZEND_ACC_PUBLIC
)
2890 PHP_ME(pqconn
, startTransaction
, ai_pqconn_start_transaction
, ZEND_ACC_PUBLIC
)
2891 PHP_ME(pqconn
, startTransactionAsync
, ai_pqconn_start_transaction_async
, ZEND_ACC_PUBLIC
)
2892 PHP_ME(pqconn
, trace
, ai_pqconn_trace
, ZEND_ACC_PUBLIC
)
2896 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_construct
, 0, 0, 1)
2897 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
2898 ZEND_END_ARG_INFO();
2899 static PHP_METHOD(pqtypes
, __construct
) {
2900 zend_error_handling zeh
;
2903 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2904 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
2905 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2907 if (conn_obj
->intern
) {
2908 zval
*retval
= NULL
;
2909 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2911 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
2912 obj
->intern
->conn
= conn_obj
;
2913 php_pq_object_addref(conn_obj TSRMLS_CC
);
2914 zend_hash_init(&obj
->intern
->types
, 300, NULL
, ZVAL_PTR_DTOR
, 0);
2916 zend_call_method_with_0_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "refresh", &retval
);
2918 zval_ptr_dtor(&retval
);
2921 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2924 zend_restore_error_handling(&zeh TSRMLS_CC
);
2927 #define PHP_PQ_TYPES_QUERY \
2928 "select t.oid, t.* " \
2929 "from pg_type t join pg_namespace n on t.typnamespace=n.oid " \
2930 "where typisdefined " \
2932 "and nspname in ('public', 'pg_catalog')"
2934 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_refresh
, 0, 0, 0)
2935 ZEND_END_ARG_INFO();
2936 static PHP_METHOD(pqtypes
, refresh
) {
2937 if (SUCCESS
== zend_parse_parameters_none()) {
2938 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2941 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, PHP_PQ_TYPES_QUERY
);
2943 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2946 if (PGRES_TUPLES_OK
== PQresultStatus(res
)) {
2949 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
2950 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT
, NULL TSRMLS_CC
);
2951 long oid
= atol(PQgetvalue(res
, r
, 0 ));
2952 char *name
= PQgetvalue(res
, r
, 1);
2956 zend_hash_index_update(&obj
->intern
->types
, oid
, (void *) &row
, sizeof(zval
*), NULL
);
2957 zend_hash_add(&obj
->intern
->types
, name
, strlen(name
) + 1, (void *) &row
, sizeof(zval
*), NULL
);
2960 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQresultErrorMessage(res
));
2964 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2968 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Types not initialized");
2973 static zend_function_entry php_pqtypes_methods
[] = {
2974 PHP_ME(pqtypes
, __construct
, ai_pqtypes_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2975 PHP_ME(pqtypes
, refresh
, ai_pqtypes_refresh
, ZEND_ACC_PUBLIC
)
2979 static STATUS
php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type
, zval
***row TSRMLS_DC
)
2982 php_pqres_fetch_t orig_fetch
;
2985 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2988 if (!obj
->intern
->iter
) {
2989 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
2990 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2992 orig_fetch
= obj
->intern
->iter
->fetch_type
;
2993 obj
->intern
->iter
->fetch_type
= fetch_type
;
2994 if (SUCCESS
== (rv
= obj
->intern
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
))) {
2995 obj
->intern
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->intern
->iter
, row TSRMLS_CC
);
2996 obj
->intern
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2998 obj
->intern
->iter
->fetch_type
= orig_fetch
;
3003 typedef struct php_pqres_col
{
3008 static STATUS
column_nn(php_pqres_object_t
*obj
, zval
*zcol
, php_pqres_col_t
*col TSRMLS_DC
)
3013 switch (Z_TYPE_P(zcol
)) {
3015 convert_to_string(zcol
);
3019 if (!is_numeric_string(Z_STRVAL_P(zcol
), Z_STRLEN_P(zcol
), &index
, NULL
, 0)) {
3020 name
= Z_STRVAL_P(zcol
);
3025 index
= Z_LVAL_P(zcol
);
3031 col
->num
= PQfnumber(obj
->intern
->res
, name
);
3033 col
->name
= PQfname(obj
->intern
->res
, index
);
3038 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column at index %ld", index
);
3041 if (col
->num
== -1) {
3042 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column with name '%s'", name
);
3048 static int compare_index(const void *lptr
, const void *rptr TSRMLS_DC
)
3050 const Bucket
*l
= *(const Bucket
**) lptr
;
3051 const Bucket
*r
= *(const Bucket
**) rptr
;
3062 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_bind
, 0, 0, 2)
3063 ZEND_ARG_INFO(0, col
)
3064 ZEND_ARG_INFO(1, ref
)
3065 ZEND_END_ARG_INFO();
3066 static PHP_METHOD(pqres
, bind
) {
3069 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z/z", &zcol
, &zref
)) {
3070 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3073 php_pqres_col_t col
;
3075 if (SUCCESS
== column_nn(obj
, zcol
, &col TSRMLS_CC
)) {
3077 if (SUCCESS
== zend_hash_index_update(&obj
->intern
->bound
, col
.num
, (void *) &zref
, sizeof(zval
*), NULL
)) {
3078 zend_hash_sort(&obj
->intern
->bound
, zend_qsort
, compare_index
, 0 TSRMLS_CC
);
3081 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to bind column %s@%d", col
.name
, col
.num
);
3088 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3094 static int apply_bound(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
3096 zval
**zvalue
, **zbound
= p
;
3097 zval
**zrow
= va_arg(argv
, zval
**);
3099 if (SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(zrow
), key
->h
, (void *) &zvalue
)) {
3101 ZVAL_COPY_VALUE(*zbound
, *zvalue
);
3103 zval_ptr_dtor(zvalue
);
3104 Z_ADDREF_P(*zbound
);
3106 return ZEND_HASH_APPLY_KEEP
;
3108 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column ad index %lu", key
->h
);
3109 return ZEND_HASH_APPLY_STOP
;
3113 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_bound
, 0, 0, 0)
3114 ZEND_END_ARG_INFO();
3115 static PHP_METHOD(pqres
, fetchBound
) {
3116 zend_error_handling zeh
;
3118 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3119 if (SUCCESS
== zend_parse_parameters_none()) {
3120 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3125 if (SUCCESS
== php_pqres_iteration(getThis(), obj
, PHP_PQRES_FETCH_ARRAY
, &row TSRMLS_CC
)) {
3127 zend_hash_apply_with_arguments(&obj
->intern
->bound TSRMLS_CC
, apply_bound
, 1, row
);
3128 RETVAL_ZVAL(*row
, 1, 0);
3133 zend_restore_error_handling(&zeh TSRMLS_CC
);
3136 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
3137 ZEND_ARG_INFO(0, fetch_type
)
3138 ZEND_END_ARG_INFO();
3139 static PHP_METHOD(pqres
, fetchRow
) {
3140 zend_error_handling zeh
;
3141 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3142 long fetch_type
= -1;
3144 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3145 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
3149 if (fetch_type
== -1) {
3150 fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
3152 php_pqres_iteration(getThis(), obj
, fetch_type
, &row TSRMLS_CC
);
3155 RETVAL_ZVAL(*row
, 1, 0);
3158 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3161 zend_restore_error_handling(&zeh TSRMLS_CC
);
3164 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
3167 HashTable
*ht
= HASH_OF(row
);
3168 int count
= zend_hash_num_elements(ht
);
3171 zend_hash_internal_pointer_reset(ht
);
3173 zend_hash_move_forward(ht
);
3175 zend_hash_get_current_data(ht
, (void *) &data
);
3177 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d exceeds column count %d", col
, count
);
3182 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 0)
3183 ZEND_ARG_INFO(0, col_num
)
3184 ZEND_END_ARG_INFO();
3185 static PHP_METHOD(pqres
, fetchCol
) {
3186 zend_error_handling zeh
;
3189 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3190 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_col
)) {
3191 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3196 php_pqres_iteration(getThis(), obj
, obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: 0, &row TSRMLS_CC
);
3199 zval
**col
= column_at(*row
, fetch_col TSRMLS_CC
);
3202 RETVAL_ZVAL(*col
, 1, 0);
3206 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3209 zend_restore_error_handling(&zeh TSRMLS_CC
);
3212 static int apply_to_col(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
3215 php_pqres_object_t
*obj
= va_arg(argv
, php_pqres_object_t
*);
3216 php_pqres_col_t
*col
, **cols
= va_arg(argv
, php_pqres_col_t
**);
3217 STATUS
*rv
= va_arg(argv
, STATUS
*);
3220 if (SUCCESS
== column_nn(obj
, *c
, col TSRMLS_CC
)) {
3224 return ZEND_HASH_APPLY_STOP
;
3228 return ZEND_HASH_APPLY_KEEP
;
3231 static php_pqres_col_t
*php_pqres_convert_to_cols(php_pqres_object_t
*obj
, HashTable
*ht TSRMLS_DC
)
3233 php_pqres_col_t
*tmp
, *cols
= ecalloc(zend_hash_num_elements(ht
), sizeof(*cols
));
3234 STATUS rv
= SUCCESS
;
3237 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_col
, 2, obj
, &tmp
, &rv
);
3239 if (SUCCESS
== rv
) {
3247 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_map
, 0, 0, 0)
3248 ZEND_ARG_INFO(0, keys
)
3249 ZEND_ARG_INFO(0, vals
)
3250 ZEND_ARG_INFO(0, fetch_type
)
3251 ZEND_END_ARG_INFO();
3252 static PHP_METHOD(pqres
, map
) {
3253 zend_error_handling zeh
;
3254 zval
*zkeys
= 0, *zvals
= 0;
3255 long fetch_type
= -1;
3258 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3259 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z/!z/!l", &zkeys
, &zvals
, &fetch_type
)) {
3260 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3264 php_pqres_col_t def
= {PQfname(obj
->intern
->res
, 0), 0}, *keys
= NULL
, *vals
= NULL
;
3267 convert_to_array(zkeys
);
3269 if ((ks
= zend_hash_num_elements(Z_ARRVAL_P(zkeys
)))) {
3270 keys
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zkeys
) TSRMLS_CC
);
3280 convert_to_array(zvals
);
3282 if ((vs
= zend_hash_num_elements(Z_ARRVAL_P(zvals
)))) {
3283 vals
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zvals
) TSRMLS_CC
);
3287 if (fetch_type
== -1) {
3288 fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
3295 switch (fetch_type
) {
3296 case PHP_PQRES_FETCH_ARRAY
:
3297 case PHP_PQRES_FETCH_ASSOC
:
3298 array_init(return_value
);
3300 case PHP_PQRES_FETCH_OBJECT
:
3301 object_init(return_value
);
3304 for (r
= 0, rows
= PQntuples(obj
->intern
->res
); r
< rows
; ++r
) {
3307 cur
= &return_value
;
3308 for (k
= 0; k
< ks
; ++k
) {
3309 char *key
= PQgetvalue(obj
->intern
->res
, r
, keys
[k
].num
);
3310 int len
= PQgetlength(obj
->intern
->res
, r
, keys
[k
].num
);
3312 if (SUCCESS
!= zend_symtable_find(HASH_OF(*cur
), key
, len
+ 1, (void *) &cur
)) {
3316 switch (fetch_type
) {
3317 case PHP_PQRES_FETCH_ARRAY
:
3318 case PHP_PQRES_FETCH_ASSOC
:
3321 case PHP_PQRES_FETCH_OBJECT
:
3325 if (SUCCESS
!= zend_symtable_update(HASH_OF(*cur
), key
, len
+ 1, (void *) &tmp
, sizeof(zval
*), (void *) &cur
)) {
3326 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create map");
3332 for (v
= 0; v
< vs
; ++v
) {
3333 char *val
= PQgetvalue(obj
->intern
->res
, r
, vals
[v
].num
);
3334 int len
= PQgetlength(obj
->intern
->res
, r
, vals
[v
].num
);
3336 switch (fetch_type
) {
3337 case PHP_PQRES_FETCH_ARRAY
:
3338 add_index_stringl(*cur
, vals
[v
].num
, val
, len
, 1);
3340 case PHP_PQRES_FETCH_ASSOC
:
3341 add_assoc_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
3343 case PHP_PQRES_FETCH_OBJECT
:
3344 add_property_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
3349 php_pqres_row_to_zval(obj
->intern
->res
, r
, fetch_type
, cur TSRMLS_CC
);
3355 if (keys
&& keys
!= &def
) {
3362 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3365 zend_restore_error_handling(&zeh TSRMLS_CC
);
3368 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_count
, 0, 0, 0)
3369 ZEND_END_ARG_INFO();
3370 static PHP_METHOD(pqres
, count
) {
3371 if (SUCCESS
== zend_parse_parameters_none()) {
3374 if (SUCCESS
== php_pqres_count_elements(getThis(), &count TSRMLS_CC
)) {
3377 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3382 static zend_function_entry php_pqres_methods
[] = {
3383 PHP_ME(pqres
, bind
, ai_pqres_bind
, ZEND_ACC_PUBLIC
)
3384 PHP_ME(pqres
, fetchBound
, ai_pqres_fetch_bound
, ZEND_ACC_PUBLIC
)
3385 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
3386 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
3387 PHP_ME(pqres
, count
, ai_pqres_count
, ZEND_ACC_PUBLIC
)
3388 PHP_ME(pqres
, map
, ai_pqres_map
, ZEND_ACC_PUBLIC
)
3392 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
3393 ZEND_ARG_OBJ_INFO(0, Connection
, pq
\\Connection
, 0)
3394 ZEND_ARG_INFO(0, type
)
3395 ZEND_ARG_INFO(0, query
)
3396 ZEND_ARG_ARRAY_INFO(0, types
, 1)
3397 ZEND_ARG_INFO(0, async
)
3398 ZEND_END_ARG_INFO();
3399 static PHP_METHOD(pqstm
, __construct
) {
3400 zend_error_handling zeh
;
3401 zval
*zconn
, *ztypes
= NULL
;
3402 char *name_str
, *query_str
;
3403 int name_len
, *query_len
;
3404 zend_bool async
= 0;
3406 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3407 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
)) {
3408 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3409 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3411 if (conn_obj
->intern
) {
3414 conn_obj
->intern
->poller
= PQconsumeInput
;
3415 rv
= php_pqconn_prepare_async(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
3417 rv
= php_pqconn_prepare(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
3418 php_pqconn_notify_listeners(conn_obj TSRMLS_CC
);
3421 if (SUCCESS
== rv
) {
3422 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
3424 php_pq_object_addref(conn_obj TSRMLS_CC
);
3425 stm
->conn
= conn_obj
;
3426 stm
->name
= estrdup(name_str
);
3427 ZEND_INIT_SYMTABLE(&stm
->bound
);
3431 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3434 zend_restore_error_handling(&zeh TSRMLS_CC
);
3436 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_bind
, 0, 0, 2)
3437 ZEND_ARG_INFO(0, param_no
)
3438 ZEND_ARG_INFO(1, param_ref
)
3439 ZEND_END_ARG_INFO();
3440 static PHP_METHOD(pqstm
, bind
) {
3444 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "lz", ¶m_no
, ¶m_ref
)) {
3445 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3448 Z_ADDREF_P(param_ref
);
3449 zend_hash_index_update(&obj
->intern
->bound
, param_no
, (void *) ¶m_ref
, sizeof(zval
*), NULL
);
3450 zend_hash_sort(&obj
->intern
->bound
, zend_qsort
, compare_index
, 0 TSRMLS_CC
);
3452 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3457 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
3458 ZEND_ARG_ARRAY_INFO(0, params
, 1)
3459 ZEND_END_ARG_INFO();
3460 static PHP_METHOD(pqstm
, exec
) {
3461 zend_error_handling zeh
;
3462 zval
*zparams
= NULL
;
3464 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3465 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
3466 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3469 if (obj
->intern
->conn
->intern
) {
3471 char **params
= NULL
;
3475 ZEND_INIT_SYMTABLE(&zdtor
);
3478 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
3480 count
= php_pq_params_to_array(&obj
->intern
->bound
, ¶ms
, &zdtor TSRMLS_CC
);
3483 res
= PQexecPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0);
3488 zend_hash_destroy(&zdtor
);
3490 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3493 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3494 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
3497 ZEND_INIT_SYMTABLE(&r
->bound
);
3498 return_value
->type
= IS_OBJECT
;
3499 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
3502 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3505 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3508 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3511 zend_restore_error_handling(&zeh TSRMLS_CC
);
3514 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec_async
, 0, 0, 0)
3515 ZEND_ARG_ARRAY_INFO(0, params
, 1)
3516 ZEND_ARG_INFO(0, callable
)
3517 ZEND_END_ARG_INFO();
3518 static PHP_METHOD(pqstm
, execAsync
) {
3519 zend_error_handling zeh
;
3520 zval
*zparams
= NULL
;
3521 php_pq_callback_t resolver
= {{0}};
3523 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3524 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!f", &zparams
, &resolver
.fci
, &resolver
.fcc
)) {
3525 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3528 if (obj
->intern
->conn
->intern
) {
3530 char **params
= NULL
;
3534 ZEND_INIT_SYMTABLE(&zdtor
);
3535 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
3538 php_pq_callback_dtor(&obj
->intern
->conn
->intern
->onevent
);
3539 if (resolver
.fci
.size
> 0) {
3540 obj
->intern
->conn
->intern
->onevent
= resolver
;
3541 php_pq_callback_addref(&obj
->intern
->conn
->intern
->onevent
);
3544 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3546 if (PQsendQueryPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0)) {
3547 if (obj
->intern
->conn
->intern
->unbuffered
) {
3548 if (!PQsetSingleRowMode(obj
->intern
->conn
->intern
->conn
)) {
3549 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3554 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3562 zend_hash_destroy(&zdtor
);
3565 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3568 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3572 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3576 zend_restore_error_handling(&zeh TSRMLS_CC
);
3579 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc
, 0, 0, 0)
3580 ZEND_END_ARG_INFO();
3581 static PHP_METHOD(pqstm
, desc
) {
3582 zend_error_handling zeh
;
3584 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3585 if (SUCCESS
== zend_parse_parameters_none()) {
3586 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3589 if (obj
->intern
->conn
->intern
) {
3590 PGresult
*res
= PQdescribePrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
);
3592 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3595 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3598 array_init(return_value
);
3599 for (p
= 0, params
= PQnparams(res
); p
< params
; ++p
) {
3600 add_next_index_long(return_value
, PQparamtype(res
, p
));
3604 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3607 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3610 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3613 zend_restore_error_handling(&zeh TSRMLS_CC
);
3616 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc_async
, 0, 0, 0)
3617 ZEND_END_ARG_INFO();
3618 static PHP_METHOD(pqstm
, descAsync
) {
3619 zend_error_handling zeh
;
3621 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3622 if (SUCCESS
== zend_parse_parameters_none()) {
3623 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3627 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3629 if (PQsendDescribePrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
)) {
3632 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement: %s", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3636 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3639 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Statement not initialized");
3643 zend_restore_error_handling(&zeh TSRMLS_CC
);
3647 static zend_function_entry php_pqstm_methods
[] = {
3648 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3649 PHP_ME(pqstm
, bind
, ai_pqstm_bind
, ZEND_ACC_PUBLIC
)
3650 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
3651 PHP_ME(pqstm
, desc
, ai_pqstm_desc
, ZEND_ACC_PUBLIC
)
3652 PHP_ME(pqstm
, execAsync
, ai_pqstm_exec_async
, ZEND_ACC_PUBLIC
)
3653 PHP_ME(pqstm
, descAsync
, ai_pqstm_desc_async
, ZEND_ACC_PUBLIC
)
3657 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_construct
, 0, 0, 1)
3658 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3659 ZEND_ARG_INFO(0, async
)
3660 ZEND_ARG_INFO(0, isolation
)
3661 ZEND_ARG_INFO(0, readonly
)
3662 ZEND_ARG_INFO(0, deferrable
)
3663 ZEND_END_ARG_INFO();
3664 static PHP_METHOD(pqtxn
, __construct
) {
3665 zend_error_handling zeh
;
3667 long isolation
= PHP_PQTXN_READ_COMMITTED
;
3668 zend_bool async
= 0, readonly
= 0, deferrable
= 0;
3670 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3671 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|blbb", &zconn
, php_pqconn_class_entry
, &async
, &isolation
, &readonly
, &deferrable
)) {
3673 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3674 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3676 if (conn_obj
->intern
) {
3678 rv
= php_pqconn_start_transaction_async(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3680 rv
= php_pqconn_start_transaction(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3683 if (SUCCESS
== rv
) {
3684 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3686 php_pq_object_addref(conn_obj TSRMLS_CC
);
3687 obj
->intern
->conn
= conn_obj
;
3688 obj
->intern
->isolation
= isolation
;
3689 obj
->intern
->readonly
= readonly
;
3690 obj
->intern
->deferrable
= deferrable
;
3693 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3696 zend_restore_error_handling(&zeh TSRMLS_CC
);
3699 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_savepoint
, 0, 0, 0)
3700 ZEND_END_ARG_INFO();
3701 static PHP_METHOD(pqtxn
, savepoint
) {
3702 zend_error_handling zeh
;
3704 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3705 if (SUCCESS
== zend_parse_parameters_none()) {
3706 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3712 spprintf(&cmd
, 0, "SAVEPOINT \"%u\"", ++obj
->intern
->savepoint
);
3713 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3716 php_pqres_success(res TSRMLS_CC
);
3719 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3724 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3727 zend_restore_error_handling(&zeh TSRMLS_CC
);
3730 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_savepoint_async
, 0, 0, 0)
3731 ZEND_END_ARG_INFO();
3732 static PHP_METHOD(pqtxn
, savepointAsync
) {
3733 zend_error_handling zeh
;
3735 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3736 if (SUCCESS
== zend_parse_parameters_none()) {
3737 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3742 spprintf(&cmd
, 0, "SAVEPOINT \"%u\"", ++obj
->intern
->savepoint
);
3743 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3744 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3749 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3752 zend_restore_error_handling(&zeh TSRMLS_CC
);
3755 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit
, 0, 0, 0)
3756 ZEND_END_ARG_INFO();
3757 static PHP_METHOD(pqtxn
, commit
) {
3758 zend_error_handling zeh
;
3760 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3761 if (SUCCESS
== zend_parse_parameters_none()) {
3762 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3767 if (obj
->intern
->savepoint
) {
3770 spprintf(&cmd
, 0, "RELEASE SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3771 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3774 php_pqres_success(res TSRMLS_CC
);
3777 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3782 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "COMMIT");
3785 php_pqres_success(res TSRMLS_CC
);
3788 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3792 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3795 zend_restore_error_handling(&zeh TSRMLS_CC
);
3798 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit_async
, 0, 0, 0)
3799 ZEND_END_ARG_INFO();
3800 static PHP_METHOD(pqtxn
, commitAsync
) {
3801 zend_error_handling zeh
;
3803 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3804 if (SUCCESS
== zend_parse_parameters_none()) {
3805 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3808 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3810 if (obj
->intern
->savepoint
) {
3813 spprintf(&cmd
, 0, "RELEASE SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3814 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3815 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3820 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "COMMIT")) {
3821 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3825 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3828 zend_restore_error_handling(&zeh TSRMLS_CC
);
3831 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback
, 0, 0, 0)
3832 ZEND_END_ARG_INFO();
3833 static PHP_METHOD(pqtxn
, rollback
) {
3834 zend_error_handling zeh
;
3836 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3837 if (SUCCESS
== zend_parse_parameters_none()) {
3838 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3843 if (obj
->intern
->savepoint
) {
3846 spprintf(&cmd
, 0, "ROLLBACK TO SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3847 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3850 php_pqres_success(res TSRMLS_CC
);
3853 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3858 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "ROLLBACK");
3861 php_pqres_success(res TSRMLS_CC
);
3864 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3868 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3871 zend_restore_error_handling(&zeh TSRMLS_CC
);
3874 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback_async
, 0, 0, 0)
3875 ZEND_END_ARG_INFO();
3876 static PHP_METHOD(pqtxn
, rollbackAsync
) {
3877 zend_error_handling zeh
;
3879 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3880 if (SUCCESS
== zend_parse_parameters_none()) {
3881 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3884 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3886 if (obj
->intern
->savepoint
) {
3889 spprintf(&cmd
, 0, "ROLLBACK TO SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3890 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3891 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3896 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "ROLLBACK")) {
3897 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3901 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3904 zend_restore_error_handling(&zeh TSRMLS_CC
);
3907 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_export_snapshot
, 0, 0, 0)
3908 ZEND_END_ARG_INFO();
3909 static PHP_METHOD(pqtxn
, exportSnapshot
) {
3910 zend_error_handling zeh
;
3912 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3913 if (SUCCESS
== zend_parse_parameters_none()) {
3914 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3917 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SELECT pg_export_snapshot()");
3920 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3921 RETVAL_STRING(PQgetvalue(res
, 0, 0), 1);
3926 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to export transaction snapshot (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3929 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3932 zend_restore_error_handling(&zeh TSRMLS_CC
);
3935 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_export_snapshot_async
, 0, 0, 0)
3936 ZEND_END_ARG_INFO();
3937 static PHP_METHOD(pqtxn
, exportSnapshotAsync
) {
3938 zend_error_handling zeh
;
3940 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3941 if (SUCCESS
== zend_parse_parameters_none()) {
3942 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3945 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3947 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "SELECT pg_export_snapshot()")) {
3948 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to export transaction snapshot (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3951 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3954 zend_restore_error_handling(&zeh TSRMLS_CC
);
3957 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_import_snapshot
, 0, 0, 1)
3958 ZEND_ARG_INFO(0, snapshot_id
)
3959 ZEND_END_ARG_INFO();
3960 static PHP_METHOD(pqtxn
, importSnapshot
) {
3961 zend_error_handling zeh
;
3965 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3966 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &snapshot_str
, &snapshot_len
)) {
3967 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3970 if (obj
->intern
->isolation
>= PHP_PQTXN_REPEATABLE_READ
) {
3971 char *cmd
, *sid
= PQescapeLiteral(obj
->intern
->conn
->intern
->conn
, snapshot_str
, snapshot_len
);
3974 spprintf(&cmd
, 0, "SET TRANSACTION SNAPSHOT %s", sid
);
3975 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3978 php_pqres_success(res TSRMLS_CC
);
3981 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3984 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");
3987 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3990 zend_restore_error_handling(&zeh TSRMLS_CC
);
3993 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_import_snapshot_async
, 0, 0, 1)
3994 ZEND_ARG_INFO(0, snapshot_id
)
3995 ZEND_END_ARG_INFO();
3996 static PHP_METHOD(pqtxn
, importSnapshotAsync
) {
3997 zend_error_handling zeh
;
4001 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4002 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &snapshot_str
, &snapshot_len
)) {
4003 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4006 if (obj
->intern
->isolation
>= PHP_PQTXN_REPEATABLE_READ
) {
4007 char *sid
= PQescapeLiteral(obj
->intern
->conn
->intern
->conn
, snapshot_str
, snapshot_len
);
4011 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
4013 spprintf(&cmd
, 0, "SET TRANSACTION SNAPSHOT %s", sid
);
4014 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
4015 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4019 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to quote snapshot identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4022 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");
4025 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
4028 zend_restore_error_handling(&zeh TSRMLS_CC
);
4031 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_open_lob
, 0, 0, 1)
4032 ZEND_ARG_INFO(0, oid
)
4033 ZEND_ARG_INFO(0, mode
)
4034 ZEND_END_ARG_INFO();
4035 static PHP_METHOD(pqtxn
, openLOB
) {
4036 zend_error_handling zeh
;
4037 long mode
= INV_WRITE
|INV_READ
, loid
;
4039 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4040 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &loid
, &mode
)) {
4041 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4044 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
4047 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
4051 php_pq_object_addref(obj TSRMLS_CC
);
4054 return_value
->type
= IS_OBJECT
;
4055 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
4057 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
4058 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4059 (mode
& INV_READ
? "r" :
4060 (mode
& INV_WRITE
? "w" : "-"))),
4061 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
4065 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
4068 zend_restore_error_handling(&zeh TSRMLS_CC
);
4071 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_create_lob
, 0, 0, 0)
4072 ZEND_ARG_INFO(0, mode
)
4073 ZEND_END_ARG_INFO();
4074 static PHP_METHOD(pqtxn
, createLOB
) {
4075 zend_error_handling zeh
;
4076 long mode
= INV_WRITE
|INV_READ
;
4078 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4079 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &mode
)) {
4080 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4083 Oid loid
= lo_creat(obj
->intern
->conn
->intern
->conn
, mode
);
4085 if (loid
!= InvalidOid
) {
4086 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
4089 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
4092 php_pq_object_addref(obj TSRMLS_CC
);
4095 return_value
->type
= IS_OBJECT
;
4096 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
4098 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s': %s",
4099 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4100 (mode
& INV_READ
? "r" :
4101 (mode
& INV_WRITE
? "w" : "-"))),
4102 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
4106 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s': %s",
4107 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4108 (mode
& INV_READ
? "r" :
4109 (mode
& INV_WRITE
? "w" : "-"))),
4110 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
4114 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
4117 zend_restore_error_handling(&zeh TSRMLS_CC
);
4120 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_unlink_lob
, 0, 0, 1)
4121 ZEND_ARG_INFO(0, oid
)
4122 ZEND_END_ARG_INFO();
4123 static PHP_METHOD(pqtxn
, unlinkLOB
) {
4126 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l", &loid
)) {
4127 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4130 if (1 == lo_unlink(obj
->intern
->conn
->intern
->conn
, loid
)) {
4133 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to unlink LOB (oid=%ld): %s", loid
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4137 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
4143 static zend_function_entry php_pqtxn_methods
[] = {
4144 PHP_ME(pqtxn
, __construct
, ai_pqtxn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4145 PHP_ME(pqtxn
, commit
, ai_pqtxn_commit
, ZEND_ACC_PUBLIC
)
4146 PHP_ME(pqtxn
, rollback
, ai_pqtxn_rollback
, ZEND_ACC_PUBLIC
)
4147 PHP_ME(pqtxn
, commitAsync
, ai_pqtxn_commit_async
, ZEND_ACC_PUBLIC
)
4148 PHP_ME(pqtxn
, rollbackAsync
, ai_pqtxn_rollback_async
, ZEND_ACC_PUBLIC
)
4149 PHP_ME(pqtxn
, savepoint
, ai_pqtxn_savepoint
, ZEND_ACC_PUBLIC
)
4150 PHP_ME(pqtxn
, savepointAsync
, ai_pqtxn_savepoint_async
, ZEND_ACC_PUBLIC
)
4151 PHP_ME(pqtxn
, exportSnapshot
, ai_pqtxn_export_snapshot
, ZEND_ACC_PUBLIC
)
4152 PHP_ME(pqtxn
, exportSnapshotAsync
, ai_pqtxn_export_snapshot_async
, ZEND_ACC_PUBLIC
)
4153 PHP_ME(pqtxn
, importSnapshot
, ai_pqtxn_import_snapshot
, ZEND_ACC_PUBLIC
)
4154 PHP_ME(pqtxn
, importSnapshotAsync
, ai_pqtxn_import_snapshot_async
, ZEND_ACC_PUBLIC
)
4155 PHP_ME(pqtxn
, openLOB
, ai_pqtxn_open_lob
, ZEND_ACC_PUBLIC
)
4156 PHP_ME(pqtxn
, createLOB
, ai_pqtxn_create_lob
, ZEND_ACC_PUBLIC
)
4157 PHP_ME(pqtxn
, unlinkLOB
, ai_pqtxn_unlink_lob
, ZEND_ACC_PUBLIC
)
4161 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_construct
, 0, 0, 1)
4162 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
4163 ZEND_END_ARG_INFO();
4164 static PHP_METHOD(pqcancel
, __construct
) {
4165 zend_error_handling zeh
;
4168 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4169 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
4170 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4172 if (conn_obj
->intern
) {
4173 PGcancel
*cancel
= PQgetCancel(conn_obj
->intern
->conn
);
4176 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4178 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4179 obj
->intern
->cancel
= cancel
;
4180 php_pq_object_addref(conn_obj TSRMLS_CC
);
4181 obj
->intern
->conn
= conn_obj
;
4183 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not acquire cancel (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
4186 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4189 zend_restore_error_handling(&zeh TSRMLS_CC
);
4192 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_cancel
, 0, 0, 0)
4193 ZEND_END_ARG_INFO();
4194 static PHP_METHOD(pqcancel
, cancel
) {
4195 zend_error_handling zeh
;
4197 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4198 if (SUCCESS
== zend_parse_parameters_none()) {
4199 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4204 if (!PQcancel(obj
->intern
->cancel
, err
, sizeof(err
))) {
4205 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not request cancellation: %s", err
);
4208 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Cancel not initialized");
4211 zend_restore_error_handling(&zeh TSRMLS_CC
);
4214 static zend_function_entry php_pqcancel_methods
[] = {
4215 PHP_ME(pqcancel
, __construct
, ai_pqcancel_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4216 PHP_ME(pqcancel
, cancel
, ai_pqcancel_cancel
, ZEND_ACC_PUBLIC
)
4220 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
)
4224 if (SUCCESS
== zend_hash_find(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evhs
)) {
4226 add_next_index_zval(*evhs
, zevent
);
4233 add_next_index_zval(evh
, zevent
);
4234 zend_hash_add(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evh
, sizeof(zval
*), NULL
);
4238 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_construct
, 0, 0, 3)
4239 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
4240 ZEND_ARG_INFO(0, type
)
4241 ZEND_ARG_INFO(0, callable
)
4242 ZEND_END_ARG_INFO();
4243 static PHP_METHOD(pqevent
, __construct
) {
4244 zend_error_handling zeh
;
4248 php_pq_callback_t cb
;
4250 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4251 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Osf", &zconn
, php_pqconn_class_entry
, &type_str
, &type_len
, &cb
.fci
, &cb
.fcc
)) {
4252 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4254 if (conn_obj
->intern
) {
4255 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4257 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4258 php_pq_callback_addref(&cb
);
4259 obj
->intern
->cb
= cb
;
4260 php_pq_object_addref(conn_obj TSRMLS_CC
);
4261 obj
->intern
->conn
= conn_obj
;
4262 obj
->intern
->type
= estrdup(type_str
);
4264 php_pqconn_add_eventhandler(zconn
, conn_obj
, type_str
, type_len
, getThis() TSRMLS_CC
);
4267 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4270 zend_restore_error_handling(&zeh TSRMLS_CC
);
4273 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_trigger
, 0, 0, 1)
4274 ZEND_ARG_ARRAY_INFO(0, args
, 1)
4275 ZEND_END_ARG_INFO();
4276 static PHP_METHOD(pqevent
, trigger
) {
4279 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "a/", &args
)) {
4280 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4285 if (SUCCESS
== zend_fcall_info_call(&obj
->intern
->cb
.fci
, &obj
->intern
->cb
.fcc
, &rv
, args TSRMLS_CC
)) {
4287 RETVAL_ZVAL(rv
, 0, 1);
4293 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Event not initialized");
4299 static zend_function_entry php_pqevent_methods
[] = {
4300 PHP_ME(pqevent
, __construct
, ai_pqevent_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4301 PHP_ME(pqevent
, trigger
, ai_pqevent_trigger
, ZEND_ACC_PUBLIC
)
4305 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_construct
, 0, 0, 1)
4306 ZEND_ARG_OBJ_INFO(0, transaction
, pq
\\Transaction
, 0)
4307 ZEND_ARG_INFO(0, oid
)
4308 ZEND_ARG_INFO(0, mode
)
4309 ZEND_END_ARG_INFO();
4310 static PHP_METHOD(pqlob
, __construct
) {
4311 zend_error_handling zeh
;
4313 long mode
= INV_WRITE
|INV_READ
, loid
= InvalidOid
;
4315 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4316 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|ll", &ztxn
, php_pqtxn_class_entry
, &loid
, &mode
)) {
4317 php_pqtxn_object_t
*txn_obj
= zend_object_store_get_object(ztxn TSRMLS_CC
);
4319 if (txn_obj
->intern
) {
4321 if (loid
== InvalidOid
) {
4322 loid
= lo_creat(txn_obj
->intern
->conn
->intern
->conn
, mode
);
4325 if (loid
!= InvalidOid
) {
4326 int lofd
= lo_open(txn_obj
->intern
->conn
->intern
->conn
, loid
, mode
);
4329 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4331 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4332 obj
->intern
->lofd
= lofd
;
4333 obj
->intern
->loid
= loid
;
4334 php_pq_object_addref(txn_obj TSRMLS_CC
);
4335 obj
->intern
->txn
= txn_obj
;
4337 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
4338 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4339 (mode
& INV_READ
? "r" :
4340 (mode
& INV_WRITE
? "w" : "-"))),
4341 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
4345 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s' (%s)",
4346 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4347 (mode
& INV_READ
? "r" :
4348 (mode
& INV_WRITE
? "w" : "-"))),
4349 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
4353 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
4356 zend_restore_error_handling(&zeh TSRMLS_CC
);
4359 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_write
, 0, 0, 1)
4360 ZEND_ARG_INFO(0, data
)
4361 ZEND_END_ARG_INFO();
4362 static PHP_METHOD(pqlob
, write
) {
4366 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
4367 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4370 int written
= lo_write(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, data_str
, data_len
);
4373 RETVAL_LONG(written
);
4375 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to write to LOB, oid=%d (%s)", obj
->intern
->loid
,
4376 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4380 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4386 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_read
, 0, 0, 0)
4387 ZEND_ARG_INFO(0, length
)
4388 ZEND_ARG_INFO(1, read
)
4389 ZEND_END_ARG_INFO();
4390 static PHP_METHOD(pqlob
, read
) {
4391 long length
= 0x1000;
4394 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lz!", &length
, &zread
)) {
4395 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4398 char *buffer
= emalloc(length
+ 1);
4399 int read
= lo_read(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, buffer
, length
);
4404 ZVAL_LONG(zread
, read
);
4406 buffer
[read
] = '\0';
4407 RETVAL_STRINGL(buffer
, read
, 0);
4410 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to read from LOB, oid=%d (%s)", obj
->intern
->loid
,
4411 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4416 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4422 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_seek
, 0, 0, 1)
4423 ZEND_ARG_INFO(0, offset
)
4424 ZEND_ARG_INFO(0, whence
)
4425 ZEND_END_ARG_INFO();
4426 static PHP_METHOD(pqlob
, seek
) {
4427 long offset
, whence
= SEEK_SET
;
4429 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &offset
, &whence
)) {
4430 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4433 int position
= lo_lseek(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, offset
, whence
);
4435 if (position
>= 0) {
4436 RETVAL_LONG(position
);
4438 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to seek offset in LOB, oid=%d (%s)", obj
->intern
->loid
,
4439 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4443 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4449 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_tell
, 0, 0, 0)
4450 ZEND_END_ARG_INFO();
4451 static PHP_METHOD(pqlob
, tell
) {
4452 if (SUCCESS
== zend_parse_parameters_none()) {
4453 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4456 int position
= lo_tell(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
4458 if (position
>= 0) {
4459 RETVAL_LONG(position
);
4461 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to tell offset in LOB (oid=%d): %s", obj
->intern
->loid
,
4462 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4466 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4472 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_truncate
, 0, 0, 0)
4473 ZEND_ARG_INFO(0, length
)
4474 ZEND_END_ARG_INFO();
4475 static PHP_METHOD(pqlob
, truncate
) {
4478 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &length
)) {
4479 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4482 if (0 == lo_truncate(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, length
)) {
4485 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to truncate LOB (oid=%d): %s", obj
->intern
->loid
,
4486 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4490 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4496 static zend_function_entry php_pqlob_methods
[] = {
4497 PHP_ME(pqlob
, __construct
, ai_pqlob_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4498 PHP_ME(pqlob
, write
, ai_pqlob_write
, ZEND_ACC_PUBLIC
)
4499 PHP_ME(pqlob
, read
, ai_pqlob_read
, ZEND_ACC_PUBLIC
)
4500 PHP_ME(pqlob
, seek
, ai_pqlob_seek
, ZEND_ACC_PUBLIC
)
4501 PHP_ME(pqlob
, tell
, ai_pqlob_tell
, ZEND_ACC_PUBLIC
)
4502 PHP_ME(pqlob
, truncate
, ai_pqlob_truncate
, ZEND_ACC_PUBLIC
)
4506 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_construct
, 0, 0, 3)
4507 ZEND_ARG_OBJ_INFO(0, "connection", pq
\\Connection
, 0)
4508 ZEND_ARG_INFO(0, expression
)
4509 ZEND_ARG_INFO(0, direction
)
4510 ZEND_ARG_INFO(0, options
)
4511 ZEND_END_ARG_INFO();
4512 static PHP_METHOD(pqcopy
, __construct
) {
4513 zend_error_handling zeh
;
4515 char *expr_str
, *opt_str
= "";
4516 int expr_len
, opt_len
= 0;
4519 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4520 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
)) {
4521 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4523 if (conn_obj
->intern
) {
4526 switch (direction
) {
4527 case PHP_PQCOPY_FROM_STDIN
:
4528 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "FROM STDIN", opt_str
);
4531 case PHP_PQCOPY_TO_STDOUT
:
4532 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "TO STDOUT", opt_str
);
4536 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Invalid COPY direction, expected one of FROM_STDIN (%d) TO_STDOUT (%d), got %ld",
4537 PHP_PQCOPY_FROM_STDIN
, PHP_PQCOPY_TO_STDOUT
, direction
);
4542 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4543 PGresult
*res
= PQexec(conn_obj
->intern
->conn
, copy
);
4547 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4548 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4549 obj
->intern
->direction
= direction
;
4550 obj
->intern
->expression
= estrdup(expr_str
);
4551 obj
->intern
->options
= estrdup(opt_str
);
4552 obj
->intern
->conn
= conn_obj
;
4553 php_pq_object_addref(conn_obj TSRMLS_CC
);
4559 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4562 zend_restore_error_handling(&zeh TSRMLS_CC
);
4565 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_put
, 0, 0, 1)
4566 ZEND_ARG_INFO(0, data
)
4567 ZEND_END_ARG_INFO();
4568 static PHP_METHOD(pqcopy
, put
) {
4569 zend_error_handling zeh
;
4573 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4574 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
4575 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4578 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
4579 if (1 == PQputCopyData(obj
->intern
->conn
->intern
->conn
, data_str
, data_len
)) {
4582 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to send COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4585 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
4588 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
4591 zend_restore_error_handling(&zeh TSRMLS_CC
);
4594 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_end
, 0, 0, 0)
4595 ZEND_ARG_INFO(0, error
)
4596 ZEND_END_ARG_INFO();
4597 static PHP_METHOD(pqcopy
, end
) {
4598 zend_error_handling zeh
;
4599 char *error_str
= NULL
;
4602 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4603 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|s!", &error_str
, &error_len
)) {
4604 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4607 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
4608 if (1 == PQputCopyEnd(obj
->intern
->conn
->intern
->conn
, error_str
)) {
4609 PGresult
*res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
4612 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4618 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4621 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to end COPY (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4624 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
4627 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
4630 zend_restore_error_handling(&zeh TSRMLS_CC
);
4633 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_get
, 0, 0, 1)
4634 ZEND_ARG_INFO(1, data
)
4635 ZEND_END_ARG_INFO();
4636 static PHP_METHOD(pqcopy
, get
) {
4637 zend_error_handling zeh
;
4640 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4641 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &zdata
)) {
4642 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4643 char *buffer
= NULL
;
4646 if (PHP_PQCOPY_TO_STDOUT
== obj
->intern
->direction
) {
4648 int bytes
= PQgetCopyData(obj
->intern
->conn
->intern
->conn
, &buffer
, 0);
4652 res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
4655 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4661 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4666 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4672 ZVAL_STRINGL(zdata
, buffer
, bytes
, 1);
4674 ZVAL_EMPTY_STRING(zdata
);
4686 zend_restore_error_handling(&zeh TSRMLS_CC
);
4689 static zend_function_entry php_pqcopy_methods
[] = {
4690 PHP_ME(pqcopy
, __construct
, ai_pqcopy_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4691 PHP_ME(pqcopy
, put
, ai_pqcopy_put
, ZEND_ACC_PUBLIC
)
4692 PHP_ME(pqcopy
, end
, ai_pqcopy_end
, ZEND_ACC_PUBLIC
)
4693 PHP_ME(pqcopy
, get
, ai_pqcopy_get
, ZEND_ACC_PUBLIC
)
4697 /* {{{ PHP_MINIT_FUNCTION
4699 static PHP_MINIT_FUNCTION(pq
)
4701 zend_class_entry ce
= {0};
4702 php_pq_object_prophandler_t ph
= {0};
4704 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
4705 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4706 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
4708 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4709 php_pqconn_object_handlers
.read_property
= php_pq_object_read_prop
;
4710 php_pqconn_object_handlers
.write_property
= php_pq_object_write_prop
;
4711 php_pqconn_object_handlers
.clone_obj
= NULL
;
4712 php_pqconn_object_handlers
.get_property_ptr_ptr
= NULL
;
4713 php_pqconn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4715 zend_hash_init(&php_pqconn_object_prophandlers
, 13, NULL
, NULL
, 1);
4717 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4718 ph
.read
= php_pqconn_object_read_status
;
4719 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4721 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4722 ph
.read
= php_pqconn_object_read_transaction_status
;
4723 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
4725 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4726 ph
.read
= NULL
; /* forward to std prophandler */
4727 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
4729 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4730 ph
.read
= php_pqconn_object_read_error_message
;
4731 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4733 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("busy"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4734 ph
.read
= php_pqconn_object_read_busy
;
4735 zend_hash_add(&php_pqconn_object_prophandlers
, "busy", sizeof("busy"), (void *) &ph
, sizeof(ph
), NULL
);
4737 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("encoding"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4738 ph
.read
= php_pqconn_object_read_encoding
;
4739 ph
.write
= php_pqconn_object_write_encoding
;
4740 zend_hash_add(&php_pqconn_object_prophandlers
, "encoding", sizeof("encoding"), (void *) &ph
, sizeof(ph
), NULL
);
4743 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("unbuffered"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4744 ph
.read
= php_pqconn_object_read_unbuffered
;
4745 ph
.write
= php_pqconn_object_write_unbuffered
;
4746 zend_hash_add(&php_pqconn_object_prophandlers
, "unbuffered", sizeof("unbuffered"), (void *) &ph
, sizeof(ph
), NULL
);
4749 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("db"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4750 ph
.read
= php_pqconn_object_read_db
;
4751 zend_hash_add(&php_pqconn_object_prophandlers
, "db", sizeof("db"), (void *) &ph
, sizeof(ph
), NULL
);
4753 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4754 ph
.read
= php_pqconn_object_read_user
;
4755 zend_hash_add(&php_pqconn_object_prophandlers
, "user", sizeof("user"), (void *) &ph
, sizeof(ph
), NULL
);
4757 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("pass"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4758 ph
.read
= php_pqconn_object_read_pass
;
4759 zend_hash_add(&php_pqconn_object_prophandlers
, "pass", sizeof("pass"), (void *) &ph
, sizeof(ph
), NULL
);
4761 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("host"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4762 ph
.read
= php_pqconn_object_read_host
;
4763 zend_hash_add(&php_pqconn_object_prophandlers
, "host", sizeof("host"), (void *) &ph
, sizeof(ph
), NULL
);
4765 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("port"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4766 ph
.read
= php_pqconn_object_read_port
;
4767 zend_hash_add(&php_pqconn_object_prophandlers
, "port", sizeof("port"), (void *) &ph
, sizeof(ph
), NULL
);
4769 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4770 ph
.read
= php_pqconn_object_read_options
;
4771 zend_hash_add(&php_pqconn_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
4773 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
4774 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
4775 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
4776 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
4777 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
4778 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
4779 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
4780 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
4782 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
4783 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
4784 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
4785 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
4786 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
4788 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
4789 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
4790 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
4791 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
4793 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("ASYNC"), 0x1 TSRMLS_CC
);
4794 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("PERSISTENT"), 0x2 TSRMLS_CC
);
4795 memset(&ce
, 0, sizeof(ce
));
4796 INIT_NS_CLASS_ENTRY(ce
, "pq", "Types", php_pqtypes_methods
);
4797 php_pqtypes_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4798 php_pqtypes_class_entry
->create_object
= php_pqtypes_create_object
;
4800 memcpy(&php_pqtypes_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4801 php_pqtypes_object_handlers
.read_property
= php_pq_object_read_prop
;
4802 php_pqtypes_object_handlers
.write_property
= php_pq_object_write_prop
;
4803 php_pqtypes_object_handlers
.clone_obj
= NULL
;
4804 php_pqtypes_object_handlers
.get_property_ptr_ptr
= NULL
;
4805 php_pqtypes_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4806 php_pqtypes_object_handlers
.has_dimension
= php_pqtypes_object_has_dimension
;
4807 php_pqtypes_object_handlers
.read_dimension
= php_pqtypes_object_read_dimension
;
4808 php_pqtypes_object_handlers
.unset_dimension
= NULL
;
4809 php_pqtypes_object_handlers
.write_dimension
= NULL
;
4811 zend_hash_init(&php_pqtypes_object_prophandlers
, 1, NULL
, NULL
, 1);
4813 zend_declare_property_null(php_pqtypes_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4814 ph
.read
= php_pqtypes_object_read_connection
;
4815 zend_hash_add(&php_pqtypes_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4817 memset(&ce
, 0, sizeof(ce
));
4818 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
4819 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4820 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
4821 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
4822 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
4823 zend_class_implements(php_pqres_class_entry TSRMLS_CC
, 2, zend_ce_traversable
, spl_ce_Countable
);
4825 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4826 php_pqres_object_handlers
.read_property
= php_pq_object_read_prop
;
4827 php_pqres_object_handlers
.write_property
= php_pq_object_write_prop
;
4828 php_pqres_object_handlers
.clone_obj
= NULL
;
4829 php_pqres_object_handlers
.get_property_ptr_ptr
= NULL
;
4830 php_pqres_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4831 php_pqres_object_handlers
.count_elements
= php_pqres_count_elements
;
4833 zend_hash_init(&php_pqres_object_prophandlers
, 6, NULL
, NULL
, 1);
4835 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4836 ph
.read
= php_pqres_object_read_status
;
4837 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4839 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4840 ph
.read
= php_pqres_object_read_error_message
;
4841 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4843 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4844 ph
.read
= php_pqres_object_read_num_rows
;
4845 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
4847 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4848 ph
.read
= php_pqres_object_read_num_cols
;
4849 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
4851 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4852 ph
.read
= php_pqres_object_read_affected_rows
;
4853 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
4855 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4856 ph
.read
= php_pqres_object_read_fetch_type
;
4857 ph
.write
= php_pqres_object_write_fetch_type
;
4858 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
4861 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
4862 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
4863 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
4864 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
4865 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
4866 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
4867 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
4868 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
4869 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
4870 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
4872 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
4873 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
4874 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
4876 memset(&ce
, 0, sizeof(ce
));
4877 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
4878 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4879 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
4881 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4882 php_pqstm_object_handlers
.read_property
= php_pq_object_read_prop
;
4883 php_pqstm_object_handlers
.write_property
= php_pq_object_write_prop
;
4884 php_pqstm_object_handlers
.clone_obj
= NULL
;
4885 php_pqstm_object_handlers
.get_property_ptr_ptr
= NULL
;
4886 php_pqstm_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4888 zend_hash_init(&php_pqstm_object_prophandlers
, 2, NULL
, NULL
, 1);
4890 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4891 ph
.read
= php_pqstm_object_read_name
;
4892 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
4894 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4895 ph
.read
= php_pqstm_object_read_connection
;
4896 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4898 memset(&ce
, 0, sizeof(ce
));
4899 INIT_NS_CLASS_ENTRY(ce
, "pq", "Transaction", php_pqtxn_methods
);
4900 php_pqtxn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4901 php_pqtxn_class_entry
->create_object
= php_pqtxn_create_object
;
4903 memcpy(&php_pqtxn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4904 php_pqtxn_object_handlers
.read_property
= php_pq_object_read_prop
;
4905 php_pqtxn_object_handlers
.write_property
= php_pq_object_write_prop
;
4906 php_pqtxn_object_handlers
.clone_obj
= NULL
;
4907 php_pqtxn_object_handlers
.get_property_ptr_ptr
= NULL
;
4908 php_pqtxn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4910 zend_hash_init(&php_pqtxn_object_prophandlers
, 4, NULL
, NULL
, 1);
4912 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4913 ph
.read
= php_pqtxn_object_read_connection
;
4914 zend_hash_add(&php_pqtxn_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4916 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("isolation"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4917 ph
.read
= php_pqtxn_object_read_isolation
;
4918 ph
.write
= php_pqtxn_object_write_isolation
;
4919 zend_hash_add(&php_pqtxn_object_prophandlers
, "isolation", sizeof("isolation"), (void *) &ph
, sizeof(ph
), NULL
);
4921 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("readonly"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4922 ph
.read
= php_pqtxn_object_read_readonly
;
4923 ph
.write
= php_pqtxn_object_write_readonly
;
4924 zend_hash_add(&php_pqtxn_object_prophandlers
, "readonly", sizeof("readonly"), (void *) &ph
, sizeof(ph
), NULL
);
4926 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("deferrable"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4927 ph
.read
= php_pqtxn_object_read_deferrable
;
4928 ph
.write
= php_pqtxn_object_write_deferrable
;
4929 zend_hash_add(&php_pqtxn_object_prophandlers
, "deferrable", sizeof("deferrable"), (void *) &ph
, sizeof(ph
), NULL
);
4932 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("READ_COMMITTED"), PHP_PQTXN_READ_COMMITTED TSRMLS_CC
);
4933 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("REPEATABLE READ"), PHP_PQTXN_REPEATABLE_READ TSRMLS_CC
);
4934 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("SERIALIZABLE"), PHP_PQTXN_SERIALIZABLE TSRMLS_CC
);
4936 memset(&ce
, 0, sizeof(ce
));
4937 INIT_NS_CLASS_ENTRY(ce
, "pq", "Cancel", php_pqcancel_methods
);
4938 php_pqcancel_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4939 php_pqcancel_class_entry
->create_object
= php_pqcancel_create_object
;
4941 memcpy(&php_pqcancel_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4942 php_pqcancel_object_handlers
.read_property
= php_pq_object_read_prop
;
4943 php_pqcancel_object_handlers
.write_property
= php_pq_object_write_prop
;
4944 php_pqcancel_object_handlers
.clone_obj
= NULL
;
4945 php_pqcancel_object_handlers
.get_property_ptr_ptr
= NULL
;
4946 php_pqcancel_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4948 zend_hash_init(&php_pqcancel_object_prophandlers
, 1, NULL
, NULL
, 1);
4950 zend_declare_property_null(php_pqcancel_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4951 ph
.read
= php_pqcancel_object_read_connection
;
4952 zend_hash_add(&php_pqcancel_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4954 memset(&ce
, 0, sizeof(ce
));
4955 INIT_NS_CLASS_ENTRY(ce
, "pq", "Event", php_pqevent_methods
);
4956 php_pqevent_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4957 php_pqevent_class_entry
->create_object
= php_pqevent_create_object
;
4959 memcpy(&php_pqevent_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4960 php_pqevent_object_handlers
.read_property
= php_pq_object_read_prop
;
4961 php_pqevent_object_handlers
.write_property
= php_pq_object_write_prop
;
4962 php_pqevent_object_handlers
.clone_obj
= NULL
;
4963 php_pqevent_object_handlers
.get_property_ptr_ptr
= NULL
;
4964 php_pqevent_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4966 zend_hash_init(&php_pqevent_object_prophandlers
, 2, NULL
, NULL
, 1);
4968 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4969 ph
.read
= php_pqevent_object_read_connection
;
4970 zend_hash_add(&php_pqevent_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4972 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("type"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4973 ph
.read
= php_pqevent_object_read_type
;
4974 zend_hash_add(&php_pqevent_object_prophandlers
, "type", sizeof("type"), (void *) &ph
, sizeof(ph
), NULL
);
4976 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("NOTICE"), ZEND_STRL("notice") TSRMLS_CC
);
4977 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESULT"), ZEND_STRL("result") TSRMLS_CC
);
4978 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESET"), ZEND_STRL("reset") TSRMLS_CC
);
4980 memset(&ce
, 0, sizeof(ce
));
4981 INIT_NS_CLASS_ENTRY(ce
, "pq", "LOB", php_pqlob_methods
);
4982 php_pqlob_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4983 php_pqlob_class_entry
->create_object
= php_pqlob_create_object
;
4985 memcpy(&php_pqlob_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4986 php_pqlob_object_handlers
.read_property
= php_pq_object_read_prop
;
4987 php_pqlob_object_handlers
.write_property
= php_pq_object_write_prop
;
4988 php_pqlob_object_handlers
.clone_obj
= NULL
;
4989 php_pqlob_object_handlers
.get_property_ptr_ptr
= NULL
;
4990 php_pqlob_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4992 zend_hash_init(&php_pqlob_object_prophandlers
, 2, NULL
, NULL
, 1);
4994 zend_declare_property_null(php_pqlob_class_entry
, ZEND_STRL("transaction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4995 ph
.read
= php_pqlob_object_read_transaction
;
4996 zend_hash_add(&php_pqlob_object_prophandlers
, "transaction", sizeof("transaction"), (void *) &ph
, sizeof(ph
), NULL
);
4998 zend_declare_property_long(php_pqlob_class_entry
, ZEND_STRL("oid"), InvalidOid
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4999 ph
.read
= php_pqlob_object_read_oid
;
5000 zend_hash_add(&php_pqlob_object_prophandlers
, "oid", sizeof("oid"), (void *) &ph
, sizeof(ph
), NULL
);
5002 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("INVALID_OID"), InvalidOid TSRMLS_CC
);
5003 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("R"), INV_READ TSRMLS_CC
);
5004 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("W"), INV_WRITE TSRMLS_CC
);
5005 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("RW"), INV_READ
|INV_WRITE TSRMLS_CC
);
5007 memset(&ce
, 0, sizeof(ce
));
5008 INIT_NS_CLASS_ENTRY(ce
, "pq", "COPY", php_pqcopy_methods
);
5009 php_pqcopy_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
5010 php_pqcopy_class_entry
->create_object
= php_pqcopy_create_object
;
5012 memcpy(&php_pqcopy_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
5013 php_pqcopy_object_handlers
.read_property
= php_pq_object_read_prop
;
5014 php_pqcopy_object_handlers
.write_property
= php_pq_object_write_prop
;
5015 php_pqcopy_object_handlers
.clone_obj
= NULL
;
5016 php_pqcopy_object_handlers
.get_property_ptr_ptr
= NULL
;
5017 php_pqcopy_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
5019 zend_hash_init(&php_pqcopy_object_prophandlers
, 4, NULL
, NULL
, 1);
5021 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
5022 ph
.read
= php_pqcopy_object_read_connection
;
5023 zend_hash_add(&php_pqcopy_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
5025 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("expression"), ZEND_ACC_PUBLIC TSRMLS_CC
);
5026 ph
.read
= php_pqcopy_object_read_expression
;
5027 zend_hash_add(&php_pqcopy_object_prophandlers
, "expression", sizeof("expression"), (void *) &ph
, sizeof(ph
), NULL
);
5029 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("direction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
5030 ph
.read
= php_pqcopy_object_read_direction
;
5031 zend_hash_add(&php_pqcopy_object_prophandlers
, "direction", sizeof("direction"), (void *) &ph
, sizeof(ph
), NULL
);
5033 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
5034 ph
.read
= php_pqcopy_object_read_options
;
5035 zend_hash_add(&php_pqcopy_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
5037 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("FROM_STDIN"), PHP_PQCOPY_FROM_STDIN TSRMLS_CC
);
5038 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("TO_STDOUT"), PHP_PQCOPY_TO_STDOUT TSRMLS_CC
);
5040 php_persistent_handle_provide(ZEND_STRL("pq\\Connection"), &php_pqconn_resource_factory_ops
, NULL
, NULL TSRMLS_CC
);
5043 REGISTER_INI_ENTRIES();
5049 /* {{{ PHP_MSHUTDOWN_FUNCTION
5051 static PHP_MSHUTDOWN_FUNCTION(pq
)
5053 /* uncomment this line if you have INI entries
5054 UNREGISTER_INI_ENTRIES();
5056 php_persistent_handle_cleanup(ZEND_STRL("pq\\Connection"), NULL
, 0 TSRMLS_CC
);
5061 /* {{{ PHP_MINFO_FUNCTION
5063 static PHP_MINFO_FUNCTION(pq
)
5065 #ifdef HAVE_PQLIBVERSION
5068 char libpq_version
[10] = "pre-9.1";
5070 php_info_print_table_start();
5071 php_info_print_table_header(2, "PQ Support", "enabled");
5072 php_info_print_table_row(2, "Extension Version", PHP_PQ_EXT_VERSION
);
5073 php_info_print_table_end();
5075 php_info_print_table_start();
5076 php_info_print_table_header(2, "Used Library", "Version");
5077 #ifdef HAVE_PQLIBVERSION
5078 libpq_v
= PQlibVersion();
5079 slprintf(libpq_version
, sizeof(libpq_version
), "%d.%d.%d", libpq_v
/10000%100, libpq_v
/100%100, libpq_v
%100);
5081 php_info_print_table_row(2, "libpq", libpq_version
);
5082 php_info_print_table_end();
5084 /* Remove comments if you have entries in php.ini
5085 DISPLAY_INI_ENTRIES();
5090 const zend_function_entry pq_functions
[] = {
5094 static zend_module_dep pq_module_deps
[] = {
5095 ZEND_MOD_REQUIRED("raphf")
5096 ZEND_MOD_REQUIRED("spl")
5100 /* {{{ pq_module_entry
5102 zend_module_entry pq_module_entry
= {
5103 STANDARD_MODULE_HEADER_EX
,
5110 NULL
,/*PHP_RINIT(pq),*/
5111 NULL
,/*PHP_RSHUTDOWN(pq),*/
5114 STANDARD_MODULE_PROPERTIES
5118 #ifdef COMPILE_DL_PQ
5128 * vim600: noet sw=4 ts=4 fdm=marker
5129 * vim<600: noet sw=4 ts=4