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)
58 /* Remove comments and fill if you need to have entries in php.ini
60 STD_PHP_INI_ENTRY("pq.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_pq_globals, pq_globals)
61 STD_PHP_INI_ENTRY("pq.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_pq_globals, pq_globals)
66 /* {{{ php_pq_init_globals
68 /* Uncomment this function if you have INI entries
69 static void php_pq_init_globals(zend_pq_globals *pq_globals)
71 pq_globals->global_value = 0;
72 pq_globals->global_string = NULL;
77 static zend_class_entry
*php_pqconn_class_entry
;
78 static zend_class_entry
*php_pqtypes_class_entry
;
79 static zend_class_entry
*php_pqres_class_entry
;
80 static zend_class_entry
*php_pqstm_class_entry
;
81 static zend_class_entry
*php_pqtxn_class_entry
;
82 static zend_class_entry
*php_pqcancel_class_entry
;
83 static zend_class_entry
*php_pqevent_class_entry
;
84 static zend_class_entry
*php_pqlob_class_entry
;
85 static zend_class_entry
*php_pqcopy_class_entry
;
87 static zend_object_handlers php_pqconn_object_handlers
;
88 static zend_object_handlers php_pqtypes_object_handlers
;
89 static zend_object_handlers php_pqres_object_handlers
;
90 static zend_object_handlers php_pqstm_object_handlers
;
91 static zend_object_handlers php_pqtxn_object_handlers
;
92 static zend_object_handlers php_pqcancel_object_handlers
;
93 static zend_object_handlers php_pqevent_object_handlers
;
94 static zend_object_handlers php_pqlob_object_handlers
;
95 static zend_object_handlers php_pqcopy_object_handlers
;
97 typedef struct php_pq_callback
{
99 zend_fcall_info_cache fcc
;
103 typedef struct php_pq_object
{
105 zend_object_value zv
;
106 HashTable
*prophandler
;
110 #define PHP_PQCONN_ASYNC 0x01
111 #define PHP_PQCONN_PERSISTENT 0x02
113 typedef struct php_pqconn
{
115 int (*poller
)(PGconn
*);
116 php_resource_factory_t factory
;
118 HashTable eventhandlers
;
119 php_pq_callback_t onevent
;
120 unsigned unbuffered
:1;
123 typedef struct php_pqconn_object
{
125 zend_object_value zv
;
126 HashTable
*prophandler
;
127 php_pqconn_t
*intern
;
128 } php_pqconn_object_t
;
130 typedef struct php_pqtypes
{
132 php_pqconn_object_t
*conn
;
135 typedef struct php_pqtypes_object
{
137 zend_object_value zv
;
138 HashTable
*prophandler
;
139 php_pqtypes_t
*intern
;
140 } php_pqtypes_object_t
;
142 typedef struct php_pqconn_event_data
{
143 php_pqconn_object_t
*obj
;
147 } php_pqconn_event_data_t
;
149 typedef enum php_pqres_fetch
{
150 PHP_PQRES_FETCH_ARRAY
,
151 PHP_PQRES_FETCH_ASSOC
,
152 PHP_PQRES_FETCH_OBJECT
155 typedef struct php_pqres_iterator
{
156 zend_object_iterator zi
;
159 php_pqres_fetch_t fetch_type
;
160 } php_pqres_iterator_t
;
162 typedef struct php_pqres
{
164 php_pqres_iterator_t
*iter
;
168 typedef struct php_pqres_object
{
170 zend_object_value zv
;
171 HashTable
*prophandler
;
173 } php_pqres_object_t
;
175 typedef struct php_pqstm
{
176 php_pqconn_object_t
*conn
;
181 typedef struct php_pqstm_object
{
183 zend_object_value zv
;
184 HashTable
*prophandler
;
186 } php_pqstm_object_t
;
188 typedef enum php_pqtxn_isolation
{
189 PHP_PQTXN_READ_COMMITTED
,
190 PHP_PQTXN_REPEATABLE_READ
,
191 PHP_PQTXN_SERIALIZABLE
,
192 } php_pqtxn_isolation_t
;
194 typedef struct php_pqtxn
{
195 php_pqconn_object_t
*conn
;
196 php_pqtxn_isolation_t isolation
;
199 unsigned deferrable
:1;
202 typedef struct php_pqtxn_object
{
204 zend_object_value zv
;
205 HashTable
*prophandler
;
207 } php_pqtxn_object_t
;
209 typedef struct php_pqcancel
{
211 php_pqconn_object_t
*conn
;
214 typedef struct php_pqcancel_object
{
216 zend_object_value zv
;
217 HashTable
*prophandler
;
218 php_pqcancel_t
*intern
;
219 } php_pqcancel_object_t
;
221 typedef struct php_pqevent
{
222 php_pq_callback_t cb
;
223 php_pqconn_object_t
*conn
;
227 typedef struct php_pqevent_object
{
229 zend_object_value zv
;
230 HashTable
*prophandler
;
231 php_pqevent_t
*intern
;
232 } php_pqevent_object_t
;
234 typedef struct php_pqlob
{
237 php_pqtxn_object_t
*txn
;
240 typedef struct php_pqlob_object
{
242 zend_object_value zv
;
243 HashTable
*prophandler
;
245 } php_pqlob_object_t
;
247 typedef enum php_pqcopy_direction
{
248 PHP_PQCOPY_FROM_STDIN
,
250 } php_pqcopy_direction_t
;
252 typedef enum php_pqcopy_status
{
256 } php_pqcopy_status_t
;
258 typedef struct php_pqcopy
{
259 php_pqcopy_direction_t direction
;
262 php_pqconn_object_t
*conn
;
265 typedef struct php_pqcopy_object
{
267 zend_object_value zv
;
268 HashTable
*prophandler
;
269 php_pqcopy_t
*intern
;
270 } php_pqcopy_object_t
;
272 static HashTable php_pqconn_object_prophandlers
;
273 static HashTable php_pqtypes_object_prophandlers
;
274 static HashTable php_pqres_object_prophandlers
;
275 static HashTable php_pqstm_object_prophandlers
;
276 static HashTable php_pqtxn_object_prophandlers
;
277 static HashTable php_pqcancel_object_prophandlers
;
278 static HashTable php_pqevent_object_prophandlers
;
279 static HashTable php_pqlob_object_prophandlers
;
280 static HashTable php_pqcopy_object_prophandlers
;
282 typedef void (*php_pq_object_prophandler_func_t
)(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
);
284 typedef struct php_pq_object_prophandler
{
285 php_pq_object_prophandler_func_t read
;
286 php_pq_object_prophandler_func_t write
;
287 } php_pq_object_prophandler_t
;
289 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
291 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
293 php_pqres_iterator_t
*iter
;
294 zval
*prop
, *zfetch_type
;
296 iter
= ecalloc(1, sizeof(*iter
));
297 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
298 iter
->zi
.data
= object
;
301 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
302 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
303 convert_to_long_ex(&zfetch_type
);
305 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
306 if (zfetch_type
!= prop
) {
307 zval_ptr_dtor(&zfetch_type
);
309 if (Z_REFCOUNT_P(prop
)) {
310 zval_ptr_dtor(&prop
);
316 return (zend_object_iterator
*) iter
;
319 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
321 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
323 if (iter
->current_val
) {
324 zval_ptr_dtor(&iter
->current_val
);
325 iter
->current_val
= NULL
;
327 zval_ptr_dtor((zval
**) &iter
->zi
.data
);
331 static STATUS
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
333 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
334 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
336 if (PQresultStatus(obj
->intern
->res
) != PGRES_TUPLES_OK
) {
339 if (PQntuples(obj
->intern
->res
) <= iter
->index
) {
346 static zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type
, zval
**data_ptr TSRMLS_DC
)
356 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
366 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
367 if (PQgetisnull(res
, row
, c
)) {
368 switch (fetch_type
) {
369 case PHP_PQRES_FETCH_OBJECT
:
370 add_property_null(data
, PQfname(res
, c
));
373 case PHP_PQRES_FETCH_ASSOC
:
374 add_assoc_null(data
, PQfname(res
, c
));
377 case PHP_PQRES_FETCH_ARRAY
:
378 add_index_null(data
, c
);
382 char *val
= PQgetvalue(res
, row
, c
);
383 int len
= PQgetlength(res
, row
, c
);
385 switch (fetch_type
) {
386 case PHP_PQRES_FETCH_OBJECT
:
387 add_property_stringl(data
, PQfname(res
, c
), val
, len
, 1);
390 case PHP_PQRES_FETCH_ASSOC
:
391 add_assoc_stringl(data
, PQfname(res
, c
), val
, len
, 1);
394 case PHP_PQRES_FETCH_ARRAY
:
395 add_index_stringl(data
, c
, val
, len
,1);
404 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
406 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
407 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
409 if (iter
->current_val
) {
410 zval_ptr_dtor(&iter
->current_val
);
412 iter
->current_val
= php_pqres_row_to_zval(obj
->intern
->res
, iter
->index
, iter
->fetch_type
, NULL TSRMLS_CC
);
413 *data_ptr
= &iter
->current_val
;
416 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
418 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
420 *key_num
= (ulong
) iter
->index
;
422 return HASH_KEY_IS_LONG
;
425 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
427 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
432 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
434 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
439 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
440 php_pqres_iterator_dtor
,
441 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
442 php_pqres_iterator_valid
,
443 /* fetch the item data for the current element */
444 php_pqres_iterator_current
,
445 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
446 php_pqres_iterator_key
,
447 /* step forwards to next element */
448 php_pqres_iterator_next
,
449 /* rewind to start of data (optional, may be NULL) */
450 php_pqres_iterator_rewind
,
451 /* invalidate current value/key (optional, may be NULL) */
455 static int php_pqres_count_elements(zval
*object
, long *count TSRMLS_DC
)
457 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
460 *count
= (long) PQntuples(obj
->intern
->res
);
467 static STATUS
php_pqres_success(PGresult
*res TSRMLS_DC
)
469 switch (PQresultStatus(res
)) {
470 case PGRES_BAD_RESPONSE
:
471 case PGRES_NONFATAL_ERROR
:
472 case PGRES_FATAL_ERROR
:
473 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "%s", PHP_PQresultErrorMessage(res
));
480 static void php_pq_callback_dtor(php_pq_callback_t
*cb
) {
481 if (cb
->fci
.size
> 0) {
482 zend_fcall_info_args_clear(&cb
->fci
, 1);
483 zval_ptr_dtor(&cb
->fci
.function_name
);
484 if (cb
->fci
.object_ptr
) {
485 zval_ptr_dtor(&cb
->fci
.object_ptr
);
491 static void php_pq_callback_addref(php_pq_callback_t
*cb
)
493 Z_ADDREF_P(cb
->fci
.function_name
);
494 if (cb
->fci
.object_ptr
) {
495 Z_ADDREF_P(cb
->fci
.object_ptr
);
499 static void php_pq_object_to_zval(void *o
, zval
**zv TSRMLS_DC
)
501 php_pq_object_t
*obj
= o
;
507 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
509 (*zv
)->type
= IS_OBJECT
;
510 (*zv
)->value
.obj
= obj
->zv
;
513 static void php_pq_object_addref(void *o TSRMLS_DC
)
515 php_pq_object_t
*obj
= o
;
516 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
519 static void php_pq_object_delref(void *o TSRMLS_DC
)
521 php_pq_object_t
*obj
= o
;
522 zend_objects_store_del_ref_by_handle_ex(obj
->zv
.handle
, obj
->zv
.handlers TSRMLS_CC
);
525 static void php_pqconn_object_free(void *o TSRMLS_DC
)
527 php_pqconn_object_t
*obj
= o
;
530 php_pqconn_event_data_t
*evdata
= PQinstanceData(obj
->intern
->conn
, php_pqconn_event
);
534 PQsetInstanceData(obj
->intern
->conn
, php_pqconn_event
, NULL
);
537 php_resource_factory_handle_dtor(&obj
->intern
->factory
, obj
->intern
->conn TSRMLS_CC
);
538 php_resource_factory_dtor(&obj
->intern
->factory
);
539 php_pq_callback_dtor(&obj
->intern
->onevent
);
540 zend_hash_destroy(&obj
->intern
->listeners
);
541 zend_hash_destroy(&obj
->intern
->eventhandlers
);
545 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
549 static void php_pqtypes_object_free(void *o TSRMLS_DC
)
551 php_pqtypes_object_t
*obj
= o
;
554 zend_hash_destroy(&obj
->intern
->types
);
555 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
559 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
563 static void php_pqres_object_free(void *o TSRMLS_DC
)
565 php_pqres_object_t
*obj
= o
;
568 if (obj
->intern
->res
) {
569 zval
*res
= PQresultInstanceData(obj
->intern
->res
, php_pqconn_event
);
571 if (1 == Z_REFCOUNT_P(res
)) {
572 PQresultSetInstanceData(obj
->intern
->res
, php_pqconn_event
, NULL
);
576 PQclear(obj
->intern
->res
);
577 obj
->intern
->res
= NULL
;
581 if (obj
->intern
->iter
) {
582 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
583 obj
->intern
->iter
= NULL
;
586 zend_hash_destroy(&obj
->intern
->bound
);
591 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
595 static void php_pqstm_object_free(void *o TSRMLS_DC
)
597 php_pqstm_object_t
*obj
= o
;
600 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
601 efree(obj
->intern
->name
);
602 zend_hash_destroy(&obj
->intern
->bound
);
606 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
610 static void php_pqtxn_object_free(void *o TSRMLS_DC
)
612 php_pqtxn_object_t
*obj
= o
;
615 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
619 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
623 static void php_pqcancel_object_free(void *o TSRMLS_DC
)
625 php_pqcancel_object_t
*obj
= o
;
628 PQfreeCancel(obj
->intern
->cancel
);
629 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
633 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
637 static void php_pqevent_object_free(void *o TSRMLS_DC
)
639 php_pqevent_object_t
*obj
= o
;
642 php_pq_callback_dtor(&obj
->intern
->cb
);
643 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
644 efree(obj
->intern
->type
);
648 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
652 static void php_pqlob_object_free(void *o TSRMLS_DC
)
654 php_pqlob_object_t
*obj
= o
;
657 if (obj
->intern
->lofd
) {
658 lo_close(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
660 php_pq_object_delref(obj
->intern
->txn TSRMLS_CC
);
664 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
668 static void php_pqcopy_object_free(void *o TSRMLS_DC
)
670 php_pqcopy_object_t
*obj
= o
;
673 efree(obj
->intern
->expression
);
674 efree(obj
->intern
->options
);
675 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
679 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
683 static zend_object_value
php_pqconn_create_object_ex(zend_class_entry
*ce
, php_pqconn_t
*intern
, php_pqconn_object_t
**ptr TSRMLS_DC
)
685 php_pqconn_object_t
*o
;
687 o
= ecalloc(1, sizeof(*o
));
688 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
689 object_properties_init((zend_object
*) o
, ce
);
690 o
->prophandler
= &php_pqconn_object_prophandlers
;
700 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqconn_object_free
, NULL TSRMLS_CC
);
701 o
->zv
.handlers
= &php_pqconn_object_handlers
;
706 static zend_object_value
php_pqtypes_create_object_ex(zend_class_entry
*ce
, php_pqtypes_t
*intern
, php_pqtypes_object_t
**ptr TSRMLS_DC
)
708 php_pqtypes_object_t
*o
;
710 o
= ecalloc(1, sizeof(*o
));
711 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
712 object_properties_init((zend_object
*) o
, ce
);
713 o
->prophandler
= &php_pqtypes_object_prophandlers
;
723 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtypes_object_free
, NULL TSRMLS_CC
);
724 o
->zv
.handlers
= &php_pqtypes_object_handlers
;
729 static zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, php_pqres_t
*intern
, php_pqres_object_t
**ptr TSRMLS_DC
)
731 php_pqres_object_t
*o
;
733 o
= ecalloc(1, sizeof(*o
));
734 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
735 object_properties_init((zend_object
*) o
, ce
);
736 o
->prophandler
= &php_pqres_object_prophandlers
;
746 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
747 o
->zv
.handlers
= &php_pqres_object_handlers
;
752 static zend_object_value
php_pqstm_create_object_ex(zend_class_entry
*ce
, php_pqstm_t
*intern
, php_pqstm_object_t
**ptr TSRMLS_DC
)
754 php_pqstm_object_t
*o
;
756 o
= ecalloc(1, sizeof(*o
));
757 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
758 object_properties_init((zend_object
*) o
, ce
);
759 o
->prophandler
= &php_pqstm_object_prophandlers
;
769 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqstm_object_free
, NULL TSRMLS_CC
);
770 o
->zv
.handlers
= &php_pqstm_object_handlers
;
775 static zend_object_value
php_pqtxn_create_object_ex(zend_class_entry
*ce
, php_pqtxn_t
*intern
, php_pqtxn_object_t
**ptr TSRMLS_DC
)
777 php_pqtxn_object_t
*o
;
779 o
= ecalloc(1, sizeof(*o
));
780 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
781 object_properties_init((zend_object
*) o
, ce
);
782 o
->prophandler
= &php_pqtxn_object_prophandlers
;
792 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtxn_object_free
, NULL TSRMLS_CC
);
793 o
->zv
.handlers
= &php_pqtxn_object_handlers
;
798 static zend_object_value
php_pqcancel_create_object_ex(zend_class_entry
*ce
, php_pqcancel_t
*intern
, php_pqcancel_object_t
**ptr TSRMLS_DC
)
800 php_pqcancel_object_t
*o
;
802 o
= ecalloc(1, sizeof(*o
));
803 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
804 object_properties_init((zend_object
*) o
, ce
);
805 o
->prophandler
= &php_pqcancel_object_prophandlers
;
815 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcancel_object_free
, NULL TSRMLS_CC
);
816 o
->zv
.handlers
= &php_pqcancel_object_handlers
;
821 static zend_object_value
php_pqevent_create_object_ex(zend_class_entry
*ce
, php_pqevent_t
*intern
, php_pqevent_object_t
**ptr TSRMLS_DC
)
823 php_pqevent_object_t
*o
;
825 o
= ecalloc(1, sizeof(*o
));
826 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
827 object_properties_init((zend_object
*) o
, ce
);
828 o
->prophandler
= &php_pqevent_object_prophandlers
;
838 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqevent_object_free
, NULL TSRMLS_CC
);
839 o
->zv
.handlers
= &php_pqevent_object_handlers
;
844 static zend_object_value
php_pqlob_create_object_ex(zend_class_entry
*ce
, php_pqlob_t
*intern
, php_pqlob_object_t
**ptr TSRMLS_DC
)
846 php_pqlob_object_t
*o
;
848 o
= ecalloc(1, sizeof(*o
));
849 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
850 object_properties_init((zend_object
*) o
, ce
);
851 o
->prophandler
= &php_pqlob_object_prophandlers
;
861 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqlob_object_free
, NULL TSRMLS_CC
);
862 o
->zv
.handlers
= &php_pqlob_object_handlers
;
867 static zend_object_value
php_pqcopy_create_object_ex(zend_class_entry
*ce
, php_pqcopy_t
*intern
, php_pqcopy_object_t
**ptr TSRMLS_DC
)
869 php_pqcopy_object_t
*o
;
871 o
= ecalloc(1, sizeof(*o
));
872 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
873 object_properties_init((zend_object
*) o
, ce
);
874 o
->prophandler
= &php_pqcopy_object_prophandlers
;
884 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcopy_object_free
, NULL TSRMLS_CC
);
885 o
->zv
.handlers
= &php_pqcopy_object_handlers
;
890 static zend_object_value
php_pqconn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
892 return php_pqconn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
895 static zend_object_value
php_pqtypes_create_object(zend_class_entry
*class_type TSRMLS_DC
)
897 return php_pqtypes_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
900 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
902 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
905 static zend_object_value
php_pqstm_create_object(zend_class_entry
*class_type TSRMLS_DC
)
907 return php_pqstm_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
910 static zend_object_value
php_pqtxn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
912 return php_pqtxn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
915 static zend_object_value
php_pqcancel_create_object(zend_class_entry
*class_type TSRMLS_DC
)
917 return php_pqcancel_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
920 static zend_object_value
php_pqevent_create_object(zend_class_entry
*class_type TSRMLS_DC
)
922 return php_pqevent_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
925 static zend_object_value
php_pqlob_create_object(zend_class_entry
*class_type TSRMLS_DC
)
927 return php_pqlob_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
930 static zend_object_value
php_pqcopy_create_object(zend_class_entry
*class_type TSRMLS_DC
)
932 return php_pqcopy_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
935 static int apply_ph_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
937 php_pq_object_prophandler_t
*ph
= p
;
938 HashTable
*ht
= va_arg(argv
, HashTable
*);
939 zval
**return_value
, *object
= va_arg(argv
, zval
*);
940 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
942 if (SUCCESS
== zend_hash_find(ht
, key
->arKey
, key
->nKeyLength
, (void *) &return_value
)) {
945 zval_ptr_dtor(return_value
);
946 MAKE_STD_ZVAL(*return_value
);
947 ZVAL_NULL(*return_value
);
949 ph
->read(object
, obj
, *return_value TSRMLS_CC
);
953 return ZEND_HASH_APPLY_KEEP
;
956 static int apply_pi_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
958 zend_property_info
*pi
= p
;
959 HashTable
*ht
= va_arg(argv
, HashTable
*);
960 zval
*object
= va_arg(argv
, zval
*);
961 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
962 zval
*property
= zend_read_property(obj
->zo
.ce
, object
, pi
->name
, pi
->name_length
, 0 TSRMLS_CC
);
964 if (1||!Z_REFCOUNT_P(property
)) {
965 Z_ADDREF_P(property
);
967 zend_hash_add(ht
, pi
->name
, pi
->name_length
+ 1, (void *) &property
, sizeof(zval
*), NULL
);
969 return ZEND_HASH_APPLY_KEEP
;
972 static HashTable
*php_pq_object_debug_info(zval
*object
, int *temp TSRMLS_DC
)
975 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
979 ZEND_INIT_SYMTABLE(ht
);
981 zend_hash_apply_with_arguments(&obj
->zo
.ce
->properties_info TSRMLS_CC
, apply_pi_to_debug
, 3, ht
, object
, obj
);
982 zend_hash_apply_with_arguments(obj
->prophandler TSRMLS_CC
, apply_ph_to_debug
, 3, ht
, object
, obj
);
987 static void php_pqconn_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
989 php_pqconn_object_t
*obj
= o
;
991 RETVAL_LONG(PQstatus(obj
->intern
->conn
));
994 static void php_pqconn_object_read_transaction_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
996 php_pqconn_object_t
*obj
= o
;
998 RETVAL_LONG(PQtransactionStatus(obj
->intern
->conn
));
1001 static void php_pqconn_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1003 php_pqconn_object_t
*obj
= o
;
1004 char *error
= PHP_PQerrorMessage(obj
->intern
->conn
);
1007 RETVAL_STRING(error
, 1);
1013 static int apply_notify_listener(void *p
, void *arg TSRMLS_DC
)
1015 php_pq_callback_t
*listener
= p
;
1016 PGnotify
*nfy
= arg
;
1017 zval
*zpid
, *zchannel
, *zmessage
;
1019 MAKE_STD_ZVAL(zpid
);
1020 ZVAL_LONG(zpid
, nfy
->be_pid
);
1021 MAKE_STD_ZVAL(zchannel
);
1022 ZVAL_STRING(zchannel
, nfy
->relname
, 1);
1023 MAKE_STD_ZVAL(zmessage
);
1024 ZVAL_STRING(zmessage
, nfy
->extra
, 1);
1026 zend_fcall_info_argn(&listener
->fci TSRMLS_CC
, 3, &zchannel
, &zmessage
, &zpid
);
1027 zend_fcall_info_call(&listener
->fci
, &listener
->fcc
, NULL
, NULL TSRMLS_CC
);
1029 zval_ptr_dtor(&zchannel
);
1030 zval_ptr_dtor(&zmessage
);
1031 zval_ptr_dtor(&zpid
);
1033 return ZEND_HASH_APPLY_KEEP
;
1036 static int apply_notify_listeners(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
1038 HashTable
*listeners
= p
;
1039 PGnotify
*nfy
= va_arg(argv
, PGnotify
*);
1041 if (0 == fnmatch(key
->arKey
, nfy
->relname
, 0)) {
1042 zend_hash_apply_with_argument(listeners
, apply_notify_listener
, nfy TSRMLS_CC
);
1045 return ZEND_HASH_APPLY_KEEP
;
1048 static void php_pqconn_notify_listeners(php_pqconn_object_t
*obj TSRMLS_DC
)
1052 while ((nfy
= PQnotifies(obj
->intern
->conn
))) {
1053 zend_hash_apply_with_arguments(&obj
->intern
->listeners TSRMLS_CC
, apply_notify_listeners
, 1, nfy
);
1058 static void php_pqconn_object_read_busy(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1060 php_pqconn_object_t
*obj
= o
;
1062 RETVAL_BOOL(PQisBusy(obj
->intern
->conn
));
1065 static void php_pqconn_object_read_encoding(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1067 php_pqconn_object_t
*obj
= o
;
1069 RETVAL_STRING(pg_encoding_to_char(PQclientEncoding(obj
->intern
->conn
)), 1);
1072 static void php_pqconn_object_write_encoding(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1074 php_pqconn_object_t
*obj
= o
;
1077 if (Z_TYPE_P(value
) != IS_STRING
) {
1078 convert_to_string_ex(&zenc
);
1081 if (0 > PQsetClientEncoding(obj
->intern
->conn
, Z_STRVAL_P(zenc
))) {
1082 zend_error(E_NOTICE
, "Unrecognized encoding '%s'", Z_STRVAL_P(zenc
));
1085 if (zenc
!= value
) {
1086 zval_ptr_dtor(&zenc
);
1090 static void php_pqconn_object_read_unbuffered(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1092 php_pqconn_object_t
*obj
= o
;
1094 RETVAL_BOOL(obj
->intern
->unbuffered
);
1097 static void php_pqconn_object_write_unbuffered(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1099 php_pqconn_object_t
*obj
= o
;
1101 obj
->intern
->unbuffered
= zend_is_true(value
);
1104 static void php_pqconn_object_read_db(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1106 php_pqconn_object_t
*obj
= o
;
1107 char *db
= PQdb(obj
->intern
->conn
);
1110 RETVAL_STRING(db
, 1);
1112 RETVAL_EMPTY_STRING();
1116 static void php_pqconn_object_read_user(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1118 php_pqconn_object_t
*obj
= o
;
1119 char *user
= PQuser(obj
->intern
->conn
);
1122 RETVAL_STRING(user
, 1);
1124 RETVAL_EMPTY_STRING();
1128 static void php_pqconn_object_read_pass(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1130 php_pqconn_object_t
*obj
= o
;
1131 char *pass
= PQpass(obj
->intern
->conn
);
1134 RETVAL_STRING(pass
, 1);
1136 RETVAL_EMPTY_STRING();
1140 static void php_pqconn_object_read_host(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1142 php_pqconn_object_t
*obj
= o
;
1143 char *host
= PQhost(obj
->intern
->conn
);
1146 RETVAL_STRING(host
, 1);
1148 RETVAL_EMPTY_STRING();
1152 static void php_pqconn_object_read_port(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1154 php_pqconn_object_t
*obj
= o
;
1155 char *port
= PQport(obj
->intern
->conn
);
1158 RETVAL_STRING(port
, 1);
1160 RETVAL_EMPTY_STRING();
1164 static void php_pqconn_object_read_options(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1166 php_pqconn_object_t
*obj
= o
;
1167 char *options
= PQoptions(obj
->intern
->conn
);
1170 RETVAL_STRING(options
, 1);
1172 RETVAL_EMPTY_STRING();
1176 static void php_pqtypes_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1178 php_pqtypes_object_t
*obj
= o
;
1180 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1183 static int has_dimension(HashTable
*ht
, zval
*member
, char **key_str
, int *key_len
, long *index TSRMLS_DC
)
1188 switch (Z_TYPE_P(member
)) {
1190 convert_to_string_ex(&tmp
);
1193 if (!is_numeric_string(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
), &lval
, NULL
, 0)) {
1194 if (member
!= tmp
) {
1195 zval_ptr_dtor(&tmp
);
1198 *key_str
= estrndup(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
));
1200 *key_len
= Z_STRLEN_P(tmp
) + 1;
1203 return zend_hash_exists(ht
, Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
) + 1);
1207 lval
= Z_LVAL_P(member
);
1211 if (member
!= tmp
) {
1212 zval_ptr_dtor(&tmp
);
1217 return zend_hash_index_exists(ht
, lval
);
1220 static int php_pqtypes_object_has_dimension(zval
*object
, zval
*member
, int check_empty TSRMLS_DC
)
1222 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1223 char *key_str
= NULL
;
1228 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1231 if (key_str
&& key_len
) {
1232 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1234 return Z_TYPE_PP(data
) != IS_NULL
;
1238 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) data
)) {
1239 return Z_TYPE_PP(data
) != IS_NULL
;
1244 return has_dimension(&obj
->intern
->types
, member
, NULL
, NULL
, NULL TSRMLS_CC
);
1250 static zval
*php_pqtypes_object_read_dimension(zval
*object
, zval
*member
, int type TSRMLS_DC
)
1253 char *key_str
= NULL
;
1255 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1257 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1260 if (key_str
&& key_len
) {
1261 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1266 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) &data
)) {
1275 static void php_pqres_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1277 php_pqres_object_t
*obj
= o
;
1279 RETVAL_LONG(PQresultStatus(obj
->intern
->res
));
1282 static void php_pqres_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1284 php_pqres_object_t
*obj
= o
;
1285 char *error
= PHP_PQresultErrorMessage(obj
->intern
->res
);
1288 RETVAL_STRING(error
, 1);
1294 static void php_pqres_object_read_num_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1296 php_pqres_object_t
*obj
= o
;
1298 RETVAL_LONG(PQntuples(obj
->intern
->res
));
1301 static void php_pqres_object_read_num_cols(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1303 php_pqres_object_t
*obj
= o
;
1305 RETVAL_LONG(PQnfields(obj
->intern
->res
));
1308 static void php_pqres_object_read_affected_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1310 php_pqres_object_t
*obj
= o
;
1312 RETVAL_LONG(atoi(PQcmdTuples(obj
->intern
->res
)));
1315 static void php_pqres_object_read_fetch_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1317 php_pqres_object_t
*obj
= o
;
1319 if (obj
->intern
->iter
) {
1320 RETVAL_LONG(obj
->intern
->iter
->fetch_type
);
1322 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
1326 static void php_pqres_object_write_fetch_type(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1328 php_pqres_object_t
*obj
= o
;
1329 zval
*zfetch_type
= value
;
1331 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
1332 convert_to_long_ex(&zfetch_type
);
1335 if (!obj
->intern
->iter
) {
1336 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
1337 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
1339 obj
->intern
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
1341 if (zfetch_type
!= value
) {
1342 zval_ptr_dtor(&zfetch_type
);
1346 static void php_pqstm_object_read_name(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1348 php_pqstm_object_t
*obj
= o
;
1350 RETVAL_STRING(obj
->intern
->name
, 1);
1353 static void php_pqstm_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1355 php_pqstm_object_t
*obj
= o
;
1357 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1360 static void php_pqtxn_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1362 php_pqtxn_object_t
*obj
= o
;
1364 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1367 static void php_pqtxn_object_read_isolation(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1369 php_pqtxn_object_t
*obj
= o
;
1371 RETVAL_LONG(obj
->intern
->isolation
);
1374 static void php_pqtxn_object_read_readonly(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1376 php_pqtxn_object_t
*obj
= o
;
1378 RETVAL_LONG(obj
->intern
->readonly
);
1381 static void php_pqtxn_object_read_deferrable(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1383 php_pqtxn_object_t
*obj
= o
;
1385 RETVAL_LONG(obj
->intern
->deferrable
);
1388 static void php_pqtxn_object_write_isolation(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1390 php_pqtxn_object_t
*obj
= o
;
1391 php_pqtxn_isolation_t orig
= obj
->intern
->isolation
;
1392 zval
*zisolation
= value
;
1395 if (Z_TYPE_P(zisolation
) != IS_LONG
) {
1396 convert_to_long_ex(&zisolation
);
1399 switch ((obj
->intern
->isolation
= Z_LVAL_P(zisolation
))) {
1400 case PHP_PQTXN_READ_COMMITTED
:
1401 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ COMMITED");
1403 case PHP_PQTXN_REPEATABLE_READ
:
1404 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION REPEATABLE READ");
1406 case PHP_PQTXN_SERIALIZABLE
:
1407 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION SERIALIZABLE");
1410 obj
->intern
->isolation
= orig
;
1415 if (zisolation
!= value
) {
1416 zval_ptr_dtor(&zisolation
);
1420 php_pqres_success(res TSRMLS_CC
);
1425 static void php_pqtxn_object_write_readonly(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1427 php_pqtxn_object_t
*obj
= o
;
1430 if ((obj
->intern
->readonly
= zend_is_true(value
))) {
1431 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ ONLY");
1433 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ WRITE");
1437 php_pqres_success(res TSRMLS_CC
);
1442 static void php_pqtxn_object_write_deferrable(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1444 php_pqtxn_object_t
*obj
= o
;
1447 if ((obj
->intern
->deferrable
= zend_is_true(value
))) {
1448 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION DEFERRABLE");
1450 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION NOT DEFERRABLE");
1454 php_pqres_success(res TSRMLS_CC
);
1459 static void php_pqcancel_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1461 php_pqcancel_object_t
*obj
= o
;
1463 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1466 static void php_pqevent_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1468 php_pqevent_object_t
*obj
= o
;
1470 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1473 static void php_pqevent_object_read_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1475 php_pqevent_object_t
*obj
= o
;
1477 RETVAL_STRING(obj
->intern
->type
, 1);
1480 static void php_pqlob_object_read_transaction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1482 php_pqlob_object_t
*obj
= o
;
1484 php_pq_object_to_zval(obj
->intern
->txn
, &return_value TSRMLS_CC
);
1487 static void php_pqlob_object_read_oid(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1489 php_pqlob_object_t
*obj
= o
;
1491 RETVAL_LONG(obj
->intern
->loid
);
1494 static void php_pqcopy_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1496 php_pqcopy_object_t
*obj
= o
;
1498 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1501 static void php_pqcopy_object_read_direction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1503 php_pqcopy_object_t
*obj
= o
;
1505 RETVAL_LONG(obj
->intern
->direction
);
1508 static void php_pqcopy_object_read_expression(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1510 php_pqcopy_object_t
*obj
= o
;
1512 RETURN_STRING(obj
->intern
->expression
, 1);
1515 static void php_pqcopy_object_read_options(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1517 php_pqcopy_object_t
*obj
= o
;
1519 RETURN_STRING(obj
->intern
->options
, 1);
1522 static zend_class_entry
*ancestor(zend_class_entry
*ce
) {
1523 while (ce
->parent
) {
1529 static zval
*php_pq_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
1531 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1532 php_pq_object_prophandler_t
*handler
;
1536 zend_error(E_WARNING
, "%s not initialized", ancestor(obj
->zo
.ce
)->name
);
1537 } else if ((SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) && handler
->read
) {
1538 if (type
== BP_VAR_R
) {
1539 ALLOC_ZVAL(return_value
);
1540 Z_SET_REFCOUNT_P(return_value
, 0);
1541 Z_UNSET_ISREF_P(return_value
);
1543 handler
->read(object
, obj
, return_value TSRMLS_CC
);
1545 zend_error(E_ERROR
, "Cannot access %s properties by reference or array key/index", ancestor(obj
->zo
.ce
)->name
);
1546 return_value
= NULL
;
1549 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
1552 return return_value
;
1555 static void php_pq_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
1557 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1558 php_pq_object_prophandler_t
*handler
;
1560 if (SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
1561 if (handler
->write
) {
1562 handler
->write(object
, obj
, value TSRMLS_CC
);
1565 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
1569 static STATUS
php_pqconn_update_socket(zval
*this_ptr
, php_pqconn_object_t
*obj TSRMLS_DC
)
1571 zval
*zsocket
, zmember
;
1577 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1580 INIT_PZVAL(&zmember
);
1581 ZVAL_STRINGL(&zmember
, "socket", sizeof("socket")-1, 0);
1582 MAKE_STD_ZVAL(zsocket
);
1584 if ((CONNECTION_BAD
!= PQstatus(obj
->intern
->conn
))
1585 && (-1 < (socket
= PQsocket(obj
->intern
->conn
)))
1586 && (stream
= php_stream_fopen_from_fd(socket
, "r+b", NULL
))) {
1587 php_stream_to_zval(stream
, zsocket
);
1593 zend_get_std_object_handlers()->write_property(getThis(), &zmember
, zsocket
, NULL TSRMLS_CC
);
1594 zval_ptr_dtor(&zsocket
);
1600 # define TSRMLS_DF(d) TSRMLS_D = (d)->ts
1601 # define TSRMLS_CF(d) (d)->ts = TSRMLS_C
1603 # define TSRMLS_DF(d)
1604 # define TSRMLS_CF(d)
1607 static int apply_event(void *p
, void *a TSRMLS_DC
)
1611 zval
*retval
= NULL
;
1613 zend_call_method_with_1_params(evh
, Z_OBJCE_PP(evh
), NULL
, "trigger", &retval
, args
);
1615 zval_ptr_dtor(&retval
);
1618 return ZEND_HASH_APPLY_KEEP
;
1621 static void php_pqconn_event_connreset(PGEventConnReset
*event
, php_pqconn_event_data_t
*data
)
1626 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("reset"), (void *) &evhs
)) {
1627 zval
*args
, *connection
= NULL
;
1629 MAKE_STD_ZVAL(args
);
1631 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1632 add_next_index_zval(args
, connection
);
1633 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1634 zval_ptr_dtor(&args
);
1638 static zval
*result_instance_zval(PGresult
*res TSRMLS_DC
)
1640 zval
*rid
= PQresultInstanceData(res
, php_pqconn_event
);
1643 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1647 ZEND_INIT_SYMTABLE(&r
->bound
);
1648 rid
->type
= IS_OBJECT
;
1649 rid
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1651 PQresultSetInstanceData(res
, php_pqconn_event
, rid
);
1658 static void php_pqconn_event_resultcreate(PGEventResultCreate
*event
, php_pqconn_event_data_t
*data
)
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
);
1686 static int php_pqconn_event(PGEventId id
, void *e
, void *data
)
1689 case PGEVT_CONNRESET
:
1690 php_pqconn_event_connreset(e
, data
);
1692 case PGEVT_RESULTCREATE
:
1693 php_pqconn_event_resultcreate(e
, data
);
1702 static php_pqconn_event_data_t
*php_pqconn_event_data_init(php_pqconn_object_t
*obj TSRMLS_DC
)
1704 php_pqconn_event_data_t
*data
= emalloc(sizeof(*data
));
1712 static void php_pqconn_notice_recv(void *p
, const PGresult
*res
)
1714 php_pqconn_event_data_t
*data
= p
;
1718 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("notice"), (void *) &evhs
)) {
1719 zval
*args
, *connection
= NULL
;
1721 MAKE_STD_ZVAL(args
);
1723 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1724 add_next_index_zval(args
, connection
);
1725 add_next_index_string(args
, PHP_PQresultErrorMessage(res
), 1);
1726 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1727 zval_ptr_dtor(&args
);
1731 typedef struct php_pqconn_resource_factory_data
{
1734 } php_pqconn_resource_factory_data_t
;
1736 static void *php_pqconn_resource_factory_ctor(void *data
, void *init_arg TSRMLS_DC
)
1738 php_pqconn_resource_factory_data_t
*o
= init_arg
;
1740 if (o
->flags
& PHP_PQCONN_ASYNC
) {
1741 return PQconnectStart(o
->dsn
);
1743 return PQconnectdb(o
->dsn
);
1747 static void php_pqconn_resource_factory_dtor(void *opaque
, void *handle TSRMLS_DC
)
1752 static php_resource_factory_ops_t php_pqconn_resource_factory_ops
= {
1753 php_pqconn_resource_factory_ctor
,
1755 php_pqconn_resource_factory_dtor
1758 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
1759 ZEND_ARG_INFO(0, dsn
)
1760 ZEND_ARG_INFO(0, async
)
1761 ZEND_END_ARG_INFO();
1762 static PHP_METHOD(pqconn
, __construct
) {
1763 zend_error_handling zeh
;
1768 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1769 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|sl", &dsn_str
, &dsn_len
, &flags
)) {
1770 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1771 php_pqconn_event_data_t
*evdata
= php_pqconn_event_data_init(obj TSRMLS_CC
);
1772 php_pqconn_resource_factory_data_t rfdata
= {dsn_str
, flags
};
1774 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
1776 zend_hash_init(&obj
->intern
->listeners
, 0, NULL
, (dtor_func_t
) zend_hash_destroy
, 0);
1777 zend_hash_init(&obj
->intern
->eventhandlers
, 0, NULL
, ZVAL_PTR_DTOR
, 0);
1779 if (flags
& PHP_PQCONN_PERSISTENT
) {
1780 php_persistent_handle_factory_t
*phf
= php_persistent_handle_concede(NULL
, ZEND_STRL("pq\\Connection"), dsn_str
, dsn_len TSRMLS_CC
);
1781 php_resource_factory_init(&obj
->intern
->factory
, php_persistent_handle_get_resource_factory_ops(), phf
, (void (*)(void*)) php_persistent_handle_abandon
);
1783 php_resource_factory_init(&obj
->intern
->factory
, &php_pqconn_resource_factory_ops
, NULL
, NULL
);
1785 if (flags
& PHP_PQCONN_ASYNC
) {
1786 obj
->intern
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
1789 obj
->intern
->conn
= php_resource_factory_handle_ctor(&obj
->intern
->factory
, &rfdata TSRMLS_CC
);
1791 PQregisterEventProc(obj
->intern
->conn
, php_pqconn_event
, "ext-pq", evdata
);
1792 /* the connection might be persistent, so reset event_proc instance data */
1793 PQsetInstanceData(obj
->intern
->conn
, php_pqconn_event
, evdata
);
1794 PQsetNoticeReceiver(obj
->intern
->conn
, php_pqconn_notice_recv
, evdata
);
1796 if (SUCCESS
!= php_pqconn_update_socket(getThis(), obj TSRMLS_CC
)) {
1797 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1800 zend_restore_error_handling(&zeh TSRMLS_CC
);
1803 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
1804 ZEND_END_ARG_INFO();
1805 static PHP_METHOD(pqconn
, reset
) {
1806 if (SUCCESS
== zend_parse_parameters_none()) {
1807 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1810 PQreset(obj
->intern
->conn
);
1812 if (CONNECTION_OK
== PQstatus(obj
->intern
->conn
)) {
1815 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection reset failed: (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1818 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1824 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset_async
, 0, 0, 0)
1825 ZEND_END_ARG_INFO();
1826 static PHP_METHOD(pqconn
, resetAsync
) {
1827 if (SUCCESS
== zend_parse_parameters_none()) {
1828 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1831 if (PQresetStart(obj
->intern
->conn
)) {
1832 obj
->intern
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
1836 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1842 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
)
1844 HashTable ht
, *existing_listeners
;
1846 php_pq_callback_addref(listener
);
1848 if (SUCCESS
== zend_hash_find(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &existing_listeners
)) {
1849 zend_hash_next_index_insert(existing_listeners
, (void *) listener
, sizeof(*listener
), NULL
);
1851 zend_hash_init(&ht
, 1, NULL
, (dtor_func_t
) php_pq_callback_dtor
, 0);
1852 zend_hash_next_index_insert(&ht
, (void *) listener
, sizeof(*listener
), NULL
);
1853 zend_hash_add(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &ht
, sizeof(HashTable
), NULL
);
1857 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_listen
, 0, 0, 0)
1858 ZEND_ARG_INFO(0, channel
)
1859 ZEND_ARG_INFO(0, callable
)
1860 ZEND_END_ARG_INFO();
1861 static PHP_METHOD(pqconn
, listen
) {
1862 char *channel_str
= NULL
;
1863 int channel_len
= 0;
1864 php_pq_callback_t listener
;
1866 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sf", &channel_str
, &channel_len
, &listener
.fci
, &listener
.fcc
)) {
1867 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1869 obj
->intern
->poller
= PQconsumeInput
;
1872 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, channel_str
, channel_len
);
1874 if (quoted_channel
) {
1878 spprintf(&cmd
, 0, "LISTEN %s", channel_str
);
1879 res
= PQexec(obj
->intern
->conn
, cmd
);
1882 PQfreemem(quoted_channel
);
1885 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1886 php_pqconn_add_listener(obj
, channel_str
, channel_len
, &listener TSRMLS_CC
);
1893 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not install listener (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1897 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1899 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape channel identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1902 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1908 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_listen_async
, 0, 0, 0)
1909 ZEND_ARG_INFO(0, channel
)
1910 ZEND_ARG_INFO(0, callable
)
1911 ZEND_END_ARG_INFO();
1912 static PHP_METHOD(pqconn
, listenAsync
) {
1913 char *channel_str
= NULL
;
1914 int channel_len
= 0;
1915 php_pq_callback_t listener
;
1917 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sf", &channel_str
, &channel_len
, &listener
.fci
, &listener
.fcc
)) {
1918 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1920 obj
->intern
->poller
= PQconsumeInput
;
1923 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, channel_str
, channel_len
);
1925 if (quoted_channel
) {
1928 obj
->intern
->poller
= PQconsumeInput
;
1930 spprintf(&cmd
, 0, "LISTEN %s", channel_str
);
1931 if (PQsendQuery(obj
->intern
->conn
, cmd
)) {
1932 php_pqconn_add_listener(obj
, channel_str
, channel_len
, &listener TSRMLS_CC
);
1935 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not install listener (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1940 PQfreemem(quoted_channel
);
1942 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1944 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape channel identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1947 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1953 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_notify
, 0, 0, 2)
1954 ZEND_ARG_INFO(0, channel
)
1955 ZEND_ARG_INFO(0, message
)
1956 ZEND_END_ARG_INFO();
1957 static PHP_METHOD(pqconn
, notify
) {
1958 char *channel_str
, *message_str
;
1959 int channel_len
, message_len
;
1961 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &channel_str
, &channel_len
, &message_str
, &message_len
)) {
1962 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1966 char *params
[2] = {channel_str
, message_str
};
1968 res
= PQexecParams(obj
->intern
->conn
, "select pg_notify($1, $2)", 2, NULL
, (const char *const*) params
, NULL
, NULL
, 0);
1971 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1978 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not notify listeners (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1982 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1985 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1991 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_notify_async
, 0, 0, 2)
1992 ZEND_ARG_INFO(0, channel
)
1993 ZEND_ARG_INFO(0, message
)
1994 ZEND_END_ARG_INFO();
1995 static PHP_METHOD(pqconn
, notifyAsync
) {
1996 char *channel_str
, *message_str
;
1997 int channel_len
, message_len
;
1999 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &channel_str
, &channel_len
, &message_str
, &message_len
)) {
2000 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2003 char *params
[2] = {channel_str
, message_str
};
2005 obj
->intern
->poller
= PQconsumeInput
;
2007 if (PQsendQueryParams(obj
->intern
->conn
, "select pg_notify($1, $2)", 2, NULL
, (const char *const*) params
, NULL
, NULL
, 0)) {
2010 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not notify listeners (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2014 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2017 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2023 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
2024 ZEND_END_ARG_INFO();
2025 static PHP_METHOD(pqconn
, poll
) {
2026 if (SUCCESS
== zend_parse_parameters_none()) {
2027 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2030 if (obj
->intern
->poller
) {
2031 if (obj
->intern
->poller
== PQconsumeInput
) {
2032 RETVAL_LONG(obj
->intern
->poller(obj
->intern
->conn
) * PGRES_POLLING_OK
);
2033 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2036 RETURN_LONG(obj
->intern
->poller(obj
->intern
->conn
));
2039 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
2042 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2048 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
2049 ZEND_ARG_INFO(0, query
)
2050 ZEND_END_ARG_INFO();
2051 static PHP_METHOD(pqconn
, exec
) {
2052 zend_error_handling zeh
;
2056 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2057 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
2058 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2061 PGresult
*res
= PQexec(obj
->intern
->conn
, query_str
);
2063 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2066 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2067 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2070 ZEND_INIT_SYMTABLE(&r
->bound
);
2071 return_value
->type
= IS_OBJECT
;
2072 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2075 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2078 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2081 zend_restore_error_handling(&zeh TSRMLS_CC
);
2084 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_get_result
, 0, 0, 0)
2085 ZEND_END_ARG_INFO();
2086 static PHP_METHOD(pqconn
, getResult
) {
2087 if (SUCCESS
== zend_parse_parameters_none()) {
2088 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2091 PGresult
*res
= PQgetResult(obj
->intern
->conn
);
2094 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2097 ZEND_INIT_SYMTABLE(&r
->bound
);
2098 return_value
->type
= IS_OBJECT
;
2099 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2104 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2110 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_async
, 0, 0, 1)
2111 ZEND_ARG_INFO(0, query
)
2112 ZEND_ARG_INFO(0, callable
)
2113 ZEND_END_ARG_INFO();
2114 static PHP_METHOD(pqconn
, execAsync
) {
2115 zend_error_handling zeh
;
2116 php_pq_callback_t resolver
= {{0}};
2120 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2121 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|f", &query_str
, &query_len
, &resolver
.fci
, &resolver
.fcc
)) {
2122 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2125 php_pq_callback_dtor(&obj
->intern
->onevent
);
2126 if (resolver
.fci
.size
> 0) {
2127 obj
->intern
->onevent
= resolver
;
2128 php_pq_callback_addref(&obj
->intern
->onevent
);
2131 obj
->intern
->poller
= PQconsumeInput
;
2133 if (PQsendQuery(obj
->intern
->conn
, query_str
)) {
2134 if (obj
->intern
->unbuffered
) {
2135 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2136 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2141 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2145 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2149 zend_restore_error_handling(&zeh TSRMLS_CC
);
2152 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
2157 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
2158 convert_to_long_ex(ztype
);
2161 **types
= Z_LVAL_PP(ztype
);
2164 if (*ztype
!= *(zval
**)p
) {
2165 zval_ptr_dtor(ztype
);
2167 return ZEND_HASH_APPLY_KEEP
;
2170 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
2176 params
= (char ***) va_arg(argv
, char ***);
2177 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
2179 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
2183 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
2184 convert_to_string_ex(zparam
);
2187 **params
= Z_STRVAL_PP(zparam
);
2190 if (*zparam
!= *(zval
**)p
) {
2191 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
2194 return ZEND_HASH_APPLY_KEEP
;
2197 static int php_pq_types_to_array(HashTable
*ht
, Oid
**types TSRMLS_DC
)
2199 int count
= zend_hash_num_elements(ht
);
2206 /* +1 for when less types than params are specified */
2207 *types
= tmp
= ecalloc(count
+ 1, sizeof(Oid
));
2208 zend_hash_apply_with_argument(ht
, apply_to_oid
, &tmp TSRMLS_CC
);
2214 static int php_pq_params_to_array(HashTable
*ht
, char ***params
, HashTable
*zdtor TSRMLS_DC
)
2216 int count
= zend_hash_num_elements(ht
);
2223 *params
= tmp
= ecalloc(count
, sizeof(char *));
2224 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_param
, 2, &tmp
, zdtor
);
2230 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
2231 ZEND_ARG_INFO(0, query
)
2232 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2233 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2234 ZEND_END_ARG_INFO();
2235 static PHP_METHOD(pqconn
, execParams
) {
2236 zend_error_handling zeh
;
2240 zval
*ztypes
= NULL
;
2242 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2243 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
2244 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2250 char **params
= NULL
;
2253 ZEND_INIT_SYMTABLE(&zdtor
);
2254 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2257 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2260 res
= PQexecParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0);
2262 zend_hash_destroy(&zdtor
);
2270 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2273 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2274 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2277 ZEND_INIT_SYMTABLE(&r
->bound
);
2278 return_value
->type
= IS_OBJECT
;
2279 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2282 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2286 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2290 zend_restore_error_handling(&zeh TSRMLS_CC
);
2293 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params_async
, 0, 0, 2)
2294 ZEND_ARG_INFO(0, query
)
2295 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2296 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2297 ZEND_ARG_INFO(0, callable
)
2298 ZEND_END_ARG_INFO();
2299 static PHP_METHOD(pqconn
, execParamsAsync
) {
2300 zend_error_handling zeh
;
2301 php_pq_callback_t resolver
= {{0}};
2305 zval
*ztypes
= NULL
;
2307 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2308 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!f", &query_str
, &query_len
, &zparams
, &ztypes
, &resolver
.fci
, &resolver
.fcc
)) {
2309 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2314 char **params
= NULL
;
2317 ZEND_INIT_SYMTABLE(&zdtor
);
2318 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2321 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2324 php_pq_callback_dtor(&obj
->intern
->onevent
);
2325 if (resolver
.fci
.size
> 0) {
2326 obj
->intern
->onevent
= resolver
;
2327 php_pq_callback_addref(&obj
->intern
->onevent
);
2330 obj
->intern
->poller
= PQconsumeInput
;
2332 if (PQsendQueryParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0)) {
2333 if (obj
->intern
->unbuffered
) {
2334 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2335 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2340 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2344 zend_hash_destroy(&zdtor
);
2352 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2355 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2359 zend_restore_error_handling(&zeh TSRMLS_CC
);
2362 static STATUS
php_pqconn_prepare(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2370 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2374 count
= zend_hash_num_elements(typest
);
2375 php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2378 res
= PQprepare(obj
->intern
->conn
, name
, query
, count
, types
);
2385 rv
= php_pqres_success(res TSRMLS_CC
);
2389 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2395 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
2396 ZEND_ARG_INFO(0, type
)
2397 ZEND_ARG_INFO(0, query
)
2398 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2399 ZEND_END_ARG_INFO();
2400 static PHP_METHOD(pqconn
, prepare
) {
2401 zend_error_handling zeh
;
2402 zval
*ztypes
= NULL
;
2403 char *name_str
, *query_str
;
2404 int name_len
, *query_len
;
2406 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2407 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2408 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2411 if (SUCCESS
== php_pqconn_prepare(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2412 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2414 php_pq_object_addref(obj TSRMLS_CC
);
2416 stm
->name
= estrdup(name_str
);
2417 ZEND_INIT_SYMTABLE(&stm
->bound
);
2419 return_value
->type
= IS_OBJECT
;
2420 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2422 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2424 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2427 zend_restore_error_handling(&zeh TSRMLS_CC
);
2430 static STATUS
php_pqconn_prepare_async(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2437 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2441 count
= php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2444 if (PQsendPrepare(obj
->intern
->conn
, name
, query
, count
, types
)) {
2445 if (obj
->intern
->unbuffered
) {
2446 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2447 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2452 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2463 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare_async
, 0, 0, 2)
2464 ZEND_ARG_INFO(0, type
)
2465 ZEND_ARG_INFO(0, query
)
2466 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2467 ZEND_END_ARG_INFO();
2468 static PHP_METHOD(pqconn
, prepareAsync
) {
2469 zend_error_handling zeh
;
2470 zval
*ztypes
= NULL
;
2471 char *name_str
, *query_str
;
2472 int name_len
, *query_len
;
2474 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2475 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2476 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2479 obj
->intern
->poller
= PQconsumeInput
;
2480 if (SUCCESS
== php_pqconn_prepare_async(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2481 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2483 php_pq_object_addref(obj TSRMLS_CC
);
2485 stm
->name
= estrdup(name_str
);
2486 ZEND_INIT_SYMTABLE(&stm
->bound
);
2488 return_value
->type
= IS_OBJECT
;
2489 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2491 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2493 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2496 zend_restore_error_handling(&zeh TSRMLS_CC
);
2499 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote
, 0, 0, 1)
2500 ZEND_ARG_INFO(0, string
)
2501 ZEND_END_ARG_INFO();
2502 static PHP_METHOD(pqconn
, quote
) {
2506 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2507 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2510 char *quoted
= PQescapeLiteral(obj
->intern
->conn
, str
, len
);
2513 RETVAL_STRING(quoted
, 1);
2516 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote string (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2520 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2526 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote_name
, 0, 0, 1)
2527 ZEND_ARG_INFO(0, type
)
2528 ZEND_END_ARG_INFO();
2529 static PHP_METHOD(pqconn
, quoteName
) {
2533 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2534 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2537 char *quoted
= PQescapeIdentifier(obj
->intern
->conn
, str
, len
);
2540 RETVAL_STRING(quoted
, 1);
2543 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote name (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2547 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2553 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_escape_bytea
, 0, 0, 1)
2554 ZEND_ARG_INFO(0, bytea
)
2555 ZEND_END_ARG_INFO();
2556 static PHP_METHOD(pqconn
, escapeBytea
) {
2560 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2561 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2565 char *escaped_str
= (char *) PQescapeByteaConn(obj
->intern
->conn
, (unsigned char *) str
, len
, &escaped_len
);
2568 RETVAL_STRINGL(escaped_str
, escaped_len
- 1, 1);
2569 PQfreemem(escaped_str
);
2571 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2575 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2581 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_unescape_bytea
, 0, 0, 1)
2582 ZEND_ARG_INFO(0, bytea
)
2583 ZEND_END_ARG_INFO();
2584 static PHP_METHOD(pqconn
, unescapeBytea
) {
2588 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2589 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2592 size_t unescaped_len
;
2593 char *unescaped_str
= (char *) PQunescapeBytea((unsigned char *)str
, &unescaped_len
);
2595 if (unescaped_str
) {
2596 RETVAL_STRINGL(unescaped_str
, unescaped_len
, 1);
2597 PQfreemem(unescaped_str
);
2599 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not unescape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2603 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2609 static const char *isolation_level(long *isolation
) {
2610 switch (*isolation
) {
2611 case PHP_PQTXN_SERIALIZABLE
:
2612 return "SERIALIZABLE";
2613 case PHP_PQTXN_REPEATABLE_READ
:
2614 return "REPEATABLE READ";
2616 *isolation
= PHP_PQTXN_READ_COMMITTED
;
2618 case PHP_PQTXN_READ_COMMITTED
:
2619 return "READ COMMITTED";
2623 static STATUS
php_pqconn_start_transaction(zval
*zconn
, php_pqconn_object_t
*conn_obj
, long isolation
, zend_bool readonly
, zend_bool deferrable TSRMLS_DC
)
2626 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2629 if (conn_obj
->intern
) {
2633 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2634 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2636 res
= PQexec(conn_obj
->intern
->conn
, cmd
);
2641 STATUS rv
= php_pqres_success(res TSRMLS_CC
);
2646 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2650 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2655 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
)
2658 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2661 if (conn_obj
->intern
->conn
) {
2664 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2665 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2667 if (PQsendQuery(conn_obj
->intern
->conn
, cmd
)) {
2668 conn_obj
->intern
->poller
= PQconsumeInput
;
2673 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2677 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2682 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction
, 0, 0, 0)
2683 ZEND_ARG_INFO(0, isolation
)
2684 ZEND_ARG_INFO(0, readonly
)
2685 ZEND_ARG_INFO(0, deferrable
)
2686 ZEND_END_ARG_INFO();
2687 static PHP_METHOD(pqconn
, startTransaction
) {
2688 zend_error_handling zeh
;
2689 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2690 zend_bool readonly
= 0, deferrable
= 0;
2692 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2693 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2695 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2697 rv
= php_pqconn_start_transaction(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2699 if (SUCCESS
== rv
) {
2700 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2702 php_pq_object_addref(obj TSRMLS_CC
);
2704 txn
->isolation
= isolation
;
2705 txn
->readonly
= readonly
;
2706 txn
->deferrable
= deferrable
;
2708 return_value
->type
= IS_OBJECT
;
2709 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2712 zend_restore_error_handling(&zeh TSRMLS_CC
);
2716 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction_async
, 0, 0, 0)
2717 ZEND_ARG_INFO(0, isolation
)
2718 ZEND_ARG_INFO(0, readonly
)
2719 ZEND_ARG_INFO(0, deferrable
)
2720 ZEND_END_ARG_INFO();
2721 static PHP_METHOD(pqconn
, startTransactionAsync
) {
2722 zend_error_handling zeh
;
2723 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2724 zend_bool readonly
= 0, deferrable
= 0;
2726 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2727 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2729 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2731 rv
= php_pqconn_start_transaction_async(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2733 if (SUCCESS
== rv
) {
2734 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2736 php_pq_object_addref(obj TSRMLS_CC
);
2738 txn
->isolation
= isolation
;
2739 txn
->readonly
= readonly
;
2740 txn
->deferrable
= deferrable
;
2742 return_value
->type
= IS_OBJECT
;
2743 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2746 zend_restore_error_handling(&zeh TSRMLS_CC
);
2749 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_trace
, 0, 0, 0)
2750 ZEND_ARG_INFO(0, stdio_stream
)
2751 ZEND_END_ARG_INFO();
2752 static PHP_METHOD(pqconn
, trace
) {
2753 zval
*zstream
= NULL
;
2755 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|r!", &zstream
)) {
2756 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2760 php_stream
*stream
= NULL
;
2762 php_stream_from_zval(stream
, &zstream
);
2764 if (SUCCESS
== php_stream_cast(stream
, PHP_STREAM_AS_STDIO
, (void *) &fp
, REPORT_ERRORS
)) {
2765 stream
->flags
|= PHP_STREAM_FLAG_NO_CLOSE
;
2766 PQtrace(obj
->intern
->conn
, fp
);
2772 PQuntrace(obj
->intern
->conn
);
2776 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2782 static zend_function_entry php_pqconn_methods
[] = {
2783 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2784 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
2785 PHP_ME(pqconn
, resetAsync
, ai_pqconn_reset_async
, ZEND_ACC_PUBLIC
)
2786 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
2787 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
2788 PHP_ME(pqconn
, execAsync
, ai_pqconn_exec_async
, ZEND_ACC_PUBLIC
)
2789 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
2790 PHP_ME(pqconn
, execParamsAsync
, ai_pqconn_exec_params_async
, ZEND_ACC_PUBLIC
)
2791 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
2792 PHP_ME(pqconn
, prepareAsync
, ai_pqconn_prepare_async
, ZEND_ACC_PUBLIC
)
2793 PHP_ME(pqconn
, listen
, ai_pqconn_listen
, ZEND_ACC_PUBLIC
)
2794 PHP_ME(pqconn
, listenAsync
, ai_pqconn_listen_async
, ZEND_ACC_PUBLIC
)
2795 PHP_ME(pqconn
, notify
, ai_pqconn_notify
, ZEND_ACC_PUBLIC
)
2796 PHP_ME(pqconn
, notifyAsync
, ai_pqconn_notify_async
, ZEND_ACC_PUBLIC
)
2797 PHP_ME(pqconn
, getResult
, ai_pqconn_get_result
, ZEND_ACC_PUBLIC
)
2798 PHP_ME(pqconn
, quote
, ai_pqconn_quote
, ZEND_ACC_PUBLIC
)
2799 PHP_ME(pqconn
, quoteName
, ai_pqconn_quote_name
, ZEND_ACC_PUBLIC
)
2800 PHP_ME(pqconn
, escapeBytea
, ai_pqconn_escape_bytea
, ZEND_ACC_PUBLIC
)
2801 PHP_ME(pqconn
, unescapeBytea
, ai_pqconn_unescape_bytea
, ZEND_ACC_PUBLIC
)
2802 PHP_ME(pqconn
, startTransaction
, ai_pqconn_start_transaction
, ZEND_ACC_PUBLIC
)
2803 PHP_ME(pqconn
, startTransactionAsync
, ai_pqconn_start_transaction_async
, ZEND_ACC_PUBLIC
)
2804 PHP_ME(pqconn
, trace
, ai_pqconn_trace
, ZEND_ACC_PUBLIC
)
2808 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_construct
, 0, 0, 1)
2809 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
2810 ZEND_END_ARG_INFO();
2811 static PHP_METHOD(pqtypes
, __construct
) {
2812 zend_error_handling zeh
;
2815 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2816 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
2817 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2819 if (conn_obj
->intern
) {
2820 zval
*retval
= NULL
;
2821 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2823 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
2824 obj
->intern
->conn
= conn_obj
;
2825 php_pq_object_addref(conn_obj TSRMLS_CC
);
2826 zend_hash_init(&obj
->intern
->types
, 300, NULL
, ZVAL_PTR_DTOR
, 0);
2828 zend_call_method_with_0_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "refresh", &retval
);
2830 zval_ptr_dtor(&retval
);
2833 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2836 zend_restore_error_handling(&zeh TSRMLS_CC
);
2839 #define PHP_PQ_TYPES_QUERY \
2840 "select t.oid, t.* " \
2841 "from pg_type t join pg_namespace n on t.typnamespace=n.oid " \
2842 "where typisdefined " \
2844 "and nspname in ('public', 'pg_catalog')"
2846 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_refresh
, 0, 0, 0)
2847 ZEND_END_ARG_INFO();
2848 static PHP_METHOD(pqtypes
, refresh
) {
2849 if (SUCCESS
== zend_parse_parameters_none()) {
2850 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2853 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, PHP_PQ_TYPES_QUERY
);
2855 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2858 if (PGRES_TUPLES_OK
== PQresultStatus(res
)) {
2861 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
2862 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT
, NULL TSRMLS_CC
);
2863 long oid
= atol(PQgetvalue(res
, r
, 0 ));
2864 char *name
= PQgetvalue(res
, r
, 1);
2868 zend_hash_index_update(&obj
->intern
->types
, oid
, (void *) &row
, sizeof(zval
*), NULL
);
2869 zend_hash_add(&obj
->intern
->types
, name
, strlen(name
) + 1, (void *) &row
, sizeof(zval
*), NULL
);
2872 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQresultErrorMessage(res
));
2876 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2880 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Types not initialized");
2885 static zend_function_entry php_pqtypes_methods
[] = {
2886 PHP_ME(pqtypes
, __construct
, ai_pqtypes_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2887 PHP_ME(pqtypes
, refresh
, ai_pqtypes_refresh
, ZEND_ACC_PUBLIC
)
2891 static STATUS
php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type
, zval
***row TSRMLS_DC
)
2894 php_pqres_fetch_t orig_fetch
;
2897 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2900 if (!obj
->intern
->iter
) {
2901 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
2902 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2904 orig_fetch
= obj
->intern
->iter
->fetch_type
;
2905 obj
->intern
->iter
->fetch_type
= fetch_type
;
2906 if (SUCCESS
== (rv
= obj
->intern
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
))) {
2907 obj
->intern
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->intern
->iter
, row TSRMLS_CC
);
2908 obj
->intern
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2910 obj
->intern
->iter
->fetch_type
= orig_fetch
;
2915 typedef struct php_pqres_col
{
2920 static STATUS
column_nn(php_pqres_object_t
*obj
, zval
*zcol
, php_pqres_col_t
*col TSRMLS_DC
)
2925 switch (Z_TYPE_P(zcol
)) {
2927 convert_to_string(zcol
);
2931 if (!is_numeric_string(Z_STRVAL_P(zcol
), Z_STRLEN_P(zcol
), &index
, NULL
, 0)) {
2932 name
= Z_STRVAL_P(zcol
);
2937 index
= Z_LVAL_P(zcol
);
2943 col
->num
= PQfnumber(obj
->intern
->res
, name
);
2945 col
->name
= PQfname(obj
->intern
->res
, index
);
2950 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column at index %ld", index
);
2953 if (col
->num
== -1) {
2954 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column with name '%s'", name
);
2960 static int compare_index(const void *lptr
, const void *rptr TSRMLS_DC
)
2962 const Bucket
*l
= *(const Bucket
**) lptr
;
2963 const Bucket
*r
= *(const Bucket
**) rptr
;
2974 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_bind
, 0, 0, 2)
2975 ZEND_ARG_INFO(0, col
)
2976 ZEND_ARG_INFO(1, ref
)
2977 ZEND_END_ARG_INFO();
2978 static PHP_METHOD(pqres
, bind
) {
2981 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z/z", &zcol
, &zref
)) {
2982 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2985 php_pqres_col_t col
;
2987 if (SUCCESS
== column_nn(obj
, zcol
, &col TSRMLS_CC
)) {
2989 if (SUCCESS
== zend_hash_index_update(&obj
->intern
->bound
, col
.num
, (void *) &zref
, sizeof(zval
*), NULL
)) {
2990 zend_hash_sort(&obj
->intern
->bound
, zend_qsort
, compare_index
, 0 TSRMLS_CC
);
2993 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to bind column %s@%d", col
.name
, col
.num
);
3000 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3006 static int apply_bound(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
3008 zval
**zvalue
, **zbound
= p
;
3009 zval
**zrow
= va_arg(argv
, zval
**);
3011 if (SUCCESS
== zend_hash_index_find(Z_ARRVAL_PP(zrow
), key
->h
, (void *) &zvalue
)) {
3013 ZVAL_COPY_VALUE(*zbound
, *zvalue
);
3015 zval_ptr_dtor(zvalue
);
3016 Z_ADDREF_P(*zbound
);
3018 return ZEND_HASH_APPLY_KEEP
;
3020 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column ad index %lu", key
->h
);
3021 return ZEND_HASH_APPLY_STOP
;
3025 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_bound
, 0, 0, 0)
3026 ZEND_END_ARG_INFO();
3027 static PHP_METHOD(pqres
, fetchBound
) {
3028 zend_error_handling zeh
;
3030 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3031 if (SUCCESS
== zend_parse_parameters_none()) {
3032 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3037 if (SUCCESS
== php_pqres_iteration(getThis(), obj
, PHP_PQRES_FETCH_ARRAY
, &row TSRMLS_CC
)) {
3039 zend_hash_apply_with_arguments(&obj
->intern
->bound TSRMLS_CC
, apply_bound
, 1, row
);
3040 RETVAL_ZVAL(*row
, 1, 0);
3045 zend_restore_error_handling(&zeh TSRMLS_CC
);
3048 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
3049 ZEND_ARG_INFO(0, fetch_type
)
3050 ZEND_END_ARG_INFO();
3051 static PHP_METHOD(pqres
, fetchRow
) {
3052 zend_error_handling zeh
;
3053 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3054 long fetch_type
= -1;
3056 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3057 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
3061 if (fetch_type
== -1) {
3062 fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
3064 php_pqres_iteration(getThis(), obj
, fetch_type
, &row TSRMLS_CC
);
3067 RETVAL_ZVAL(*row
, 1, 0);
3070 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3073 zend_restore_error_handling(&zeh TSRMLS_CC
);
3076 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
3079 HashTable
*ht
= HASH_OF(row
);
3080 int count
= zend_hash_num_elements(ht
);
3083 zend_hash_internal_pointer_reset(ht
);
3085 zend_hash_move_forward(ht
);
3087 zend_hash_get_current_data(ht
, (void *) &data
);
3089 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d exceeds column count %d", col
, count
);
3094 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 0)
3095 ZEND_ARG_INFO(0, col_num
)
3096 ZEND_END_ARG_INFO();
3097 static PHP_METHOD(pqres
, fetchCol
) {
3098 zend_error_handling zeh
;
3101 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3102 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_col
)) {
3103 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3108 php_pqres_iteration(getThis(), obj
, obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: 0, &row TSRMLS_CC
);
3111 zval
**col
= column_at(*row
, fetch_col TSRMLS_CC
);
3114 RETVAL_ZVAL(*col
, 1, 0);
3118 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3121 zend_restore_error_handling(&zeh TSRMLS_CC
);
3124 static int apply_to_col(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
3127 php_pqres_object_t
*obj
= va_arg(argv
, php_pqres_object_t
*);
3128 php_pqres_col_t
*col
, **cols
= va_arg(argv
, php_pqres_col_t
**);
3129 STATUS
*rv
= va_arg(argv
, STATUS
*);
3132 if (SUCCESS
== column_nn(obj
, *c
, col TSRMLS_CC
)) {
3136 return ZEND_HASH_APPLY_STOP
;
3140 return ZEND_HASH_APPLY_KEEP
;
3143 static php_pqres_col_t
*php_pqres_convert_to_cols(php_pqres_object_t
*obj
, HashTable
*ht TSRMLS_DC
)
3145 php_pqres_col_t
*tmp
, *cols
= ecalloc(zend_hash_num_elements(ht
), sizeof(*cols
));
3146 STATUS rv
= SUCCESS
;
3149 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_col
, 2, obj
, &tmp
, &rv
);
3151 if (SUCCESS
== rv
) {
3159 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_map
, 0, 0, 0)
3160 ZEND_ARG_INFO(0, keys
)
3161 ZEND_ARG_INFO(0, vals
)
3162 ZEND_ARG_INFO(0, fetch_type
)
3163 ZEND_END_ARG_INFO();
3164 static PHP_METHOD(pqres
, map
) {
3165 zend_error_handling zeh
;
3166 zval
*zkeys
= 0, *zvals
= 0;
3167 long fetch_type
= -1;
3170 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3171 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z/!z/!l", &zkeys
, &zvals
, &fetch_type
)) {
3172 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3176 php_pqres_col_t def
= {PQfname(obj
->intern
->res
, 0), 0}, *keys
= NULL
, *vals
= NULL
;
3179 convert_to_array(zkeys
);
3181 if ((ks
= zend_hash_num_elements(Z_ARRVAL_P(zkeys
)))) {
3182 keys
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zkeys
) TSRMLS_CC
);
3192 convert_to_array(zvals
);
3194 if ((vs
= zend_hash_num_elements(Z_ARRVAL_P(zvals
)))) {
3195 vals
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zvals
) TSRMLS_CC
);
3199 if (fetch_type
== -1) {
3200 fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
3207 switch (fetch_type
) {
3208 case PHP_PQRES_FETCH_ARRAY
:
3209 case PHP_PQRES_FETCH_ASSOC
:
3210 array_init(return_value
);
3212 case PHP_PQRES_FETCH_OBJECT
:
3213 object_init(return_value
);
3216 for (r
= 0, rows
= PQntuples(obj
->intern
->res
); r
< rows
; ++r
) {
3219 cur
= &return_value
;
3220 for (k
= 0; k
< ks
; ++k
) {
3221 char *key
= PQgetvalue(obj
->intern
->res
, r
, keys
[k
].num
);
3222 int len
= PQgetlength(obj
->intern
->res
, r
, keys
[k
].num
);
3224 if (SUCCESS
!= zend_symtable_find(HASH_OF(*cur
), key
, len
+ 1, (void *) &cur
)) {
3228 switch (fetch_type
) {
3229 case PHP_PQRES_FETCH_ARRAY
:
3230 case PHP_PQRES_FETCH_ASSOC
:
3233 case PHP_PQRES_FETCH_OBJECT
:
3237 if (SUCCESS
!= zend_symtable_update(HASH_OF(*cur
), key
, len
+ 1, (void *) &tmp
, sizeof(zval
*), (void *) &cur
)) {
3238 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create map");
3244 for (v
= 0; v
< vs
; ++v
) {
3245 char *val
= PQgetvalue(obj
->intern
->res
, r
, vals
[v
].num
);
3246 int len
= PQgetlength(obj
->intern
->res
, r
, vals
[v
].num
);
3248 switch (fetch_type
) {
3249 case PHP_PQRES_FETCH_ARRAY
:
3250 add_index_stringl(*cur
, vals
[v
].num
, val
, len
, 1);
3252 case PHP_PQRES_FETCH_ASSOC
:
3253 add_assoc_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
3255 case PHP_PQRES_FETCH_OBJECT
:
3256 add_property_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
3261 php_pqres_row_to_zval(obj
->intern
->res
, r
, fetch_type
, cur TSRMLS_CC
);
3267 if (keys
&& keys
!= &def
) {
3274 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3277 zend_restore_error_handling(&zeh TSRMLS_CC
);
3280 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_count
, 0, 0, 0)
3281 ZEND_END_ARG_INFO();
3282 static PHP_METHOD(pqres
, count
) {
3283 if (SUCCESS
== zend_parse_parameters_none()) {
3286 if (SUCCESS
== php_pqres_count_elements(getThis(), &count TSRMLS_CC
)) {
3289 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3294 static zend_function_entry php_pqres_methods
[] = {
3295 PHP_ME(pqres
, bind
, ai_pqres_bind
, ZEND_ACC_PUBLIC
)
3296 PHP_ME(pqres
, fetchBound
, ai_pqres_fetch_bound
, ZEND_ACC_PUBLIC
)
3297 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
3298 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
3299 PHP_ME(pqres
, count
, ai_pqres_count
, ZEND_ACC_PUBLIC
)
3300 PHP_ME(pqres
, map
, ai_pqres_map
, ZEND_ACC_PUBLIC
)
3304 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
3305 ZEND_ARG_OBJ_INFO(0, Connection
, pq
\\Connection
, 0)
3306 ZEND_ARG_INFO(0, type
)
3307 ZEND_ARG_INFO(0, query
)
3308 ZEND_ARG_ARRAY_INFO(0, types
, 1)
3309 ZEND_ARG_INFO(0, async
)
3310 ZEND_END_ARG_INFO();
3311 static PHP_METHOD(pqstm
, __construct
) {
3312 zend_error_handling zeh
;
3313 zval
*zconn
, *ztypes
= NULL
;
3314 char *name_str
, *query_str
;
3315 int name_len
, *query_len
;
3316 zend_bool async
= 0;
3318 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3319 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
)) {
3320 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3321 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3323 if (conn_obj
->intern
) {
3326 conn_obj
->intern
->poller
= PQconsumeInput
;
3327 rv
= php_pqconn_prepare_async(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
3329 rv
= php_pqconn_prepare(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
3330 php_pqconn_notify_listeners(conn_obj TSRMLS_CC
);
3333 if (SUCCESS
== rv
) {
3334 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
3336 php_pq_object_addref(conn_obj TSRMLS_CC
);
3337 stm
->conn
= conn_obj
;
3338 stm
->name
= estrdup(name_str
);
3339 ZEND_INIT_SYMTABLE(&stm
->bound
);
3343 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3346 zend_restore_error_handling(&zeh TSRMLS_CC
);
3348 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_bind
, 0, 0, 2)
3349 ZEND_ARG_INFO(0, param_no
)
3350 ZEND_ARG_INFO(1, param_ref
)
3351 ZEND_END_ARG_INFO();
3352 static PHP_METHOD(pqstm
, bind
) {
3356 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "lz", ¶m_no
, ¶m_ref
)) {
3357 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3360 Z_ADDREF_P(param_ref
);
3361 zend_hash_index_update(&obj
->intern
->bound
, param_no
, (void *) ¶m_ref
, sizeof(zval
*), NULL
);
3362 zend_hash_sort(&obj
->intern
->bound
, zend_qsort
, compare_index
, 0 TSRMLS_CC
);
3364 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3369 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
3370 ZEND_ARG_ARRAY_INFO(0, params
, 1)
3371 ZEND_END_ARG_INFO();
3372 static PHP_METHOD(pqstm
, exec
) {
3373 zend_error_handling zeh
;
3374 zval
*zparams
= NULL
;
3376 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3377 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
3378 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3381 if (obj
->intern
->conn
->intern
) {
3383 char **params
= NULL
;
3387 ZEND_INIT_SYMTABLE(&zdtor
);
3390 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
3392 count
= php_pq_params_to_array(&obj
->intern
->bound
, ¶ms
, &zdtor TSRMLS_CC
);
3395 res
= PQexecPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0);
3400 zend_hash_destroy(&zdtor
);
3402 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3405 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3406 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
3409 ZEND_INIT_SYMTABLE(&r
->bound
);
3410 return_value
->type
= IS_OBJECT
;
3411 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
3414 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3417 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3420 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3423 zend_restore_error_handling(&zeh TSRMLS_CC
);
3426 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec_async
, 0, 0, 0)
3427 ZEND_ARG_ARRAY_INFO(0, params
, 1)
3428 ZEND_ARG_INFO(0, callable
)
3429 ZEND_END_ARG_INFO();
3430 static PHP_METHOD(pqstm
, execAsync
) {
3431 zend_error_handling zeh
;
3432 zval
*zparams
= NULL
;
3433 php_pq_callback_t resolver
= {{0}};
3435 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3436 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!f", &zparams
, &resolver
.fci
, &resolver
.fcc
)) {
3437 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3440 if (obj
->intern
->conn
->intern
) {
3442 char **params
= NULL
;
3446 ZEND_INIT_SYMTABLE(&zdtor
);
3447 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
3450 php_pq_callback_dtor(&obj
->intern
->conn
->intern
->onevent
);
3451 if (resolver
.fci
.size
> 0) {
3452 obj
->intern
->conn
->intern
->onevent
= resolver
;
3453 php_pq_callback_addref(&obj
->intern
->conn
->intern
->onevent
);
3456 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3458 if (PQsendQueryPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0)) {
3459 if (obj
->intern
->conn
->intern
->unbuffered
) {
3460 if (!PQsetSingleRowMode(obj
->intern
->conn
->intern
->conn
)) {
3461 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3466 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3474 zend_hash_destroy(&zdtor
);
3477 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3480 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3484 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3488 zend_restore_error_handling(&zeh TSRMLS_CC
);
3491 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc
, 0, 0, 0)
3492 ZEND_END_ARG_INFO();
3493 static PHP_METHOD(pqstm
, desc
) {
3494 zend_error_handling zeh
;
3496 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3497 if (SUCCESS
== zend_parse_parameters_none()) {
3498 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3501 if (obj
->intern
->conn
->intern
) {
3502 PGresult
*res
= PQdescribePrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
);
3504 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3507 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3510 array_init(return_value
);
3511 for (p
= 0, params
= PQnparams(res
); p
< params
; ++p
) {
3512 add_next_index_long(return_value
, PQparamtype(res
, p
));
3516 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3519 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3522 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3525 zend_restore_error_handling(&zeh TSRMLS_CC
);
3528 static zend_function_entry php_pqstm_methods
[] = {
3529 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3530 PHP_ME(pqstm
, bind
, ai_pqstm_bind
, ZEND_ACC_PUBLIC
)
3531 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
3532 PHP_ME(pqstm
, desc
, ai_pqstm_desc
, ZEND_ACC_PUBLIC
)
3533 PHP_ME(pqstm
, execAsync
, ai_pqstm_exec_async
, ZEND_ACC_PUBLIC
)
3537 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_construct
, 0, 0, 1)
3538 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3539 ZEND_ARG_INFO(0, async
)
3540 ZEND_ARG_INFO(0, isolation
)
3541 ZEND_ARG_INFO(0, readonly
)
3542 ZEND_ARG_INFO(0, deferrable
)
3543 ZEND_END_ARG_INFO();
3544 static PHP_METHOD(pqtxn
, __construct
) {
3545 zend_error_handling zeh
;
3547 long isolation
= PHP_PQTXN_READ_COMMITTED
;
3548 zend_bool async
= 0, readonly
= 0, deferrable
= 0;
3550 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3551 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|blbb", &zconn
, php_pqconn_class_entry
, &async
, &isolation
, &readonly
, &deferrable
)) {
3553 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3554 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3556 if (conn_obj
->intern
) {
3558 rv
= php_pqconn_start_transaction_async(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3560 rv
= php_pqconn_start_transaction(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3563 if (SUCCESS
== rv
) {
3564 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3566 php_pq_object_addref(conn_obj TSRMLS_CC
);
3567 obj
->intern
->conn
= conn_obj
;
3568 obj
->intern
->isolation
= isolation
;
3569 obj
->intern
->readonly
= readonly
;
3570 obj
->intern
->deferrable
= deferrable
;
3573 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3576 zend_restore_error_handling(&zeh TSRMLS_CC
);
3579 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_savepoint
, 0, 0, 0)
3580 ZEND_END_ARG_INFO();
3581 static PHP_METHOD(pqtxn
, savepoint
) {
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_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3592 spprintf(&cmd
, 0, "SAVEPOINT \"%u\"", ++obj
->intern
->savepoint
);
3593 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3596 php_pqres_success(res TSRMLS_CC
);
3599 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3604 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3607 zend_restore_error_handling(&zeh TSRMLS_CC
);
3610 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_savepoint_async
, 0, 0, 0)
3611 ZEND_END_ARG_INFO();
3612 static PHP_METHOD(pqtxn
, savepointAsync
) {
3613 zend_error_handling zeh
;
3615 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3616 if (SUCCESS
== zend_parse_parameters_none()) {
3617 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3622 spprintf(&cmd
, 0, "SAVEPOINT \"%u\"", ++obj
->intern
->savepoint
);
3623 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3624 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3629 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3632 zend_restore_error_handling(&zeh TSRMLS_CC
);
3635 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit
, 0, 0, 0)
3636 ZEND_END_ARG_INFO();
3637 static PHP_METHOD(pqtxn
, commit
) {
3638 zend_error_handling zeh
;
3640 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3641 if (SUCCESS
== zend_parse_parameters_none()) {
3642 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3647 if (obj
->intern
->savepoint
) {
3650 spprintf(&cmd
, 0, "RELEASE SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3651 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3654 php_pqres_success(res TSRMLS_CC
);
3657 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3662 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "COMMIT");
3665 php_pqres_success(res TSRMLS_CC
);
3668 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3672 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3675 zend_restore_error_handling(&zeh TSRMLS_CC
);
3678 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit_async
, 0, 0, 0)
3679 ZEND_END_ARG_INFO();
3680 static PHP_METHOD(pqtxn
, commitAsync
) {
3681 zend_error_handling zeh
;
3683 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3684 if (SUCCESS
== zend_parse_parameters_none()) {
3685 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3688 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3690 if (obj
->intern
->savepoint
) {
3693 spprintf(&cmd
, 0, "RELEASE SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3694 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3695 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3700 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "COMMIT")) {
3701 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3705 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3708 zend_restore_error_handling(&zeh TSRMLS_CC
);
3711 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback
, 0, 0, 0)
3712 ZEND_END_ARG_INFO();
3713 static PHP_METHOD(pqtxn
, rollback
) {
3714 zend_error_handling zeh
;
3716 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3717 if (SUCCESS
== zend_parse_parameters_none()) {
3718 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3723 if (obj
->intern
->savepoint
) {
3726 spprintf(&cmd
, 0, "ROLLBACK TO SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3727 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3730 php_pqres_success(res TSRMLS_CC
);
3733 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3738 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "ROLLBACK");
3741 php_pqres_success(res TSRMLS_CC
);
3744 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3748 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3751 zend_restore_error_handling(&zeh TSRMLS_CC
);
3754 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback_async
, 0, 0, 0)
3755 ZEND_END_ARG_INFO();
3756 static PHP_METHOD(pqtxn
, rollbackAsync
) {
3757 zend_error_handling zeh
;
3759 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3760 if (SUCCESS
== zend_parse_parameters_none()) {
3761 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3764 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3766 if (obj
->intern
->savepoint
) {
3769 spprintf(&cmd
, 0, "ROLLBACK TO SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3770 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3771 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3776 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "ROLLBACK")) {
3777 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3781 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3784 zend_restore_error_handling(&zeh TSRMLS_CC
);
3787 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_export_snapshot
, 0, 0, 0)
3788 ZEND_END_ARG_INFO();
3789 static PHP_METHOD(pqtxn
, exportSnapshot
) {
3790 zend_error_handling zeh
;
3792 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3793 if (SUCCESS
== zend_parse_parameters_none()) {
3794 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3797 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SELECT pg_export_snapshot()");
3800 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3801 RETVAL_STRING(PQgetvalue(res
, 0, 0), 1);
3806 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to export transaction snapshot (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3809 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3812 zend_restore_error_handling(&zeh TSRMLS_CC
);
3815 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_export_snapshot_async
, 0, 0, 0)
3816 ZEND_END_ARG_INFO();
3817 static PHP_METHOD(pqtxn
, exportSnapshotAsync
) {
3818 zend_error_handling zeh
;
3820 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3821 if (SUCCESS
== zend_parse_parameters_none()) {
3822 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3825 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3827 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "SELECT pg_export_snapshot()")) {
3828 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to export transaction snapshot (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3831 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3834 zend_restore_error_handling(&zeh TSRMLS_CC
);
3837 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_import_snapshot
, 0, 0, 1)
3838 ZEND_ARG_INFO(0, snapshot_id
)
3839 ZEND_END_ARG_INFO();
3840 static PHP_METHOD(pqtxn
, importSnapshot
) {
3841 zend_error_handling zeh
;
3845 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3846 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &snapshot_str
, &snapshot_len
)) {
3847 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3850 if (obj
->intern
->isolation
>= PHP_PQTXN_REPEATABLE_READ
) {
3851 char *cmd
, *sid
= PQescapeLiteral(obj
->intern
->conn
->intern
->conn
, snapshot_str
, snapshot_len
);
3854 spprintf(&cmd
, 0, "SET TRANSACTION SNAPSHOT %s", sid
);
3855 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3858 php_pqres_success(res TSRMLS_CC
);
3861 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3864 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");
3867 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3870 zend_restore_error_handling(&zeh TSRMLS_CC
);
3873 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_import_snapshot_async
, 0, 0, 1)
3874 ZEND_ARG_INFO(0, snapshot_id
)
3875 ZEND_END_ARG_INFO();
3876 static PHP_METHOD(pqtxn
, importSnapshotAsync
) {
3877 zend_error_handling zeh
;
3881 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3882 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &snapshot_str
, &snapshot_len
)) {
3883 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3886 if (obj
->intern
->isolation
>= PHP_PQTXN_REPEATABLE_READ
) {
3887 char *sid
= PQescapeLiteral(obj
->intern
->conn
->intern
->conn
, snapshot_str
, snapshot_len
);
3891 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3893 spprintf(&cmd
, 0, "SET TRANSACTION SNAPSHOT %s", sid
);
3894 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3895 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3899 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to quote snapshot identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3902 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");
3905 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3908 zend_restore_error_handling(&zeh TSRMLS_CC
);
3911 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_open_lob
, 0, 0, 1)
3912 ZEND_ARG_INFO(0, oid
)
3913 ZEND_ARG_INFO(0, mode
)
3914 ZEND_END_ARG_INFO();
3915 static PHP_METHOD(pqtxn
, openLOB
) {
3916 zend_error_handling zeh
;
3917 long mode
= INV_WRITE
|INV_READ
, loid
;
3919 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3920 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &loid
, &mode
)) {
3921 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3924 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3927 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3931 php_pq_object_addref(obj TSRMLS_CC
);
3934 return_value
->type
= IS_OBJECT
;
3935 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3937 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
3938 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3939 (mode
& INV_READ
? "r" :
3940 (mode
& INV_WRITE
? "w" : "-"))),
3941 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3945 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3948 zend_restore_error_handling(&zeh TSRMLS_CC
);
3951 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_create_lob
, 0, 0, 0)
3952 ZEND_ARG_INFO(0, mode
)
3953 ZEND_END_ARG_INFO();
3954 static PHP_METHOD(pqtxn
, createLOB
) {
3955 zend_error_handling zeh
;
3956 long mode
= INV_WRITE
|INV_READ
;
3958 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3959 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &mode
)) {
3960 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3963 Oid loid
= lo_creat(obj
->intern
->conn
->intern
->conn
, mode
);
3965 if (loid
!= InvalidOid
) {
3966 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3969 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3972 php_pq_object_addref(obj TSRMLS_CC
);
3975 return_value
->type
= IS_OBJECT
;
3976 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3978 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s': %s",
3979 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3980 (mode
& INV_READ
? "r" :
3981 (mode
& INV_WRITE
? "w" : "-"))),
3982 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3986 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s': %s",
3987 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3988 (mode
& INV_READ
? "r" :
3989 (mode
& INV_WRITE
? "w" : "-"))),
3990 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3994 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3997 zend_restore_error_handling(&zeh TSRMLS_CC
);
4000 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_unlink_lob
, 0, 0, 1)
4001 ZEND_ARG_INFO(0, oid
)
4002 ZEND_END_ARG_INFO();
4003 static PHP_METHOD(pqtxn
, unlinkLOB
) {
4006 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l", &loid
)) {
4007 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4010 if (1 == lo_unlink(obj
->intern
->conn
->intern
->conn
, loid
)) {
4013 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to unlink LOB (oid=%ld): %s", loid
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4017 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
4023 static zend_function_entry php_pqtxn_methods
[] = {
4024 PHP_ME(pqtxn
, __construct
, ai_pqtxn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4025 PHP_ME(pqtxn
, commit
, ai_pqtxn_commit
, ZEND_ACC_PUBLIC
)
4026 PHP_ME(pqtxn
, rollback
, ai_pqtxn_rollback
, ZEND_ACC_PUBLIC
)
4027 PHP_ME(pqtxn
, commitAsync
, ai_pqtxn_commit_async
, ZEND_ACC_PUBLIC
)
4028 PHP_ME(pqtxn
, rollbackAsync
, ai_pqtxn_rollback_async
, ZEND_ACC_PUBLIC
)
4029 PHP_ME(pqtxn
, savepoint
, ai_pqtxn_savepoint
, ZEND_ACC_PUBLIC
)
4030 PHP_ME(pqtxn
, savepointAsync
, ai_pqtxn_savepoint_async
, ZEND_ACC_PUBLIC
)
4031 PHP_ME(pqtxn
, exportSnapshot
, ai_pqtxn_export_snapshot
, ZEND_ACC_PUBLIC
)
4032 PHP_ME(pqtxn
, exportSnapshotAsync
, ai_pqtxn_export_snapshot_async
, ZEND_ACC_PUBLIC
)
4033 PHP_ME(pqtxn
, importSnapshot
, ai_pqtxn_import_snapshot
, ZEND_ACC_PUBLIC
)
4034 PHP_ME(pqtxn
, importSnapshotAsync
, ai_pqtxn_import_snapshot_async
, ZEND_ACC_PUBLIC
)
4035 PHP_ME(pqtxn
, openLOB
, ai_pqtxn_open_lob
, ZEND_ACC_PUBLIC
)
4036 PHP_ME(pqtxn
, createLOB
, ai_pqtxn_create_lob
, ZEND_ACC_PUBLIC
)
4037 PHP_ME(pqtxn
, unlinkLOB
, ai_pqtxn_unlink_lob
, ZEND_ACC_PUBLIC
)
4041 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_construct
, 0, 0, 1)
4042 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
4043 ZEND_END_ARG_INFO();
4044 static PHP_METHOD(pqcancel
, __construct
) {
4045 zend_error_handling zeh
;
4048 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4049 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
4050 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4052 if (conn_obj
->intern
) {
4053 PGcancel
*cancel
= PQgetCancel(conn_obj
->intern
->conn
);
4056 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4058 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4059 obj
->intern
->cancel
= cancel
;
4060 php_pq_object_addref(conn_obj TSRMLS_CC
);
4061 obj
->intern
->conn
= conn_obj
;
4063 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not acquire cancel (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
4066 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4069 zend_restore_error_handling(&zeh TSRMLS_CC
);
4072 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_cancel
, 0, 0, 0)
4073 ZEND_END_ARG_INFO();
4074 static PHP_METHOD(pqcancel
, cancel
) {
4075 zend_error_handling zeh
;
4077 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4078 if (SUCCESS
== zend_parse_parameters_none()) {
4079 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4084 if (!PQcancel(obj
->intern
->cancel
, err
, sizeof(err
))) {
4085 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not request cancellation: %s", err
);
4088 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Cancel not initialized");
4091 zend_restore_error_handling(&zeh TSRMLS_CC
);
4094 static zend_function_entry php_pqcancel_methods
[] = {
4095 PHP_ME(pqcancel
, __construct
, ai_pqcancel_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4096 PHP_ME(pqcancel
, cancel
, ai_pqcancel_cancel
, ZEND_ACC_PUBLIC
)
4100 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
)
4104 if (SUCCESS
== zend_hash_find(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evhs
)) {
4106 add_next_index_zval(*evhs
, zevent
);
4113 add_next_index_zval(evh
, zevent
);
4114 zend_hash_add(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evh
, sizeof(zval
*), NULL
);
4118 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_construct
, 0, 0, 3)
4119 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
4120 ZEND_ARG_INFO(0, type
)
4121 ZEND_ARG_INFO(0, callable
)
4122 ZEND_END_ARG_INFO();
4123 static PHP_METHOD(pqevent
, __construct
) {
4124 zend_error_handling zeh
;
4128 php_pq_callback_t cb
;
4130 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4131 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Osf", &zconn
, php_pqconn_class_entry
, &type_str
, &type_len
, &cb
.fci
, &cb
.fcc
)) {
4132 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4134 if (conn_obj
->intern
) {
4135 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4137 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4138 php_pq_callback_addref(&cb
);
4139 obj
->intern
->cb
= cb
;
4140 php_pq_object_addref(conn_obj TSRMLS_CC
);
4141 obj
->intern
->conn
= conn_obj
;
4142 obj
->intern
->type
= estrdup(type_str
);
4144 php_pqconn_add_eventhandler(zconn
, conn_obj
, type_str
, type_len
, getThis() TSRMLS_CC
);
4147 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4150 zend_restore_error_handling(&zeh TSRMLS_CC
);
4153 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_trigger
, 0, 0, 1)
4154 ZEND_ARG_ARRAY_INFO(0, args
, 1)
4155 ZEND_END_ARG_INFO();
4156 static PHP_METHOD(pqevent
, trigger
) {
4159 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "a/", &args
)) {
4160 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4165 if (SUCCESS
== zend_fcall_info_call(&obj
->intern
->cb
.fci
, &obj
->intern
->cb
.fcc
, &rv
, args TSRMLS_CC
)) {
4167 RETVAL_ZVAL(rv
, 0, 1);
4173 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Event not initialized");
4179 static zend_function_entry php_pqevent_methods
[] = {
4180 PHP_ME(pqevent
, __construct
, ai_pqevent_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4181 PHP_ME(pqevent
, trigger
, ai_pqevent_trigger
, ZEND_ACC_PUBLIC
)
4185 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_construct
, 0, 0, 1)
4186 ZEND_ARG_OBJ_INFO(0, transaction
, pq
\\Transaction
, 0)
4187 ZEND_ARG_INFO(0, oid
)
4188 ZEND_ARG_INFO(0, mode
)
4189 ZEND_END_ARG_INFO();
4190 static PHP_METHOD(pqlob
, __construct
) {
4191 zend_error_handling zeh
;
4193 long mode
= INV_WRITE
|INV_READ
, loid
= InvalidOid
;
4195 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4196 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|ll", &ztxn
, php_pqtxn_class_entry
, &loid
, &mode
)) {
4197 php_pqtxn_object_t
*txn_obj
= zend_object_store_get_object(ztxn TSRMLS_CC
);
4199 if (txn_obj
->intern
) {
4201 if (loid
== InvalidOid
) {
4202 loid
= lo_creat(txn_obj
->intern
->conn
->intern
->conn
, mode
);
4205 if (loid
!= InvalidOid
) {
4206 int lofd
= lo_open(txn_obj
->intern
->conn
->intern
->conn
, loid
, mode
);
4209 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4211 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4212 obj
->intern
->lofd
= lofd
;
4213 obj
->intern
->loid
= loid
;
4214 php_pq_object_addref(txn_obj TSRMLS_CC
);
4215 obj
->intern
->txn
= txn_obj
;
4217 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
4218 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4219 (mode
& INV_READ
? "r" :
4220 (mode
& INV_WRITE
? "w" : "-"))),
4221 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
4225 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s' (%s)",
4226 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
4227 (mode
& INV_READ
? "r" :
4228 (mode
& INV_WRITE
? "w" : "-"))),
4229 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
4233 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
4236 zend_restore_error_handling(&zeh TSRMLS_CC
);
4239 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_write
, 0, 0, 1)
4240 ZEND_ARG_INFO(0, data
)
4241 ZEND_END_ARG_INFO();
4242 static PHP_METHOD(pqlob
, write
) {
4246 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
4247 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4250 int written
= lo_write(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, data_str
, data_len
);
4253 RETVAL_LONG(written
);
4255 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to write to LOB, oid=%d (%s)", obj
->intern
->loid
,
4256 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4260 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4266 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_read
, 0, 0, 0)
4267 ZEND_ARG_INFO(0, length
)
4268 ZEND_ARG_INFO(1, read
)
4269 ZEND_END_ARG_INFO();
4270 static PHP_METHOD(pqlob
, read
) {
4271 long length
= 0x1000;
4274 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lz!", &length
, &zread
)) {
4275 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4278 char *buffer
= emalloc(length
+ 1);
4279 int read
= lo_read(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, buffer
, length
);
4284 ZVAL_LONG(zread
, read
);
4286 buffer
[read
] = '\0';
4287 RETVAL_STRINGL(buffer
, read
, 0);
4290 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to read from LOB, oid=%d (%s)", obj
->intern
->loid
,
4291 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4296 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4302 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_seek
, 0, 0, 1)
4303 ZEND_ARG_INFO(0, offset
)
4304 ZEND_ARG_INFO(0, whence
)
4305 ZEND_END_ARG_INFO();
4306 static PHP_METHOD(pqlob
, seek
) {
4307 long offset
, whence
= SEEK_SET
;
4309 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &offset
, &whence
)) {
4310 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4313 int position
= lo_lseek(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, offset
, whence
);
4315 if (position
>= 0) {
4316 RETVAL_LONG(position
);
4318 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to seek offset in LOB, oid=%d (%s)", obj
->intern
->loid
,
4319 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4323 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4329 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_tell
, 0, 0, 0)
4330 ZEND_END_ARG_INFO();
4331 static PHP_METHOD(pqlob
, tell
) {
4332 if (SUCCESS
== zend_parse_parameters_none()) {
4333 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4336 int position
= lo_tell(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
4338 if (position
>= 0) {
4339 RETVAL_LONG(position
);
4341 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to tell offset in LOB (oid=%d): %s", obj
->intern
->loid
,
4342 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4346 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4352 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_truncate
, 0, 0, 0)
4353 ZEND_ARG_INFO(0, length
)
4354 ZEND_END_ARG_INFO();
4355 static PHP_METHOD(pqlob
, truncate
) {
4358 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &length
)) {
4359 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4362 if (0 == lo_truncate(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, length
)) {
4365 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to truncate LOB (oid=%d): %s", obj
->intern
->loid
,
4366 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4370 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4376 static zend_function_entry php_pqlob_methods
[] = {
4377 PHP_ME(pqlob
, __construct
, ai_pqlob_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4378 PHP_ME(pqlob
, write
, ai_pqlob_write
, ZEND_ACC_PUBLIC
)
4379 PHP_ME(pqlob
, read
, ai_pqlob_read
, ZEND_ACC_PUBLIC
)
4380 PHP_ME(pqlob
, seek
, ai_pqlob_seek
, ZEND_ACC_PUBLIC
)
4381 PHP_ME(pqlob
, tell
, ai_pqlob_tell
, ZEND_ACC_PUBLIC
)
4382 PHP_ME(pqlob
, truncate
, ai_pqlob_truncate
, ZEND_ACC_PUBLIC
)
4386 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_construct
, 0, 0, 3)
4387 ZEND_ARG_OBJ_INFO(0, "connection", pq
\\Connection
, 0)
4388 ZEND_ARG_INFO(0, expression
)
4389 ZEND_ARG_INFO(0, direction
)
4390 ZEND_ARG_INFO(0, options
)
4391 ZEND_END_ARG_INFO();
4392 static PHP_METHOD(pqcopy
, __construct
) {
4393 zend_error_handling zeh
;
4395 char *expr_str
, *opt_str
= "";
4396 int expr_len
, opt_len
= 0;
4399 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4400 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
)) {
4401 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4403 if (conn_obj
->intern
) {
4406 switch (direction
) {
4407 case PHP_PQCOPY_FROM_STDIN
:
4408 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "FROM STDIN", opt_str
);
4411 case PHP_PQCOPY_TO_STDOUT
:
4412 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "TO STDOUT", opt_str
);
4416 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Invalid COPY direction, expected one of FROM_STDIN (%d) TO_STDOUT (%d), got %ld",
4417 PHP_PQCOPY_FROM_STDIN
, PHP_PQCOPY_TO_STDOUT
, direction
);
4422 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4423 PGresult
*res
= PQexec(conn_obj
->intern
->conn
, copy
);
4427 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4428 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4429 obj
->intern
->direction
= direction
;
4430 obj
->intern
->expression
= estrdup(expr_str
);
4431 obj
->intern
->options
= estrdup(opt_str
);
4432 obj
->intern
->conn
= conn_obj
;
4433 php_pq_object_addref(conn_obj TSRMLS_CC
);
4439 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4442 zend_restore_error_handling(&zeh TSRMLS_CC
);
4445 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_put
, 0, 0, 1)
4446 ZEND_ARG_INFO(0, data
)
4447 ZEND_END_ARG_INFO();
4448 static PHP_METHOD(pqcopy
, put
) {
4449 zend_error_handling zeh
;
4453 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4454 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
4455 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4458 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
4459 if (1 == PQputCopyData(obj
->intern
->conn
->intern
->conn
, data_str
, data_len
)) {
4462 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to send COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4465 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
4468 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
4471 zend_restore_error_handling(&zeh TSRMLS_CC
);
4474 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_end
, 0, 0, 0)
4475 ZEND_ARG_INFO(0, error
)
4476 ZEND_END_ARG_INFO();
4477 static PHP_METHOD(pqcopy
, end
) {
4478 zend_error_handling zeh
;
4479 char *error_str
= NULL
;
4482 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4483 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|s!", &error_str
, &error_len
)) {
4484 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4487 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
4488 if (1 == PQputCopyEnd(obj
->intern
->conn
->intern
->conn
, error_str
)) {
4489 PGresult
*res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
4492 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4498 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4501 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to end COPY (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4504 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
4507 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
4510 zend_restore_error_handling(&zeh TSRMLS_CC
);
4513 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_get
, 0, 0, 1)
4514 ZEND_ARG_INFO(1, data
)
4515 ZEND_END_ARG_INFO();
4516 static PHP_METHOD(pqcopy
, get
) {
4517 zend_error_handling zeh
;
4520 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4521 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &zdata
)) {
4522 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4523 char *buffer
= NULL
;
4526 if (PHP_PQCOPY_TO_STDOUT
== obj
->intern
->direction
) {
4528 int bytes
= PQgetCopyData(obj
->intern
->conn
->intern
->conn
, &buffer
, 0);
4532 res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
4535 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4541 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4546 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4552 ZVAL_STRINGL(zdata
, buffer
, bytes
, 1);
4554 ZVAL_EMPTY_STRING(zdata
);
4566 zend_restore_error_handling(&zeh TSRMLS_CC
);
4569 static zend_function_entry php_pqcopy_methods
[] = {
4570 PHP_ME(pqcopy
, __construct
, ai_pqcopy_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4571 PHP_ME(pqcopy
, put
, ai_pqcopy_put
, ZEND_ACC_PUBLIC
)
4572 PHP_ME(pqcopy
, end
, ai_pqcopy_end
, ZEND_ACC_PUBLIC
)
4573 PHP_ME(pqcopy
, get
, ai_pqcopy_get
, ZEND_ACC_PUBLIC
)
4577 /* {{{ PHP_MINIT_FUNCTION
4579 static PHP_MINIT_FUNCTION(pq
)
4581 zend_class_entry ce
= {0};
4582 php_pq_object_prophandler_t ph
= {0};
4584 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
4585 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4586 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
4588 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4589 php_pqconn_object_handlers
.read_property
= php_pq_object_read_prop
;
4590 php_pqconn_object_handlers
.write_property
= php_pq_object_write_prop
;
4591 php_pqconn_object_handlers
.clone_obj
= NULL
;
4592 php_pqconn_object_handlers
.get_property_ptr_ptr
= NULL
;
4593 php_pqconn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4595 zend_hash_init(&php_pqconn_object_prophandlers
, 13, NULL
, NULL
, 1);
4597 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4598 ph
.read
= php_pqconn_object_read_status
;
4599 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4601 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4602 ph
.read
= php_pqconn_object_read_transaction_status
;
4603 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
4605 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4606 ph
.read
= NULL
; /* forward to std prophandler */
4607 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
4609 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4610 ph
.read
= php_pqconn_object_read_error_message
;
4611 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4613 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("busy"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4614 ph
.read
= php_pqconn_object_read_busy
;
4615 zend_hash_add(&php_pqconn_object_prophandlers
, "busy", sizeof("busy"), (void *) &ph
, sizeof(ph
), NULL
);
4617 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("encoding"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4618 ph
.read
= php_pqconn_object_read_encoding
;
4619 ph
.write
= php_pqconn_object_write_encoding
;
4620 zend_hash_add(&php_pqconn_object_prophandlers
, "encoding", sizeof("encoding"), (void *) &ph
, sizeof(ph
), NULL
);
4623 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("unbuffered"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4624 ph
.read
= php_pqconn_object_read_unbuffered
;
4625 ph
.write
= php_pqconn_object_write_unbuffered
;
4626 zend_hash_add(&php_pqconn_object_prophandlers
, "unbuffered", sizeof("unbuffered"), (void *) &ph
, sizeof(ph
), NULL
);
4629 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("db"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4630 ph
.read
= php_pqconn_object_read_db
;
4631 zend_hash_add(&php_pqconn_object_prophandlers
, "db", sizeof("db"), (void *) &ph
, sizeof(ph
), NULL
);
4633 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4634 ph
.read
= php_pqconn_object_read_user
;
4635 zend_hash_add(&php_pqconn_object_prophandlers
, "user", sizeof("user"), (void *) &ph
, sizeof(ph
), NULL
);
4637 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("pass"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4638 ph
.read
= php_pqconn_object_read_pass
;
4639 zend_hash_add(&php_pqconn_object_prophandlers
, "pass", sizeof("pass"), (void *) &ph
, sizeof(ph
), NULL
);
4641 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("host"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4642 ph
.read
= php_pqconn_object_read_host
;
4643 zend_hash_add(&php_pqconn_object_prophandlers
, "host", sizeof("host"), (void *) &ph
, sizeof(ph
), NULL
);
4645 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("port"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4646 ph
.read
= php_pqconn_object_read_port
;
4647 zend_hash_add(&php_pqconn_object_prophandlers
, "port", sizeof("port"), (void *) &ph
, sizeof(ph
), NULL
);
4649 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4650 ph
.read
= php_pqconn_object_read_options
;
4651 zend_hash_add(&php_pqconn_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
4653 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
4654 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
4655 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
4656 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
4657 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
4658 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
4659 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
4660 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
4662 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
4663 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
4664 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
4665 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
4666 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
4668 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
4669 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
4670 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
4671 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
4673 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("ASYNC"), 0x1 TSRMLS_CC
);
4674 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("PERSISTENT"), 0x2 TSRMLS_CC
);
4675 memset(&ce
, 0, sizeof(ce
));
4676 INIT_NS_CLASS_ENTRY(ce
, "pq", "Types", php_pqtypes_methods
);
4677 php_pqtypes_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4678 php_pqtypes_class_entry
->create_object
= php_pqtypes_create_object
;
4680 memcpy(&php_pqtypes_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4681 php_pqtypes_object_handlers
.read_property
= php_pq_object_read_prop
;
4682 php_pqtypes_object_handlers
.write_property
= php_pq_object_write_prop
;
4683 php_pqtypes_object_handlers
.clone_obj
= NULL
;
4684 php_pqtypes_object_handlers
.get_property_ptr_ptr
= NULL
;
4685 php_pqtypes_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4686 php_pqtypes_object_handlers
.has_dimension
= php_pqtypes_object_has_dimension
;
4687 php_pqtypes_object_handlers
.read_dimension
= php_pqtypes_object_read_dimension
;
4688 php_pqtypes_object_handlers
.unset_dimension
= NULL
;
4689 php_pqtypes_object_handlers
.write_dimension
= NULL
;
4691 zend_hash_init(&php_pqtypes_object_prophandlers
, 1, NULL
, NULL
, 1);
4693 zend_declare_property_null(php_pqtypes_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4694 ph
.read
= php_pqtypes_object_read_connection
;
4695 zend_hash_add(&php_pqtypes_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4697 memset(&ce
, 0, sizeof(ce
));
4698 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
4699 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4700 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
4701 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
4702 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
4703 zend_class_implements(php_pqres_class_entry TSRMLS_CC
, 2, zend_ce_traversable
, spl_ce_Countable
);
4705 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4706 php_pqres_object_handlers
.read_property
= php_pq_object_read_prop
;
4707 php_pqres_object_handlers
.write_property
= php_pq_object_write_prop
;
4708 php_pqres_object_handlers
.clone_obj
= NULL
;
4709 php_pqres_object_handlers
.get_property_ptr_ptr
= NULL
;
4710 php_pqres_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4711 php_pqres_object_handlers
.count_elements
= php_pqres_count_elements
;
4713 zend_hash_init(&php_pqres_object_prophandlers
, 6, NULL
, NULL
, 1);
4715 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4716 ph
.read
= php_pqres_object_read_status
;
4717 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4719 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4720 ph
.read
= php_pqres_object_read_error_message
;
4721 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4723 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4724 ph
.read
= php_pqres_object_read_num_rows
;
4725 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
4727 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4728 ph
.read
= php_pqres_object_read_num_cols
;
4729 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
4731 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4732 ph
.read
= php_pqres_object_read_affected_rows
;
4733 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
4735 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4736 ph
.read
= php_pqres_object_read_fetch_type
;
4737 ph
.write
= php_pqres_object_write_fetch_type
;
4738 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
4741 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
4742 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
4743 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
4744 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
4745 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
4746 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
4747 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
4748 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
4749 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
4750 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
4752 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
4753 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
4754 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
4756 memset(&ce
, 0, sizeof(ce
));
4757 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
4758 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4759 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
4761 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4762 php_pqstm_object_handlers
.read_property
= php_pq_object_read_prop
;
4763 php_pqstm_object_handlers
.write_property
= php_pq_object_write_prop
;
4764 php_pqstm_object_handlers
.clone_obj
= NULL
;
4765 php_pqstm_object_handlers
.get_property_ptr_ptr
= NULL
;
4766 php_pqstm_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4768 zend_hash_init(&php_pqstm_object_prophandlers
, 2, NULL
, NULL
, 1);
4770 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4771 ph
.read
= php_pqstm_object_read_name
;
4772 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
4774 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4775 ph
.read
= php_pqstm_object_read_connection
;
4776 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4778 memset(&ce
, 0, sizeof(ce
));
4779 INIT_NS_CLASS_ENTRY(ce
, "pq", "Transaction", php_pqtxn_methods
);
4780 php_pqtxn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4781 php_pqtxn_class_entry
->create_object
= php_pqtxn_create_object
;
4783 memcpy(&php_pqtxn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4784 php_pqtxn_object_handlers
.read_property
= php_pq_object_read_prop
;
4785 php_pqtxn_object_handlers
.write_property
= php_pq_object_write_prop
;
4786 php_pqtxn_object_handlers
.clone_obj
= NULL
;
4787 php_pqtxn_object_handlers
.get_property_ptr_ptr
= NULL
;
4788 php_pqtxn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4790 zend_hash_init(&php_pqtxn_object_prophandlers
, 4, NULL
, NULL
, 1);
4792 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4793 ph
.read
= php_pqtxn_object_read_connection
;
4794 zend_hash_add(&php_pqtxn_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4796 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("isolation"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4797 ph
.read
= php_pqtxn_object_read_isolation
;
4798 ph
.write
= php_pqtxn_object_write_isolation
;
4799 zend_hash_add(&php_pqtxn_object_prophandlers
, "isolation", sizeof("isolation"), (void *) &ph
, sizeof(ph
), NULL
);
4801 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("readonly"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4802 ph
.read
= php_pqtxn_object_read_readonly
;
4803 ph
.write
= php_pqtxn_object_write_readonly
;
4804 zend_hash_add(&php_pqtxn_object_prophandlers
, "readonly", sizeof("readonly"), (void *) &ph
, sizeof(ph
), NULL
);
4806 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("deferrable"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4807 ph
.read
= php_pqtxn_object_read_deferrable
;
4808 ph
.write
= php_pqtxn_object_write_deferrable
;
4809 zend_hash_add(&php_pqtxn_object_prophandlers
, "deferrable", sizeof("deferrable"), (void *) &ph
, sizeof(ph
), NULL
);
4812 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("READ_COMMITTED"), PHP_PQTXN_READ_COMMITTED TSRMLS_CC
);
4813 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("REPEATABLE READ"), PHP_PQTXN_REPEATABLE_READ TSRMLS_CC
);
4814 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("SERIALIZABLE"), PHP_PQTXN_SERIALIZABLE TSRMLS_CC
);
4816 memset(&ce
, 0, sizeof(ce
));
4817 INIT_NS_CLASS_ENTRY(ce
, "pq", "Cancel", php_pqcancel_methods
);
4818 php_pqcancel_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4819 php_pqcancel_class_entry
->create_object
= php_pqcancel_create_object
;
4821 memcpy(&php_pqcancel_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4822 php_pqcancel_object_handlers
.read_property
= php_pq_object_read_prop
;
4823 php_pqcancel_object_handlers
.write_property
= php_pq_object_write_prop
;
4824 php_pqcancel_object_handlers
.clone_obj
= NULL
;
4825 php_pqcancel_object_handlers
.get_property_ptr_ptr
= NULL
;
4826 php_pqcancel_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4828 zend_hash_init(&php_pqcancel_object_prophandlers
, 1, NULL
, NULL
, 1);
4830 zend_declare_property_null(php_pqcancel_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4831 ph
.read
= php_pqcancel_object_read_connection
;
4832 zend_hash_add(&php_pqcancel_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4834 memset(&ce
, 0, sizeof(ce
));
4835 INIT_NS_CLASS_ENTRY(ce
, "pq", "Event", php_pqevent_methods
);
4836 php_pqevent_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4837 php_pqevent_class_entry
->create_object
= php_pqevent_create_object
;
4839 memcpy(&php_pqevent_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4840 php_pqevent_object_handlers
.read_property
= php_pq_object_read_prop
;
4841 php_pqevent_object_handlers
.write_property
= php_pq_object_write_prop
;
4842 php_pqevent_object_handlers
.clone_obj
= NULL
;
4843 php_pqevent_object_handlers
.get_property_ptr_ptr
= NULL
;
4844 php_pqevent_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4846 zend_hash_init(&php_pqevent_object_prophandlers
, 2, NULL
, NULL
, 1);
4848 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4849 ph
.read
= php_pqevent_object_read_connection
;
4850 zend_hash_add(&php_pqevent_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4852 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("type"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4853 ph
.read
= php_pqevent_object_read_type
;
4854 zend_hash_add(&php_pqevent_object_prophandlers
, "type", sizeof("type"), (void *) &ph
, sizeof(ph
), NULL
);
4856 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("NOTICE"), ZEND_STRL("notice") TSRMLS_CC
);
4857 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESULT"), ZEND_STRL("result") TSRMLS_CC
);
4858 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESET"), ZEND_STRL("reset") TSRMLS_CC
);
4860 memset(&ce
, 0, sizeof(ce
));
4861 INIT_NS_CLASS_ENTRY(ce
, "pq", "LOB", php_pqlob_methods
);
4862 php_pqlob_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4863 php_pqlob_class_entry
->create_object
= php_pqlob_create_object
;
4865 memcpy(&php_pqlob_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4866 php_pqlob_object_handlers
.read_property
= php_pq_object_read_prop
;
4867 php_pqlob_object_handlers
.write_property
= php_pq_object_write_prop
;
4868 php_pqlob_object_handlers
.clone_obj
= NULL
;
4869 php_pqlob_object_handlers
.get_property_ptr_ptr
= NULL
;
4870 php_pqlob_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4872 zend_hash_init(&php_pqlob_object_prophandlers
, 2, NULL
, NULL
, 1);
4874 zend_declare_property_null(php_pqlob_class_entry
, ZEND_STRL("transaction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4875 ph
.read
= php_pqlob_object_read_transaction
;
4876 zend_hash_add(&php_pqlob_object_prophandlers
, "transaction", sizeof("transaction"), (void *) &ph
, sizeof(ph
), NULL
);
4878 zend_declare_property_long(php_pqlob_class_entry
, ZEND_STRL("oid"), InvalidOid
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4879 ph
.read
= php_pqlob_object_read_oid
;
4880 zend_hash_add(&php_pqlob_object_prophandlers
, "oid", sizeof("oid"), (void *) &ph
, sizeof(ph
), NULL
);
4882 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("INVALID_OID"), InvalidOid TSRMLS_CC
);
4883 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("R"), INV_READ TSRMLS_CC
);
4884 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("W"), INV_WRITE TSRMLS_CC
);
4885 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("RW"), INV_READ
|INV_WRITE TSRMLS_CC
);
4887 memset(&ce
, 0, sizeof(ce
));
4888 INIT_NS_CLASS_ENTRY(ce
, "pq", "COPY", php_pqcopy_methods
);
4889 php_pqcopy_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4890 php_pqcopy_class_entry
->create_object
= php_pqcopy_create_object
;
4892 memcpy(&php_pqcopy_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4893 php_pqcopy_object_handlers
.read_property
= php_pq_object_read_prop
;
4894 php_pqcopy_object_handlers
.write_property
= php_pq_object_write_prop
;
4895 php_pqcopy_object_handlers
.clone_obj
= NULL
;
4896 php_pqcopy_object_handlers
.get_property_ptr_ptr
= NULL
;
4897 php_pqcopy_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4899 zend_hash_init(&php_pqcopy_object_prophandlers
, 4, NULL
, NULL
, 1);
4901 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4902 ph
.read
= php_pqcopy_object_read_connection
;
4903 zend_hash_add(&php_pqcopy_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4905 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("expression"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4906 ph
.read
= php_pqcopy_object_read_expression
;
4907 zend_hash_add(&php_pqcopy_object_prophandlers
, "expression", sizeof("expression"), (void *) &ph
, sizeof(ph
), NULL
);
4909 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("direction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4910 ph
.read
= php_pqcopy_object_read_direction
;
4911 zend_hash_add(&php_pqcopy_object_prophandlers
, "direction", sizeof("direction"), (void *) &ph
, sizeof(ph
), NULL
);
4913 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4914 ph
.read
= php_pqcopy_object_read_options
;
4915 zend_hash_add(&php_pqcopy_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
4917 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("FROM_STDIN"), PHP_PQCOPY_FROM_STDIN TSRMLS_CC
);
4918 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("TO_STDOUT"), PHP_PQCOPY_TO_STDOUT TSRMLS_CC
);
4920 php_persistent_handle_provide(ZEND_STRL("pq\\Connection"), &php_pqconn_resource_factory_ops
, NULL
, NULL
);
4923 REGISTER_INI_ENTRIES();
4929 /* {{{ PHP_MSHUTDOWN_FUNCTION
4931 static PHP_MSHUTDOWN_FUNCTION(pq
)
4933 /* uncomment this line if you have INI entries
4934 UNREGISTER_INI_ENTRIES();
4936 php_persistent_handle_cleanup(ZEND_STRL("pq\\Connection"), NULL
, 0 TSRMLS_CC
);
4941 /* {{{ PHP_MINFO_FUNCTION
4943 static PHP_MINFO_FUNCTION(pq
)
4945 #ifdef HAVE_PQLIBVERSION
4948 char libpq_version
[10] = "pre-9.1";
4950 php_info_print_table_start();
4951 php_info_print_table_header(2, "PQ Support", "enabled");
4952 php_info_print_table_row(2, "Extension Version", PHP_PQ_EXT_VERSION
);
4953 php_info_print_table_end();
4955 php_info_print_table_start();
4956 php_info_print_table_header(2, "Used Library", "Version");
4957 #ifdef HAVE_PQLIBVERSION
4958 libpq_v
= PQlibVersion();
4959 slprintf(libpq_version
, sizeof(libpq_version
), "%d.%d.%d", libpq_v
/10000%100, libpq_v
/100%100, libpq_v
%100);
4961 php_info_print_table_row(2, "libpq", libpq_version
);
4962 php_info_print_table_end();
4964 /* Remove comments if you have entries in php.ini
4965 DISPLAY_INI_ENTRIES();
4970 const zend_function_entry pq_functions
[] = {
4974 static zend_module_dep pq_module_deps
[] = {
4975 ZEND_MOD_REQUIRED("raphf")
4979 /* {{{ pq_module_entry
4981 zend_module_entry pq_module_entry
= {
4982 STANDARD_MODULE_HEADER_EX
,
4989 NULL
,/*PHP_RINIT(pq),*/
4990 NULL
,/*PHP_RSHUTDOWN(pq),*/
4993 STANDARD_MODULE_PROPERTIES
4997 #ifdef COMPILE_DL_PQ
5007 * vim600: noet sw=4 ts=4 fdm=marker
5008 * vim<600: noet sw=4 ts=4