2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2013, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
18 #include <Zend/zend_interfaces.h>
19 #include <ext/standard/info.h>
20 #include <ext/spl/spl_array.h>
22 #include <libpq-events.h>
23 #include <libpq/libpq-fs.h>
28 typedef int STATUS
; /* SUCCESS/FAILURE */
30 static char *rtrim(char *e
) {
33 while (l
-- > 0 && e
[l
] == '\n') {
39 #define PHP_PQerrorMessage(c) rtrim(PQerrorMessage((c)))
40 #define PHP_PQresultErrorMessage(r) rtrim(PQresultErrorMessage((r)))
42 static int php_pqconn_event(PGEventId id
, void *e
, void *data
);
44 #define PHP_PQclear(_r) \
46 zval *_resinszv = PQresultInstanceData((_r), php_pqconn_event); \
47 if (!_resinszv) PQclear((_r)); \
51 ZEND_DECLARE_MODULE_GLOBALS(pq)
57 /* Remove comments and fill if you need to have entries in php.ini
59 STD_PHP_INI_ENTRY("pq.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_pq_globals, pq_globals)
60 STD_PHP_INI_ENTRY("pq.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_pq_globals, pq_globals)
65 /* {{{ php_pq_init_globals
67 /* Uncomment this function if you have INI entries
68 static void php_pq_init_globals(zend_pq_globals *pq_globals)
70 pq_globals->global_value = 0;
71 pq_globals->global_string = NULL;
76 static zend_class_entry
*php_pqconn_class_entry
;
77 static zend_class_entry
*php_pqtypes_class_entry
;
78 static zend_class_entry
*php_pqres_class_entry
;
79 static zend_class_entry
*php_pqstm_class_entry
;
80 static zend_class_entry
*php_pqtxn_class_entry
;
81 static zend_class_entry
*php_pqcancel_class_entry
;
82 static zend_class_entry
*php_pqevent_class_entry
;
83 static zend_class_entry
*php_pqlob_class_entry
;
84 static zend_class_entry
*php_pqcopy_class_entry
;
86 static zend_object_handlers php_pqconn_object_handlers
;
87 static zend_object_handlers php_pqtypes_object_handlers
;
88 static zend_object_handlers php_pqres_object_handlers
;
89 static zend_object_handlers php_pqstm_object_handlers
;
90 static zend_object_handlers php_pqtxn_object_handlers
;
91 static zend_object_handlers php_pqcancel_object_handlers
;
92 static zend_object_handlers php_pqevent_object_handlers
;
93 static zend_object_handlers php_pqlob_object_handlers
;
94 static zend_object_handlers php_pqcopy_object_handlers
;
96 typedef struct php_pq_callback
{
98 zend_fcall_info_cache fcc
;
102 typedef struct php_pq_object
{
104 zend_object_value zv
;
105 HashTable
*prophandler
;
109 typedef struct php_pqconn
{
111 int (*poller
)(PGconn
*);
113 HashTable eventhandlers
;
114 php_pq_callback_t onevent
;
115 unsigned unbuffered
:1;
118 typedef struct php_pqconn_object
{
120 zend_object_value zv
;
121 HashTable
*prophandler
;
122 php_pqconn_t
*intern
;
123 } php_pqconn_object_t
;
125 typedef struct php_pqtypes
{
127 php_pqconn_object_t
*conn
;
130 typedef struct php_pqtypes_object
{
132 zend_object_value zv
;
133 HashTable
*prophandler
;
134 php_pqtypes_t
*intern
;
135 } php_pqtypes_object_t
;
137 typedef struct php_pqconn_event_data
{
138 php_pqconn_object_t
*obj
;
142 } php_pqconn_event_data_t
;
144 typedef enum php_pqres_fetch
{
145 PHP_PQRES_FETCH_ARRAY
,
146 PHP_PQRES_FETCH_ASSOC
,
147 PHP_PQRES_FETCH_OBJECT
150 typedef struct php_pqres_iterator
{
151 zend_object_iterator zi
;
154 php_pqres_fetch_t fetch_type
;
155 } php_pqres_iterator_t
;
157 typedef struct php_pqres
{
159 php_pqres_iterator_t
*iter
;
162 typedef struct php_pqres_object
{
164 zend_object_value zv
;
165 HashTable
*prophandler
;
167 } php_pqres_object_t
;
169 typedef struct php_pqstm
{
170 php_pqconn_object_t
*conn
;
174 typedef struct php_pqstm_object
{
176 zend_object_value zv
;
177 HashTable
*prophandler
;
179 } php_pqstm_object_t
;
181 typedef enum php_pqtxn_isolation
{
182 PHP_PQTXN_READ_COMMITTED
,
183 PHP_PQTXN_REPEATABLE_READ
,
184 PHP_PQTXN_SERIALIZABLE
,
185 } php_pqtxn_isolation_t
;
187 typedef struct php_pqtxn
{
188 php_pqconn_object_t
*conn
;
189 php_pqtxn_isolation_t isolation
;
192 unsigned deferrable
:1;
195 typedef struct php_pqtxn_object
{
197 zend_object_value zv
;
198 HashTable
*prophandler
;
200 } php_pqtxn_object_t
;
202 typedef struct php_pqcancel
{
204 php_pqconn_object_t
*conn
;
207 typedef struct php_pqcancel_object
{
209 zend_object_value zv
;
210 HashTable
*prophandler
;
211 php_pqcancel_t
*intern
;
212 } php_pqcancel_object_t
;
214 typedef struct php_pqevent
{
215 php_pq_callback_t cb
;
216 php_pqconn_object_t
*conn
;
220 typedef struct php_pqevent_object
{
222 zend_object_value zv
;
223 HashTable
*prophandler
;
224 php_pqevent_t
*intern
;
225 } php_pqevent_object_t
;
227 typedef struct php_pqlob
{
230 php_pqtxn_object_t
*txn
;
233 typedef struct php_pqlob_object
{
235 zend_object_value zv
;
236 HashTable
*prophandler
;
238 } php_pqlob_object_t
;
240 typedef enum php_pqcopy_direction
{
241 PHP_PQCOPY_FROM_STDIN
,
243 } php_pqcopy_direction_t
;
245 typedef enum php_pqcopy_status
{
249 } php_pqcopy_status_t
;
251 typedef struct php_pqcopy
{
252 php_pqcopy_direction_t direction
;
255 php_pqconn_object_t
*conn
;
258 typedef struct php_pqcopy_object
{
260 zend_object_value zv
;
261 HashTable
*prophandler
;
262 php_pqcopy_t
*intern
;
263 } php_pqcopy_object_t
;
265 static HashTable php_pqconn_object_prophandlers
;
266 static HashTable php_pqtypes_object_prophandlers
;
267 static HashTable php_pqres_object_prophandlers
;
268 static HashTable php_pqstm_object_prophandlers
;
269 static HashTable php_pqtxn_object_prophandlers
;
270 static HashTable php_pqcancel_object_prophandlers
;
271 static HashTable php_pqevent_object_prophandlers
;
272 static HashTable php_pqlob_object_prophandlers
;
273 static HashTable php_pqcopy_object_prophandlers
;
275 typedef void (*php_pq_object_prophandler_func_t
)(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
);
277 typedef struct php_pq_object_prophandler
{
278 php_pq_object_prophandler_func_t read
;
279 php_pq_object_prophandler_func_t write
;
280 } php_pq_object_prophandler_t
;
282 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
284 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
286 php_pqres_iterator_t
*iter
;
287 zval
*prop
, *zfetch_type
;
289 iter
= ecalloc(1, sizeof(*iter
));
290 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
291 iter
->zi
.data
= object
;
294 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
295 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
296 convert_to_long_ex(&zfetch_type
);
298 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
299 if (zfetch_type
!= prop
) {
300 zval_ptr_dtor(&zfetch_type
);
302 if (Z_REFCOUNT_P(prop
)) {
303 zval_ptr_dtor(&prop
);
309 return (zend_object_iterator
*) iter
;
312 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
314 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
316 if (iter
->current_val
) {
317 zval_ptr_dtor(&iter
->current_val
);
318 iter
->current_val
= NULL
;
320 zval_ptr_dtor((zval
**) &iter
->zi
.data
);
324 static STATUS
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
326 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
327 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
329 if (PQresultStatus(obj
->intern
->res
) != PGRES_TUPLES_OK
) {
332 if (PQntuples(obj
->intern
->res
) <= iter
->index
) {
339 static zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type
, zval
**data_ptr TSRMLS_DC
)
349 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
359 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
360 if (PQgetisnull(res
, row
, c
)) {
361 switch (fetch_type
) {
362 case PHP_PQRES_FETCH_OBJECT
:
363 add_property_null(data
, PQfname(res
, c
));
366 case PHP_PQRES_FETCH_ASSOC
:
367 add_assoc_null(data
, PQfname(res
, c
));
370 case PHP_PQRES_FETCH_ARRAY
:
371 add_index_null(data
, c
);
375 char *val
= PQgetvalue(res
, row
, c
);
376 int len
= PQgetlength(res
, row
, c
);
378 switch (fetch_type
) {
379 case PHP_PQRES_FETCH_OBJECT
:
380 add_property_stringl(data
, PQfname(res
, c
), val
, len
, 1);
383 case PHP_PQRES_FETCH_ASSOC
:
384 add_assoc_stringl(data
, PQfname(res
, c
), val
, len
, 1);
387 case PHP_PQRES_FETCH_ARRAY
:
388 add_index_stringl(data
, c
, val
, len
,1);
397 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
399 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
400 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
402 if (iter
->current_val
) {
403 zval_ptr_dtor(&iter
->current_val
);
405 iter
->current_val
= php_pqres_row_to_zval(obj
->intern
->res
, iter
->index
, iter
->fetch_type
, NULL TSRMLS_CC
);
406 *data_ptr
= &iter
->current_val
;
409 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
411 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
413 *key_num
= (ulong
) iter
->index
;
415 return HASH_KEY_IS_LONG
;
418 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
420 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
425 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
427 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
432 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
433 php_pqres_iterator_dtor
,
434 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
435 php_pqres_iterator_valid
,
436 /* fetch the item data for the current element */
437 php_pqres_iterator_current
,
438 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
439 php_pqres_iterator_key
,
440 /* step forwards to next element */
441 php_pqres_iterator_next
,
442 /* rewind to start of data (optional, may be NULL) */
443 php_pqres_iterator_rewind
,
444 /* invalidate current value/key (optional, may be NULL) */
448 static int php_pqres_count_elements(zval
*object
, long *count TSRMLS_DC
)
450 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
453 *count
= (long) PQntuples(obj
->intern
->res
);
460 static STATUS
php_pqres_success(PGresult
*res TSRMLS_DC
)
462 switch (PQresultStatus(res
)) {
463 case PGRES_BAD_RESPONSE
:
464 case PGRES_NONFATAL_ERROR
:
465 case PGRES_FATAL_ERROR
:
466 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "%s", PHP_PQresultErrorMessage(res
));
473 static void php_pq_callback_dtor(php_pq_callback_t
*cb
) {
474 if (cb
->fci
.size
> 0) {
475 zend_fcall_info_args_clear(&cb
->fci
, 1);
476 zval_ptr_dtor(&cb
->fci
.function_name
);
477 if (cb
->fci
.object_ptr
) {
478 zval_ptr_dtor(&cb
->fci
.object_ptr
);
484 static void php_pq_callback_addref(php_pq_callback_t
*cb
)
486 Z_ADDREF_P(cb
->fci
.function_name
);
487 if (cb
->fci
.object_ptr
) {
488 Z_ADDREF_P(cb
->fci
.object_ptr
);
492 static void php_pq_object_to_zval(void *o
, zval
**zv TSRMLS_DC
)
494 php_pq_object_t
*obj
= o
;
500 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
502 (*zv
)->type
= IS_OBJECT
;
503 (*zv
)->value
.obj
= obj
->zv
;
506 static void php_pq_object_addref(void *o TSRMLS_DC
)
508 php_pq_object_t
*obj
= o
;
509 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
512 static void php_pq_object_delref(void *o TSRMLS_DC
)
514 php_pq_object_t
*obj
= o
;
515 zend_objects_store_del_ref_by_handle_ex(obj
->zv
.handle
, obj
->zv
.handlers TSRMLS_CC
);
518 static void php_pqconn_object_free(void *o TSRMLS_DC
)
520 php_pqconn_object_t
*obj
= o
;
523 PQfinish(obj
->intern
->conn
);
524 php_pq_callback_dtor(&obj
->intern
->onevent
);
525 zend_hash_destroy(&obj
->intern
->listeners
);
526 zend_hash_destroy(&obj
->intern
->eventhandlers
);
530 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
534 static void php_pqtypes_object_free(void *o TSRMLS_DC
)
536 php_pqtypes_object_t
*obj
= o
;
539 zend_hash_destroy(&obj
->intern
->types
);
540 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
544 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
548 static void php_pqres_object_free(void *o TSRMLS_DC
)
550 php_pqres_object_t
*obj
= o
;
553 if (obj
->intern
->res
) {
554 zval
*res
= PQresultInstanceData(obj
->intern
->res
, php_pqconn_event
);
556 if (1 == Z_REFCOUNT_P(res
)) {
557 PQresultSetInstanceData(obj
->intern
->res
, php_pqconn_event
, NULL
);
561 PQclear(obj
->intern
->res
);
562 obj
->intern
->res
= NULL
;
566 if (obj
->intern
->iter
) {
567 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
568 obj
->intern
->iter
= NULL
;
574 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
578 static void php_pqstm_object_free(void *o TSRMLS_DC
)
580 php_pqstm_object_t
*obj
= o
;
583 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
584 efree(obj
->intern
->name
);
588 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
592 static void php_pqtxn_object_free(void *o TSRMLS_DC
)
594 php_pqtxn_object_t
*obj
= o
;
597 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
601 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
605 static void php_pqcancel_object_free(void *o TSRMLS_DC
)
607 php_pqcancel_object_t
*obj
= o
;
610 PQfreeCancel(obj
->intern
->cancel
);
611 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
615 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
619 static void php_pqevent_object_free(void *o TSRMLS_DC
)
621 php_pqevent_object_t
*obj
= o
;
624 php_pq_callback_dtor(&obj
->intern
->cb
);
625 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
626 efree(obj
->intern
->type
);
630 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
634 static void php_pqlob_object_free(void *o TSRMLS_DC
)
636 php_pqlob_object_t
*obj
= o
;
639 if (obj
->intern
->lofd
) {
640 lo_close(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
642 php_pq_object_delref(obj
->intern
->txn TSRMLS_CC
);
646 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
650 static void php_pqcopy_object_free(void *o TSRMLS_DC
)
652 php_pqcopy_object_t
*obj
= o
;
655 efree(obj
->intern
->expression
);
656 efree(obj
->intern
->options
);
657 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
661 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
665 static zend_object_value
php_pqconn_create_object_ex(zend_class_entry
*ce
, php_pqconn_t
*intern
, php_pqconn_object_t
**ptr TSRMLS_DC
)
667 php_pqconn_object_t
*o
;
669 o
= ecalloc(1, sizeof(*o
));
670 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
671 object_properties_init((zend_object
*) o
, ce
);
672 o
->prophandler
= &php_pqconn_object_prophandlers
;
682 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqconn_object_free
, NULL TSRMLS_CC
);
683 o
->zv
.handlers
= &php_pqconn_object_handlers
;
688 static zend_object_value
php_pqtypes_create_object_ex(zend_class_entry
*ce
, php_pqtypes_t
*intern
, php_pqtypes_object_t
**ptr TSRMLS_DC
)
690 php_pqtypes_object_t
*o
;
692 o
= ecalloc(1, sizeof(*o
));
693 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
694 object_properties_init((zend_object
*) o
, ce
);
695 o
->prophandler
= &php_pqtypes_object_prophandlers
;
705 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtypes_object_free
, NULL TSRMLS_CC
);
706 o
->zv
.handlers
= &php_pqtypes_object_handlers
;
711 static zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, php_pqres_t
*intern
, php_pqres_object_t
**ptr TSRMLS_DC
)
713 php_pqres_object_t
*o
;
715 o
= ecalloc(1, sizeof(*o
));
716 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
717 object_properties_init((zend_object
*) o
, ce
);
718 o
->prophandler
= &php_pqres_object_prophandlers
;
728 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
729 o
->zv
.handlers
= &php_pqres_object_handlers
;
734 static zend_object_value
php_pqstm_create_object_ex(zend_class_entry
*ce
, php_pqstm_t
*intern
, php_pqstm_object_t
**ptr TSRMLS_DC
)
736 php_pqstm_object_t
*o
;
738 o
= ecalloc(1, sizeof(*o
));
739 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
740 object_properties_init((zend_object
*) o
, ce
);
741 o
->prophandler
= &php_pqstm_object_prophandlers
;
751 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqstm_object_free
, NULL TSRMLS_CC
);
752 o
->zv
.handlers
= &php_pqstm_object_handlers
;
757 static zend_object_value
php_pqtxn_create_object_ex(zend_class_entry
*ce
, php_pqtxn_t
*intern
, php_pqtxn_object_t
**ptr TSRMLS_DC
)
759 php_pqtxn_object_t
*o
;
761 o
= ecalloc(1, sizeof(*o
));
762 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
763 object_properties_init((zend_object
*) o
, ce
);
764 o
->prophandler
= &php_pqtxn_object_prophandlers
;
774 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtxn_object_free
, NULL TSRMLS_CC
);
775 o
->zv
.handlers
= &php_pqtxn_object_handlers
;
780 static zend_object_value
php_pqcancel_create_object_ex(zend_class_entry
*ce
, php_pqcancel_t
*intern
, php_pqcancel_object_t
**ptr TSRMLS_DC
)
782 php_pqcancel_object_t
*o
;
784 o
= ecalloc(1, sizeof(*o
));
785 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
786 object_properties_init((zend_object
*) o
, ce
);
787 o
->prophandler
= &php_pqcancel_object_prophandlers
;
797 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcancel_object_free
, NULL TSRMLS_CC
);
798 o
->zv
.handlers
= &php_pqcancel_object_handlers
;
803 static zend_object_value
php_pqevent_create_object_ex(zend_class_entry
*ce
, php_pqevent_t
*intern
, php_pqevent_object_t
**ptr TSRMLS_DC
)
805 php_pqevent_object_t
*o
;
807 o
= ecalloc(1, sizeof(*o
));
808 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
809 object_properties_init((zend_object
*) o
, ce
);
810 o
->prophandler
= &php_pqevent_object_prophandlers
;
820 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqevent_object_free
, NULL TSRMLS_CC
);
821 o
->zv
.handlers
= &php_pqevent_object_handlers
;
826 static zend_object_value
php_pqlob_create_object_ex(zend_class_entry
*ce
, php_pqlob_t
*intern
, php_pqlob_object_t
**ptr TSRMLS_DC
)
828 php_pqlob_object_t
*o
;
830 o
= ecalloc(1, sizeof(*o
));
831 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
832 object_properties_init((zend_object
*) o
, ce
);
833 o
->prophandler
= &php_pqlob_object_prophandlers
;
843 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqlob_object_free
, NULL TSRMLS_CC
);
844 o
->zv
.handlers
= &php_pqlob_object_handlers
;
849 static zend_object_value
php_pqcopy_create_object_ex(zend_class_entry
*ce
, php_pqcopy_t
*intern
, php_pqcopy_object_t
**ptr TSRMLS_DC
)
851 php_pqcopy_object_t
*o
;
853 o
= ecalloc(1, sizeof(*o
));
854 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
855 object_properties_init((zend_object
*) o
, ce
);
856 o
->prophandler
= &php_pqcopy_object_prophandlers
;
866 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcopy_object_free
, NULL TSRMLS_CC
);
867 o
->zv
.handlers
= &php_pqcopy_object_handlers
;
872 static zend_object_value
php_pqconn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
874 return php_pqconn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
877 static zend_object_value
php_pqtypes_create_object(zend_class_entry
*class_type TSRMLS_DC
)
879 return php_pqtypes_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
882 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
884 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
887 static zend_object_value
php_pqstm_create_object(zend_class_entry
*class_type TSRMLS_DC
)
889 return php_pqstm_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
892 static zend_object_value
php_pqtxn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
894 return php_pqtxn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
897 static zend_object_value
php_pqcancel_create_object(zend_class_entry
*class_type TSRMLS_DC
)
899 return php_pqcancel_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
902 static zend_object_value
php_pqevent_create_object(zend_class_entry
*class_type TSRMLS_DC
)
904 return php_pqevent_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
907 static zend_object_value
php_pqlob_create_object(zend_class_entry
*class_type TSRMLS_DC
)
909 return php_pqlob_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
912 static zend_object_value
php_pqcopy_create_object(zend_class_entry
*class_type TSRMLS_DC
)
914 return php_pqcopy_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
917 static int apply_ph_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
919 php_pq_object_prophandler_t
*ph
= p
;
920 HashTable
*ht
= va_arg(argv
, HashTable
*);
921 zval
**return_value
, *object
= va_arg(argv
, zval
*);
922 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
924 if (SUCCESS
== zend_hash_find(ht
, key
->arKey
, key
->nKeyLength
, (void *) &return_value
)) {
927 zval_ptr_dtor(return_value
);
928 MAKE_STD_ZVAL(*return_value
);
929 ZVAL_NULL(*return_value
);
931 ph
->read(object
, obj
, *return_value TSRMLS_CC
);
935 return ZEND_HASH_APPLY_KEEP
;
938 static int apply_pi_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
940 zend_property_info
*pi
= p
;
941 HashTable
*ht
= va_arg(argv
, HashTable
*);
942 zval
*object
= va_arg(argv
, zval
*);
943 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
944 zval
*property
= zend_read_property(obj
->zo
.ce
, object
, pi
->name
, pi
->name_length
, 0 TSRMLS_CC
);
946 if (1||!Z_REFCOUNT_P(property
)) {
947 Z_ADDREF_P(property
);
949 zend_hash_add(ht
, pi
->name
, pi
->name_length
+ 1, (void *) &property
, sizeof(zval
*), NULL
);
951 return ZEND_HASH_APPLY_KEEP
;
954 static HashTable
*php_pq_object_debug_info(zval
*object
, int *temp TSRMLS_DC
)
957 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
961 ZEND_INIT_SYMTABLE(ht
);
963 zend_hash_apply_with_arguments(&obj
->zo
.ce
->properties_info TSRMLS_CC
, apply_pi_to_debug
, 3, ht
, object
, obj
);
964 zend_hash_apply_with_arguments(obj
->prophandler TSRMLS_CC
, apply_ph_to_debug
, 3, ht
, object
, obj
);
969 static void php_pqconn_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
971 php_pqconn_object_t
*obj
= o
;
973 RETVAL_LONG(PQstatus(obj
->intern
->conn
));
976 static void php_pqconn_object_read_transaction_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
978 php_pqconn_object_t
*obj
= o
;
980 RETVAL_LONG(PQtransactionStatus(obj
->intern
->conn
));
983 static void php_pqconn_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
985 php_pqconn_object_t
*obj
= o
;
986 char *error
= PHP_PQerrorMessage(obj
->intern
->conn
);
989 RETVAL_STRING(error
, 1);
995 static int apply_notify_listener(void *p
, void *arg TSRMLS_DC
)
997 php_pq_callback_t
*listener
= p
;
999 zval
*zpid
, *zchannel
, *zmessage
;
1001 MAKE_STD_ZVAL(zpid
);
1002 ZVAL_LONG(zpid
, nfy
->be_pid
);
1003 MAKE_STD_ZVAL(zchannel
);
1004 ZVAL_STRING(zchannel
, nfy
->relname
, 1);
1005 MAKE_STD_ZVAL(zmessage
);
1006 ZVAL_STRING(zmessage
, nfy
->extra
, 1);
1008 zend_fcall_info_argn(&listener
->fci TSRMLS_CC
, 3, &zchannel
, &zmessage
, &zpid
);
1009 zend_fcall_info_call(&listener
->fci
, &listener
->fcc
, NULL
, NULL TSRMLS_CC
);
1011 zval_ptr_dtor(&zchannel
);
1012 zval_ptr_dtor(&zmessage
);
1013 zval_ptr_dtor(&zpid
);
1015 return ZEND_HASH_APPLY_KEEP
;
1018 static int apply_notify_listeners(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
1020 HashTable
*listeners
= p
;
1021 PGnotify
*nfy
= va_arg(argv
, PGnotify
*);
1023 if (0 == fnmatch(key
->arKey
, nfy
->relname
, 0)) {
1024 zend_hash_apply_with_argument(listeners
, apply_notify_listener
, nfy TSRMLS_CC
);
1027 return ZEND_HASH_APPLY_KEEP
;
1030 static void php_pqconn_notify_listeners(php_pqconn_object_t
*obj TSRMLS_DC
)
1034 while ((nfy
= PQnotifies(obj
->intern
->conn
))) {
1035 zend_hash_apply_with_arguments(&obj
->intern
->listeners TSRMLS_CC
, apply_notify_listeners
, 1, nfy
);
1040 static void php_pqconn_object_read_busy(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1042 php_pqconn_object_t
*obj
= o
;
1044 RETVAL_BOOL(PQisBusy(obj
->intern
->conn
));
1047 static void php_pqconn_object_read_encoding(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1049 php_pqconn_object_t
*obj
= o
;
1051 RETVAL_STRING(pg_encoding_to_char(PQclientEncoding(obj
->intern
->conn
)), 1);
1054 static void php_pqconn_object_write_encoding(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1056 php_pqconn_object_t
*obj
= o
;
1059 if (Z_TYPE_P(value
) != IS_STRING
) {
1060 convert_to_string_ex(&zenc
);
1063 if (0 > PQsetClientEncoding(obj
->intern
->conn
, Z_STRVAL_P(zenc
))) {
1064 zend_error(E_NOTICE
, "Unrecognized encoding '%s'", Z_STRVAL_P(zenc
));
1067 if (zenc
!= value
) {
1068 zval_ptr_dtor(&zenc
);
1072 static void php_pqconn_object_read_unbuffered(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1074 php_pqconn_object_t
*obj
= o
;
1076 RETVAL_BOOL(obj
->intern
->unbuffered
);
1079 static void php_pqconn_object_write_unbuffered(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1081 php_pqconn_object_t
*obj
= o
;
1083 obj
->intern
->unbuffered
= zend_is_true(value
);
1086 static void php_pqconn_object_read_db(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1088 php_pqconn_object_t
*obj
= o
;
1089 char *db
= PQdb(obj
->intern
->conn
);
1092 RETVAL_STRING(db
, 1);
1094 RETVAL_EMPTY_STRING();
1098 static void php_pqconn_object_read_user(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1100 php_pqconn_object_t
*obj
= o
;
1101 char *user
= PQuser(obj
->intern
->conn
);
1104 RETVAL_STRING(user
, 1);
1106 RETVAL_EMPTY_STRING();
1110 static void php_pqconn_object_read_pass(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1112 php_pqconn_object_t
*obj
= o
;
1113 char *pass
= PQpass(obj
->intern
->conn
);
1116 RETVAL_STRING(pass
, 1);
1118 RETVAL_EMPTY_STRING();
1122 static void php_pqconn_object_read_host(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1124 php_pqconn_object_t
*obj
= o
;
1125 char *host
= PQhost(obj
->intern
->conn
);
1128 RETVAL_STRING(host
, 1);
1130 RETVAL_EMPTY_STRING();
1134 static void php_pqconn_object_read_port(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1136 php_pqconn_object_t
*obj
= o
;
1137 char *port
= PQport(obj
->intern
->conn
);
1140 RETVAL_STRING(port
, 1);
1142 RETVAL_EMPTY_STRING();
1146 static void php_pqconn_object_read_options(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1148 php_pqconn_object_t
*obj
= o
;
1149 char *options
= PQoptions(obj
->intern
->conn
);
1152 RETVAL_STRING(options
, 1);
1154 RETVAL_EMPTY_STRING();
1158 static void php_pqtypes_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1160 php_pqtypes_object_t
*obj
= o
;
1162 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1165 static int has_dimension(HashTable
*ht
, zval
*member
, char **key_str
, int *key_len
, long *index TSRMLS_DC
)
1170 switch (Z_TYPE_P(member
)) {
1172 convert_to_string_ex(&tmp
);
1175 if (!is_numeric_string(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
), &lval
, NULL
, 0)) {
1176 if (member
!= tmp
) {
1177 zval_ptr_dtor(&tmp
);
1180 *key_str
= estrndup(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
));
1182 *key_len
= Z_STRLEN_P(tmp
) + 1;
1185 return zend_hash_exists(ht
, Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
) + 1);
1189 lval
= Z_LVAL_P(member
);
1193 if (member
!= tmp
) {
1194 zval_ptr_dtor(&tmp
);
1199 return zend_hash_index_exists(ht
, lval
);
1202 static int php_pqtypes_object_has_dimension(zval
*object
, zval
*member
, int check_empty TSRMLS_DC
)
1204 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1205 char *key_str
= NULL
;
1210 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1213 if (key_str
&& key_len
) {
1214 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1216 return Z_TYPE_PP(data
) != IS_NULL
;
1220 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) data
)) {
1221 return Z_TYPE_PP(data
) != IS_NULL
;
1226 return has_dimension(&obj
->intern
->types
, member
, NULL
, NULL
, NULL TSRMLS_CC
);
1232 static zval
*php_pqtypes_object_read_dimension(zval
*object
, zval
*member
, int type TSRMLS_DC
)
1235 char *key_str
= NULL
;
1237 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1239 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1242 if (key_str
&& key_len
) {
1243 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1248 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) &data
)) {
1257 static void php_pqres_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1259 php_pqres_object_t
*obj
= o
;
1261 RETVAL_LONG(PQresultStatus(obj
->intern
->res
));
1264 static void php_pqres_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1266 php_pqres_object_t
*obj
= o
;
1267 char *error
= PHP_PQresultErrorMessage(obj
->intern
->res
);
1270 RETVAL_STRING(error
, 1);
1276 static void php_pqres_object_read_num_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1278 php_pqres_object_t
*obj
= o
;
1280 RETVAL_LONG(PQntuples(obj
->intern
->res
));
1283 static void php_pqres_object_read_num_cols(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1285 php_pqres_object_t
*obj
= o
;
1287 RETVAL_LONG(PQnfields(obj
->intern
->res
));
1290 static void php_pqres_object_read_affected_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1292 php_pqres_object_t
*obj
= o
;
1294 RETVAL_LONG(atoi(PQcmdTuples(obj
->intern
->res
)));
1297 static void php_pqres_object_read_fetch_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1299 php_pqres_object_t
*obj
= o
;
1301 if (obj
->intern
->iter
) {
1302 RETVAL_LONG(obj
->intern
->iter
->fetch_type
);
1304 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
1308 static void php_pqres_object_write_fetch_type(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1310 php_pqres_object_t
*obj
= o
;
1311 zval
*zfetch_type
= value
;
1313 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
1314 convert_to_long_ex(&zfetch_type
);
1317 if (!obj
->intern
->iter
) {
1318 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
1319 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
1321 obj
->intern
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
1323 if (zfetch_type
!= value
) {
1324 zval_ptr_dtor(&zfetch_type
);
1328 static void php_pqstm_object_read_name(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1330 php_pqstm_object_t
*obj
= o
;
1332 RETVAL_STRING(obj
->intern
->name
, 1);
1335 static void php_pqstm_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1337 php_pqstm_object_t
*obj
= o
;
1339 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1342 static void php_pqtxn_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1344 php_pqtxn_object_t
*obj
= o
;
1346 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1349 static void php_pqtxn_object_read_isolation(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1351 php_pqtxn_object_t
*obj
= o
;
1353 RETVAL_LONG(obj
->intern
->isolation
);
1356 static void php_pqtxn_object_read_readonly(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1358 php_pqtxn_object_t
*obj
= o
;
1360 RETVAL_LONG(obj
->intern
->readonly
);
1363 static void php_pqtxn_object_read_deferrable(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1365 php_pqtxn_object_t
*obj
= o
;
1367 RETVAL_LONG(obj
->intern
->deferrable
);
1370 static void php_pqtxn_object_write_isolation(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1372 php_pqtxn_object_t
*obj
= o
;
1373 php_pqtxn_isolation_t orig
= obj
->intern
->isolation
;
1374 zval
*zisolation
= value
;
1377 if (Z_TYPE_P(zisolation
) != IS_LONG
) {
1378 convert_to_long_ex(&zisolation
);
1381 switch ((obj
->intern
->isolation
= Z_LVAL_P(zisolation
))) {
1382 case PHP_PQTXN_READ_COMMITTED
:
1383 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ COMMITED");
1385 case PHP_PQTXN_REPEATABLE_READ
:
1386 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION REPEATABLE READ");
1388 case PHP_PQTXN_SERIALIZABLE
:
1389 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION SERIALIZABLE");
1392 obj
->intern
->isolation
= orig
;
1397 if (zisolation
!= value
) {
1398 zval_ptr_dtor(&zisolation
);
1402 php_pqres_success(res TSRMLS_CC
);
1407 static void php_pqtxn_object_write_readonly(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1409 php_pqtxn_object_t
*obj
= o
;
1412 if ((obj
->intern
->readonly
= zend_is_true(value
))) {
1413 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ ONLY");
1415 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ WRITE");
1419 php_pqres_success(res TSRMLS_CC
);
1424 static void php_pqtxn_object_write_deferrable(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1426 php_pqtxn_object_t
*obj
= o
;
1429 if ((obj
->intern
->deferrable
= zend_is_true(value
))) {
1430 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION DEFERRABLE");
1432 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION NOT DEFERRABLE");
1436 php_pqres_success(res TSRMLS_CC
);
1441 static void php_pqcancel_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1443 php_pqcancel_object_t
*obj
= o
;
1445 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1448 static void php_pqevent_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1450 php_pqevent_object_t
*obj
= o
;
1452 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1455 static void php_pqevent_object_read_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1457 php_pqevent_object_t
*obj
= o
;
1459 RETVAL_STRING(obj
->intern
->type
, 1);
1462 static void php_pqlob_object_read_transaction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1464 php_pqlob_object_t
*obj
= o
;
1466 php_pq_object_to_zval(obj
->intern
->txn
, &return_value TSRMLS_CC
);
1469 static void php_pqlob_object_read_oid(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1471 php_pqlob_object_t
*obj
= o
;
1473 RETVAL_LONG(obj
->intern
->loid
);
1476 static void php_pqcopy_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1478 php_pqcopy_object_t
*obj
= o
;
1480 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1483 static void php_pqcopy_object_read_direction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1485 php_pqcopy_object_t
*obj
= o
;
1487 RETVAL_LONG(obj
->intern
->direction
);
1490 static void php_pqcopy_object_read_expression(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1492 php_pqcopy_object_t
*obj
= o
;
1494 RETURN_STRING(obj
->intern
->expression
, 1);
1497 static void php_pqcopy_object_read_options(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1499 php_pqcopy_object_t
*obj
= o
;
1501 RETURN_STRING(obj
->intern
->options
, 1);
1504 static zend_class_entry
*ancestor(zend_class_entry
*ce
) {
1505 while (ce
->parent
) {
1511 static zval
*php_pq_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
1513 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1514 php_pq_object_prophandler_t
*handler
;
1518 zend_error(E_WARNING
, "%s not initialized", ancestor(obj
->zo
.ce
)->name
);
1519 } else if ((SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) && handler
->read
) {
1520 if (type
== BP_VAR_R
) {
1521 ALLOC_ZVAL(return_value
);
1522 Z_SET_REFCOUNT_P(return_value
, 0);
1523 Z_UNSET_ISREF_P(return_value
);
1525 handler
->read(object
, obj
, return_value TSRMLS_CC
);
1527 zend_error(E_ERROR
, "Cannot access %s properties by reference or array key/index", ancestor(obj
->zo
.ce
)->name
);
1528 return_value
= NULL
;
1531 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
1534 return return_value
;
1537 static void php_pq_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
1539 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1540 php_pq_object_prophandler_t
*handler
;
1542 if (SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
1543 if (handler
->write
) {
1544 handler
->write(object
, obj
, value TSRMLS_CC
);
1547 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
1551 static STATUS
php_pqconn_update_socket(zval
*this_ptr
, php_pqconn_object_t
*obj TSRMLS_DC
)
1553 zval
*zsocket
, zmember
;
1559 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1562 INIT_PZVAL(&zmember
);
1563 ZVAL_STRINGL(&zmember
, "socket", sizeof("socket")-1, 0);
1564 MAKE_STD_ZVAL(zsocket
);
1566 if ((CONNECTION_BAD
!= PQstatus(obj
->intern
->conn
))
1567 && (-1 < (socket
= PQsocket(obj
->intern
->conn
)))
1568 && (stream
= php_stream_fopen_from_fd(socket
, "r+b", NULL
))) {
1569 php_stream_to_zval(stream
, zsocket
);
1575 zend_get_std_object_handlers()->write_property(getThis(), &zmember
, zsocket
, NULL TSRMLS_CC
);
1576 zval_ptr_dtor(&zsocket
);
1582 # define TSRMLS_DF(d) TSRMLS_D = (d)->ts
1583 # define TSRMLS_CF(d) (d)->ts = TSRMLS_C
1585 # define TSRMLS_DF(d)
1586 # define TSRMLS_CF(d)
1589 static void php_pqconn_event_register(PGEventRegister
*event
, php_pqconn_event_data_t
*data
)
1591 PQsetInstanceData(event
->conn
, php_pqconn_event
, data
);
1594 static void php_pqconn_event_conndestroy(PGEventConnDestroy
*event
, php_pqconn_event_data_t
*data
)
1596 PQsetInstanceData(event
->conn
, php_pqconn_event
, NULL
);
1600 static int apply_event(void *p
, void *a TSRMLS_DC
)
1604 zval
*retval
= NULL
;
1606 zend_call_method_with_1_params(evh
, Z_OBJCE_PP(evh
), NULL
, "trigger", &retval
, args
);
1608 zval_ptr_dtor(&retval
);
1611 return ZEND_HASH_APPLY_KEEP
;
1614 static void php_pqconn_event_connreset(PGEventConnReset
*event
, php_pqconn_event_data_t
*data
)
1619 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("reset"), (void *) &evhs
)) {
1620 zval
*args
, *connection
= NULL
;
1622 MAKE_STD_ZVAL(args
);
1624 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1625 add_next_index_zval(args
, connection
);
1626 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1627 zval_ptr_dtor(&args
);
1631 static zval
*result_instance_zval(PGresult
*res TSRMLS_DC
)
1633 zval
*rid
= PQresultInstanceData(res
, php_pqconn_event
);
1636 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1640 rid
->type
= IS_OBJECT
;
1641 rid
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1643 PQresultSetInstanceData(res
, php_pqconn_event
, rid
);
1650 static void php_pqconn_event_resultcreate(PGEventResultCreate
*event
, php_pqconn_event_data_t
*data
)
1655 /* event listener */
1656 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("result"), (void *) &evhs
)) {
1657 zval
*args
, *connection
= NULL
, *res
= result_instance_zval(event
->result TSRMLS_CC
);
1659 MAKE_STD_ZVAL(args
);
1661 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1662 add_next_index_zval(args
, connection
);
1663 add_next_index_zval(args
, res
);
1664 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1665 zval_ptr_dtor(&args
);
1668 /* async callback */
1669 if (data
->obj
->intern
->onevent
.fci
.size
> 0) {
1670 zval
*res
= result_instance_zval(event
->result TSRMLS_CC
);
1672 zend_fcall_info_argn(&data
->obj
->intern
->onevent
.fci TSRMLS_CC
, 1, &res
);
1673 zend_fcall_info_call(&data
->obj
->intern
->onevent
.fci
, &data
->obj
->intern
->onevent
.fcc
, NULL
, NULL TSRMLS_CC
);
1674 zval_ptr_dtor(&res
);
1678 static int php_pqconn_event(PGEventId id
, void *e
, void *data
)
1681 case PGEVT_REGISTER
:
1682 php_pqconn_event_register(e
, data
);
1684 case PGEVT_CONNDESTROY
:
1685 php_pqconn_event_conndestroy(e
, data
);
1687 case PGEVT_CONNRESET
:
1688 php_pqconn_event_connreset(e
, data
);
1690 case PGEVT_RESULTCREATE
:
1691 php_pqconn_event_resultcreate(e
, data
);
1700 static php_pqconn_event_data_t
*php_pqconn_event_data_init(php_pqconn_object_t
*obj TSRMLS_DC
)
1702 php_pqconn_event_data_t
*data
= emalloc(sizeof(*data
));
1710 static void php_pqconn_notice_recv(void *p
, const PGresult
*res
)
1712 php_pqconn_event_data_t
*data
= p
;
1716 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("notice"), (void *) &evhs
)) {
1717 zval
*args
, *connection
= NULL
;
1719 MAKE_STD_ZVAL(args
);
1721 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1722 add_next_index_zval(args
, connection
);
1723 add_next_index_string(args
, PHP_PQresultErrorMessage(res
), 1);
1724 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1725 zval_ptr_dtor(&args
);
1729 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
1730 ZEND_ARG_INFO(0, dsn
)
1731 ZEND_ARG_INFO(0, async
)
1732 ZEND_END_ARG_INFO();
1733 static PHP_METHOD(pqconn
, __construct
) {
1734 zend_error_handling zeh
;
1737 zend_bool async
= 0;
1739 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1740 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|sb", &dsn_str
, &dsn_len
, &async
)) {
1741 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1742 php_pqconn_event_data_t
*data
= php_pqconn_event_data_init(obj TSRMLS_CC
);
1744 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
1746 zend_hash_init(&obj
->intern
->listeners
, 0, NULL
, (dtor_func_t
) zend_hash_destroy
, 0);
1747 zend_hash_init(&obj
->intern
->eventhandlers
, 0, NULL
, ZVAL_PTR_DTOR
, 0);
1751 obj
->intern
->conn
= PQconnectStart(dsn_str
);
1752 obj
->intern
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
1754 obj
->intern
->conn
= PQconnectdb(dsn_str
);
1757 PQsetNoticeReceiver(obj
->intern
->conn
, php_pqconn_notice_recv
, data
);
1758 PQregisterEventProc(obj
->intern
->conn
, php_pqconn_event
, "ext-pq", data
);
1760 if (SUCCESS
!= php_pqconn_update_socket(getThis(), obj TSRMLS_CC
)) {
1761 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1764 zend_restore_error_handling(&zeh TSRMLS_CC
);
1767 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
1768 ZEND_END_ARG_INFO();
1769 static PHP_METHOD(pqconn
, reset
) {
1770 if (SUCCESS
== zend_parse_parameters_none()) {
1771 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1774 PQreset(obj
->intern
->conn
);
1776 if (CONNECTION_OK
== PQstatus(obj
->intern
->conn
)) {
1779 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection reset failed: (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1782 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1788 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset_async
, 0, 0, 0)
1789 ZEND_END_ARG_INFO();
1790 static PHP_METHOD(pqconn
, resetAsync
) {
1791 if (SUCCESS
== zend_parse_parameters_none()) {
1792 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1795 if (PQresetStart(obj
->intern
->conn
)) {
1796 obj
->intern
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
1800 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1806 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
)
1808 HashTable ht
, *existing_listeners
;
1810 php_pq_callback_addref(listener
);
1812 if (SUCCESS
== zend_hash_find(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &existing_listeners
)) {
1813 zend_hash_next_index_insert(existing_listeners
, (void *) listener
, sizeof(*listener
), NULL
);
1815 zend_hash_init(&ht
, 1, NULL
, (dtor_func_t
) php_pq_callback_dtor
, 0);
1816 zend_hash_next_index_insert(&ht
, (void *) listener
, sizeof(*listener
), NULL
);
1817 zend_hash_add(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &ht
, sizeof(HashTable
), NULL
);
1821 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_listen
, 0, 0, 0)
1822 ZEND_ARG_INFO(0, channel
)
1823 ZEND_ARG_INFO(0, callable
)
1824 ZEND_END_ARG_INFO();
1825 static PHP_METHOD(pqconn
, listen
) {
1826 char *channel_str
= NULL
;
1827 int channel_len
= 0;
1828 php_pq_callback_t listener
;
1830 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sf", &channel_str
, &channel_len
, &listener
.fci
, &listener
.fcc
)) {
1831 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1833 obj
->intern
->poller
= PQconsumeInput
;
1836 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, channel_str
, channel_len
);
1838 if (quoted_channel
) {
1842 spprintf(&cmd
, 0, "LISTEN %s", channel_str
);
1843 res
= PQexec(obj
->intern
->conn
, cmd
);
1846 PQfreemem(quoted_channel
);
1849 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1850 php_pqconn_add_listener(obj
, channel_str
, channel_len
, &listener TSRMLS_CC
);
1857 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not install listener (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1861 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1863 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape channel identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1866 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1872 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_notify
, 0, 0, 2)
1873 ZEND_ARG_INFO(0, channel
)
1874 ZEND_ARG_INFO(0, message
)
1875 ZEND_END_ARG_INFO();
1876 static PHP_METHOD(pqconn
, notify
) {
1877 char *channel_str
, *message_str
;
1878 int channel_len
, message_len
;
1880 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &channel_str
, &channel_len
, &message_str
, &message_len
)) {
1881 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1885 char *params
[2] = {channel_str
, message_str
};
1887 res
= PQexecParams(obj
->intern
->conn
, "select pg_notify($1, $2)", 2, NULL
, (const char *const*) params
, NULL
, NULL
, 0);
1890 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1897 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not notify listeners (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1901 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1904 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1910 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
1911 ZEND_END_ARG_INFO();
1912 static PHP_METHOD(pqconn
, poll
) {
1913 if (SUCCESS
== zend_parse_parameters_none()) {
1914 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1917 if (obj
->intern
->poller
) {
1918 if (obj
->intern
->poller
== PQconsumeInput
) {
1919 RETVAL_LONG(obj
->intern
->poller(obj
->intern
->conn
) * PGRES_POLLING_OK
);
1920 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1923 RETURN_LONG(obj
->intern
->poller(obj
->intern
->conn
));
1926 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
1929 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1935 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
1936 ZEND_ARG_INFO(0, query
)
1937 ZEND_END_ARG_INFO();
1938 static PHP_METHOD(pqconn
, exec
) {
1939 zend_error_handling zeh
;
1943 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1944 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
1945 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1948 PGresult
*res
= PQexec(obj
->intern
->conn
, query_str
);
1950 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1953 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1954 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1957 return_value
->type
= IS_OBJECT
;
1958 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1961 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1964 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1967 zend_restore_error_handling(&zeh TSRMLS_CC
);
1970 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_get_result
, 0, 0, 0)
1971 ZEND_END_ARG_INFO();
1972 static PHP_METHOD(pqconn
, getResult
) {
1973 if (SUCCESS
== zend_parse_parameters_none()) {
1974 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1977 PGresult
*res
= PQgetResult(obj
->intern
->conn
);
1980 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1983 return_value
->type
= IS_OBJECT
;
1984 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1989 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1995 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_async
, 0, 0, 1)
1996 ZEND_ARG_INFO(0, query
)
1997 ZEND_ARG_INFO(0, callable
)
1998 ZEND_END_ARG_INFO();
1999 static PHP_METHOD(pqconn
, execAsync
) {
2000 zend_error_handling zeh
;
2001 php_pq_callback_t resolver
= {{0}};
2005 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2006 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|f", &query_str
, &query_len
, &resolver
.fci
, &resolver
.fcc
)) {
2007 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2010 php_pq_callback_dtor(&obj
->intern
->onevent
);
2011 if (resolver
.fci
.size
> 0) {
2012 obj
->intern
->onevent
= resolver
;
2013 php_pq_callback_addref(&obj
->intern
->onevent
);
2016 obj
->intern
->poller
= PQconsumeInput
;
2018 if (PQsendQuery(obj
->intern
->conn
, query_str
)) {
2019 if (obj
->intern
->unbuffered
) {
2020 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2021 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2026 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2030 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2034 zend_restore_error_handling(&zeh TSRMLS_CC
);
2037 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
2042 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
2043 convert_to_long_ex(ztype
);
2046 **types
= Z_LVAL_PP(ztype
);
2049 if (*ztype
!= *(zval
**)p
) {
2050 zval_ptr_dtor(ztype
);
2052 return ZEND_HASH_APPLY_KEEP
;
2055 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
2061 params
= (char ***) va_arg(argv
, char ***);
2062 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
2064 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
2068 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
2069 convert_to_string_ex(zparam
);
2072 **params
= Z_STRVAL_PP(zparam
);
2075 if (*zparam
!= *(zval
**)p
) {
2076 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
2079 return ZEND_HASH_APPLY_KEEP
;
2082 static int php_pq_types_to_array(HashTable
*ht
, Oid
**types TSRMLS_DC
)
2084 int count
= zend_hash_num_elements(ht
);
2091 /* +1 for when less types than params are specified */
2092 *types
= tmp
= ecalloc(count
+ 1, sizeof(Oid
));
2093 zend_hash_apply_with_argument(ht
, apply_to_oid
, &tmp TSRMLS_CC
);
2099 static int php_pq_params_to_array(HashTable
*ht
, char ***params
, HashTable
*zdtor TSRMLS_DC
)
2101 int count
= zend_hash_num_elements(ht
);
2108 *params
= tmp
= ecalloc(count
, sizeof(char *));
2109 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_param
, 2, &tmp
, zdtor
);
2115 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
2116 ZEND_ARG_INFO(0, query
)
2117 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2118 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2119 ZEND_END_ARG_INFO();
2120 static PHP_METHOD(pqconn
, execParams
) {
2121 zend_error_handling zeh
;
2125 zval
*ztypes
= NULL
;
2127 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2128 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
2129 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2135 char **params
= NULL
;
2138 ZEND_INIT_SYMTABLE(&zdtor
);
2139 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2142 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2145 res
= PQexecParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0);
2147 zend_hash_destroy(&zdtor
);
2155 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2158 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2159 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2162 return_value
->type
= IS_OBJECT
;
2163 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2166 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2170 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2174 zend_restore_error_handling(&zeh TSRMLS_CC
);
2177 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params_async
, 0, 0, 2)
2178 ZEND_ARG_INFO(0, query
)
2179 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2180 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2181 ZEND_ARG_INFO(0, callable
)
2182 ZEND_END_ARG_INFO();
2183 static PHP_METHOD(pqconn
, execParamsAsync
) {
2184 zend_error_handling zeh
;
2185 php_pq_callback_t resolver
= {{0}};
2189 zval
*ztypes
= NULL
;
2191 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2192 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!f", &query_str
, &query_len
, &zparams
, &ztypes
, &resolver
.fci
, &resolver
.fcc
)) {
2193 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2198 char **params
= NULL
;
2201 ZEND_INIT_SYMTABLE(&zdtor
);
2202 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2205 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2208 php_pq_callback_dtor(&obj
->intern
->onevent
);
2209 if (resolver
.fci
.size
> 0) {
2210 obj
->intern
->onevent
= resolver
;
2211 php_pq_callback_addref(&obj
->intern
->onevent
);
2214 obj
->intern
->poller
= PQconsumeInput
;
2216 if (PQsendQueryParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0)) {
2217 if (obj
->intern
->unbuffered
) {
2218 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2219 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2224 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2228 zend_hash_destroy(&zdtor
);
2236 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2239 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2243 zend_restore_error_handling(&zeh TSRMLS_CC
);
2246 static STATUS
php_pqconn_prepare(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2254 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2258 count
= zend_hash_num_elements(typest
);
2259 php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2262 res
= PQprepare(obj
->intern
->conn
, name
, query
, count
, types
);
2269 rv
= php_pqres_success(res TSRMLS_CC
);
2273 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2279 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
2280 ZEND_ARG_INFO(0, type
)
2281 ZEND_ARG_INFO(0, query
)
2282 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2283 ZEND_END_ARG_INFO();
2284 static PHP_METHOD(pqconn
, prepare
) {
2285 zend_error_handling zeh
;
2286 zval
*ztypes
= NULL
;
2287 char *name_str
, *query_str
;
2288 int name_len
, *query_len
;
2290 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2291 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2292 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2295 if (SUCCESS
== php_pqconn_prepare(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2296 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2298 php_pq_object_addref(obj TSRMLS_CC
);
2300 stm
->name
= estrdup(name_str
);
2302 return_value
->type
= IS_OBJECT
;
2303 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2305 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2307 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2310 zend_restore_error_handling(&zeh TSRMLS_CC
);
2313 static STATUS
php_pqconn_prepare_async(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2320 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2324 count
= php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2327 if (PQsendPrepare(obj
->intern
->conn
, name
, query
, count
, types
)) {
2328 if (obj
->intern
->unbuffered
) {
2329 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2330 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2335 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2346 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare_async
, 0, 0, 2)
2347 ZEND_ARG_INFO(0, type
)
2348 ZEND_ARG_INFO(0, query
)
2349 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2350 ZEND_END_ARG_INFO();
2351 static PHP_METHOD(pqconn
, prepareAsync
) {
2352 zend_error_handling zeh
;
2353 zval
*ztypes
= NULL
;
2354 char *name_str
, *query_str
;
2355 int name_len
, *query_len
;
2357 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2358 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2359 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2362 obj
->intern
->poller
= PQconsumeInput
;
2363 if (SUCCESS
== php_pqconn_prepare_async(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2364 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2366 php_pq_object_addref(obj TSRMLS_CC
);
2368 stm
->name
= estrdup(name_str
);
2370 return_value
->type
= IS_OBJECT
;
2371 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2373 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2375 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2378 zend_restore_error_handling(&zeh TSRMLS_CC
);
2381 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote
, 0, 0, 1)
2382 ZEND_ARG_INFO(0, string
)
2383 ZEND_END_ARG_INFO();
2384 static PHP_METHOD(pqconn
, quote
) {
2388 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2389 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2392 char *quoted
= PQescapeLiteral(obj
->intern
->conn
, str
, len
);
2395 RETVAL_STRING(quoted
, 1);
2398 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote string (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2402 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2408 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote_name
, 0, 0, 1)
2409 ZEND_ARG_INFO(0, type
)
2410 ZEND_END_ARG_INFO();
2411 static PHP_METHOD(pqconn
, quoteName
) {
2415 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2416 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2419 char *quoted
= PQescapeIdentifier(obj
->intern
->conn
, str
, len
);
2422 RETVAL_STRING(quoted
, 1);
2425 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote name (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2429 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2435 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_escape_bytea
, 0, 0, 1)
2436 ZEND_ARG_INFO(0, bytea
)
2437 ZEND_END_ARG_INFO();
2438 static PHP_METHOD(pqconn
, escapeBytea
) {
2442 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2443 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2447 char *escaped_str
= (char *) PQescapeByteaConn(obj
->intern
->conn
, (unsigned char *) str
, len
, &escaped_len
);
2450 RETVAL_STRINGL(escaped_str
, escaped_len
- 1, 1);
2451 PQfreemem(escaped_str
);
2453 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2457 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2463 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_unescape_bytea
, 0, 0, 1)
2464 ZEND_ARG_INFO(0, bytea
)
2465 ZEND_END_ARG_INFO();
2466 static PHP_METHOD(pqconn
, unescapeBytea
) {
2470 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2471 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2474 size_t unescaped_len
;
2475 char *unescaped_str
= (char *) PQunescapeBytea((unsigned char *)str
, &unescaped_len
);
2477 if (unescaped_str
) {
2478 RETVAL_STRINGL(unescaped_str
, unescaped_len
, 1);
2479 PQfreemem(unescaped_str
);
2481 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not unescape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2485 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2491 static const char *isolation_level(long *isolation
) {
2492 switch (*isolation
) {
2493 case PHP_PQTXN_SERIALIZABLE
:
2494 return "SERIALIZABLE";
2495 case PHP_PQTXN_REPEATABLE_READ
:
2496 return "REPEATABLE READ";
2498 *isolation
= PHP_PQTXN_READ_COMMITTED
;
2500 case PHP_PQTXN_READ_COMMITTED
:
2501 return "READ COMMITTED";
2505 static STATUS
php_pqconn_start_transaction(zval
*zconn
, php_pqconn_object_t
*conn_obj
, long isolation
, zend_bool readonly
, zend_bool deferrable TSRMLS_DC
)
2508 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2511 if (conn_obj
->intern
) {
2515 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2516 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2518 res
= PQexec(conn_obj
->intern
->conn
, cmd
);
2523 STATUS rv
= php_pqres_success(res TSRMLS_CC
);
2528 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2532 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2537 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
)
2540 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2543 if (conn_obj
->intern
->conn
) {
2546 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2547 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2549 if (PQsendQuery(conn_obj
->intern
->conn
, cmd
)) {
2550 conn_obj
->intern
->poller
= PQconsumeInput
;
2555 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2559 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2564 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction
, 0, 0, 0)
2565 ZEND_ARG_INFO(0, isolation
)
2566 ZEND_ARG_INFO(0, readonly
)
2567 ZEND_ARG_INFO(0, deferrable
)
2568 ZEND_END_ARG_INFO();
2569 static PHP_METHOD(pqconn
, startTransaction
) {
2570 zend_error_handling zeh
;
2571 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2572 zend_bool readonly
= 0, deferrable
= 0;
2574 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2575 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2577 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2579 rv
= php_pqconn_start_transaction(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2581 if (SUCCESS
== rv
) {
2582 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2584 php_pq_object_addref(obj TSRMLS_CC
);
2586 txn
->isolation
= isolation
;
2587 txn
->readonly
= readonly
;
2588 txn
->deferrable
= deferrable
;
2590 return_value
->type
= IS_OBJECT
;
2591 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2594 zend_restore_error_handling(&zeh TSRMLS_CC
);
2598 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction_async
, 0, 0, 0)
2599 ZEND_ARG_INFO(0, isolation
)
2600 ZEND_ARG_INFO(0, readonly
)
2601 ZEND_ARG_INFO(0, deferrable
)
2602 ZEND_END_ARG_INFO();
2603 static PHP_METHOD(pqconn
, startTransactionAsync
) {
2604 zend_error_handling zeh
;
2605 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2606 zend_bool readonly
= 0, deferrable
= 0;
2608 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2609 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2611 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2613 rv
= php_pqconn_start_transaction_async(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2615 if (SUCCESS
== rv
) {
2616 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2618 php_pq_object_addref(obj TSRMLS_CC
);
2620 txn
->isolation
= isolation
;
2621 txn
->readonly
= readonly
;
2622 txn
->deferrable
= deferrable
;
2624 return_value
->type
= IS_OBJECT
;
2625 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2628 zend_restore_error_handling(&zeh TSRMLS_CC
);
2631 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_trace
, 0, 0, 0)
2632 ZEND_ARG_INFO(0, stdio_stream
)
2633 ZEND_END_ARG_INFO();
2634 static PHP_METHOD(pqconn
, trace
) {
2635 zval
*zstream
= NULL
;
2637 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|r!", &zstream
)) {
2638 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2642 php_stream
*stream
= NULL
;
2644 php_stream_from_zval(stream
, &zstream
);
2646 if (SUCCESS
== php_stream_cast(stream
, PHP_STREAM_AS_STDIO
, (void *) &fp
, REPORT_ERRORS
)) {
2647 stream
->flags
|= PHP_STREAM_FLAG_NO_CLOSE
;
2648 PQtrace(obj
->intern
->conn
, fp
);
2654 PQuntrace(obj
->intern
->conn
);
2658 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2664 static zend_function_entry php_pqconn_methods
[] = {
2665 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2666 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
2667 PHP_ME(pqconn
, resetAsync
, ai_pqconn_reset_async
, ZEND_ACC_PUBLIC
)
2668 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
2669 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
2670 PHP_ME(pqconn
, execAsync
, ai_pqconn_exec_async
, ZEND_ACC_PUBLIC
)
2671 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
2672 PHP_ME(pqconn
, execParamsAsync
, ai_pqconn_exec_params_async
, ZEND_ACC_PUBLIC
)
2673 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
2674 PHP_ME(pqconn
, prepareAsync
, ai_pqconn_prepare_async
, ZEND_ACC_PUBLIC
)
2675 PHP_ME(pqconn
, listen
, ai_pqconn_listen
, ZEND_ACC_PUBLIC
)
2676 PHP_ME(pqconn
, notify
, ai_pqconn_notify
, ZEND_ACC_PUBLIC
)
2677 PHP_ME(pqconn
, getResult
, ai_pqconn_get_result
, ZEND_ACC_PUBLIC
)
2678 PHP_ME(pqconn
, quote
, ai_pqconn_quote
, ZEND_ACC_PUBLIC
)
2679 PHP_ME(pqconn
, quoteName
, ai_pqconn_quote_name
, ZEND_ACC_PUBLIC
)
2680 PHP_ME(pqconn
, escapeBytea
, ai_pqconn_escape_bytea
, ZEND_ACC_PUBLIC
)
2681 PHP_ME(pqconn
, unescapeBytea
, ai_pqconn_unescape_bytea
, ZEND_ACC_PUBLIC
)
2682 PHP_ME(pqconn
, startTransaction
, ai_pqconn_start_transaction
, ZEND_ACC_PUBLIC
)
2683 PHP_ME(pqconn
, startTransactionAsync
, ai_pqconn_start_transaction_async
, ZEND_ACC_PUBLIC
)
2684 PHP_ME(pqconn
, trace
, ai_pqconn_trace
, ZEND_ACC_PUBLIC
)
2688 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_construct
, 0, 0, 1)
2689 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
2690 ZEND_END_ARG_INFO();
2691 static PHP_METHOD(pqtypes
, __construct
) {
2692 zend_error_handling zeh
;
2695 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2696 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
2697 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2699 if (conn_obj
->intern
) {
2700 zval
*retval
= NULL
;
2701 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2703 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
2704 obj
->intern
->conn
= conn_obj
;
2705 php_pq_object_addref(conn_obj TSRMLS_CC
);
2706 zend_hash_init(&obj
->intern
->types
, 300, NULL
, ZVAL_PTR_DTOR
, 0);
2708 zend_call_method_with_0_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "refresh", &retval
);
2710 zval_ptr_dtor(&retval
);
2713 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2716 zend_restore_error_handling(&zeh TSRMLS_CC
);
2719 #define PHP_PQ_TYPES_QUERY \
2720 "select t.oid, t.* " \
2721 "from pg_type t join pg_namespace n on t.typnamespace=n.oid " \
2722 "where typisdefined " \
2724 "and nspname in ('public', 'pg_catalog')"
2726 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_refresh
, 0, 0, 0)
2727 ZEND_END_ARG_INFO();
2728 static PHP_METHOD(pqtypes
, refresh
) {
2729 if (SUCCESS
== zend_parse_parameters_none()) {
2730 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2733 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, PHP_PQ_TYPES_QUERY
);
2735 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2738 if (PGRES_TUPLES_OK
== PQresultStatus(res
)) {
2741 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
2742 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT
, NULL TSRMLS_CC
);
2743 long oid
= atol(PQgetvalue(res
, r
, 0 ));
2744 char *name
= PQgetvalue(res
, r
, 1);
2748 zend_hash_index_update(&obj
->intern
->types
, oid
, (void *) &row
, sizeof(zval
*), NULL
);
2749 zend_hash_add(&obj
->intern
->types
, name
, strlen(name
) + 1, (void *) &row
, sizeof(zval
*), NULL
);
2752 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQresultErrorMessage(res
));
2756 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2760 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Types not initialized");
2765 static zend_function_entry php_pqtypes_methods
[] = {
2766 PHP_ME(pqtypes
, __construct
, ai_pqtypes_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2767 PHP_ME(pqtypes
, refresh
, ai_pqtypes_refresh
, ZEND_ACC_PUBLIC
)
2771 static zval
*php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type
, zval
***row TSRMLS_DC
)
2773 php_pqres_fetch_t orig_fetch
;
2776 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2779 if (!obj
->intern
->iter
) {
2780 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
2781 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2783 orig_fetch
= obj
->intern
->iter
->fetch_type
;
2784 obj
->intern
->iter
->fetch_type
= fetch_type
;
2785 if (SUCCESS
== obj
->intern
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
)) {
2786 obj
->intern
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->intern
->iter
, row TSRMLS_CC
);
2787 obj
->intern
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2789 obj
->intern
->iter
->fetch_type
= orig_fetch
;
2791 return *row
? **row
: NULL
;
2794 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
2795 ZEND_ARG_INFO(0, fetch_type
)
2796 ZEND_END_ARG_INFO();
2797 static PHP_METHOD(pqres
, fetchRow
) {
2798 zend_error_handling zeh
;
2799 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2800 long fetch_type
= -1;
2802 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2803 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
2807 if (fetch_type
== -1) {
2808 fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
2810 php_pqres_iteration(getThis(), obj
, fetch_type
, &row TSRMLS_CC
);
2813 RETVAL_ZVAL(*row
, 1, 0);
2816 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
2819 zend_restore_error_handling(&zeh TSRMLS_CC
);
2822 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
2825 HashTable
*ht
= HASH_OF(row
);
2826 int count
= zend_hash_num_elements(ht
);
2829 zend_hash_internal_pointer_reset(ht
);
2831 zend_hash_move_forward(ht
);
2833 zend_hash_get_current_data(ht
, (void *) &data
);
2835 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d exceeds column count %d", col
, count
);
2840 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 0)
2841 ZEND_ARG_INFO(0, col_num
)
2842 ZEND_END_ARG_INFO();
2843 static PHP_METHOD(pqres
, fetchCol
) {
2844 zend_error_handling zeh
;
2847 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2848 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_col
)) {
2849 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2854 php_pqres_iteration(getThis(), obj
, obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: 0, &row TSRMLS_CC
);
2857 zval
**col
= column_at(*row
, fetch_col TSRMLS_CC
);
2860 RETVAL_ZVAL(*col
, 1, 0);
2864 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
2867 zend_restore_error_handling(&zeh TSRMLS_CC
);
2870 typedef struct php_pqres_col
{
2875 static int apply_to_col(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
2878 php_pqres_object_t
*obj
= va_arg(argv
, php_pqres_object_t
*);
2879 php_pqres_col_t
*col
, **cols
= va_arg(argv
, php_pqres_col_t
**);
2880 STATUS
*rv
= va_arg(argv
, STATUS
*);
2884 switch (Z_TYPE_PP(c
)) {
2886 convert_to_string(*c
);
2889 if (!is_numeric_string(Z_STRVAL_PP(c
), Z_STRLEN_PP(c
), &index
, NULL
, 0)) {
2890 name
= Z_STRVAL_PP(c
);
2894 index
= Z_LVAL_PP(c
);
2901 col
->num
= PQfnumber(obj
->intern
->res
, name
);
2903 col
->name
= PQfname(obj
->intern
->res
, index
);
2908 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column at index %ld", index
);
2910 return ZEND_HASH_APPLY_STOP
;
2912 if (col
->num
== -1) {
2913 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column with name '%s'", name
);
2915 return ZEND_HASH_APPLY_STOP
;
2919 return ZEND_HASH_APPLY_KEEP
;
2922 static php_pqres_col_t
*php_pqres_convert_to_cols(php_pqres_object_t
*obj
, HashTable
*ht TSRMLS_DC
)
2924 php_pqres_col_t
*tmp
, *cols
= ecalloc(zend_hash_num_elements(ht
), sizeof(*cols
));
2925 STATUS rv
= SUCCESS
;
2928 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_col
, 2, obj
, &tmp
, &rv
);
2930 if (SUCCESS
== rv
) {
2938 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_map
, 0, 0, 0)
2939 ZEND_ARG_INFO(0, keys
)
2940 ZEND_ARG_INFO(0, vals
)
2941 ZEND_ARG_INFO(0, fetch_type
)
2942 ZEND_END_ARG_INFO();
2943 static PHP_METHOD(pqres
, map
) {
2944 zend_error_handling zeh
;
2945 zval
*zkeys
= 0, *zvals
= 0;
2946 long fetch_type
= -1;
2949 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2950 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z/!z/!l", &zkeys
, &zvals
, &fetch_type
)) {
2951 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2955 php_pqres_col_t def
= {PQfname(obj
->intern
->res
, 0), 0}, *keys
= NULL
, *vals
= NULL
;
2958 convert_to_array(zkeys
);
2960 if ((ks
= zend_hash_num_elements(Z_ARRVAL_P(zkeys
)))) {
2961 keys
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zkeys
) TSRMLS_CC
);
2971 convert_to_array(zvals
);
2973 if ((vs
= zend_hash_num_elements(Z_ARRVAL_P(zvals
)))) {
2974 vals
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zvals
) TSRMLS_CC
);
2978 if (fetch_type
== -1) {
2979 fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
2986 switch (fetch_type
) {
2987 case PHP_PQRES_FETCH_ARRAY
:
2988 case PHP_PQRES_FETCH_ASSOC
:
2989 array_init(return_value
);
2991 case PHP_PQRES_FETCH_OBJECT
:
2992 object_init(return_value
);
2995 for (r
= 0, rows
= PQntuples(obj
->intern
->res
); r
< rows
; ++r
) {
2998 cur
= &return_value
;
2999 for (k
= 0; k
< ks
; ++k
) {
3000 char *key
= PQgetvalue(obj
->intern
->res
, r
, keys
[k
].num
);
3001 int len
= PQgetlength(obj
->intern
->res
, r
, keys
[k
].num
);
3003 if (SUCCESS
!= zend_symtable_find(HASH_OF(*cur
), key
, len
+ 1, (void *) &cur
)) {
3007 switch (fetch_type
) {
3008 case PHP_PQRES_FETCH_ARRAY
:
3009 case PHP_PQRES_FETCH_ASSOC
:
3012 case PHP_PQRES_FETCH_OBJECT
:
3016 if (SUCCESS
!= zend_symtable_update(HASH_OF(*cur
), key
, len
+ 1, (void *) &tmp
, sizeof(zval
*), (void *) &cur
)) {
3017 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create map");
3023 for (v
= 0; v
< vs
; ++v
) {
3024 char *val
= PQgetvalue(obj
->intern
->res
, r
, vals
[v
].num
);
3025 int len
= PQgetlength(obj
->intern
->res
, r
, vals
[v
].num
);
3027 switch (fetch_type
) {
3028 case PHP_PQRES_FETCH_ARRAY
:
3029 add_index_stringl(*cur
, vals
[v
].num
, val
, len
, 1);
3031 case PHP_PQRES_FETCH_ASSOC
:
3032 add_assoc_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
3034 case PHP_PQRES_FETCH_OBJECT
:
3035 add_property_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
3040 php_pqres_row_to_zval(obj
->intern
->res
, r
, fetch_type
, cur TSRMLS_CC
);
3046 if (keys
&& keys
!= &def
) {
3053 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3056 zend_restore_error_handling(&zeh TSRMLS_CC
);
3059 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_count
, 0, 0, 0)
3060 ZEND_END_ARG_INFO();
3061 static PHP_METHOD(pqres
, count
) {
3062 if (SUCCESS
== zend_parse_parameters_none()) {
3065 if (SUCCESS
== php_pqres_count_elements(getThis(), &count TSRMLS_CC
)) {
3068 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Result not initialized");
3073 static zend_function_entry php_pqres_methods
[] = {
3074 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
3075 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
3076 PHP_ME(pqres
, count
, ai_pqres_count
, ZEND_ACC_PUBLIC
)
3077 PHP_ME(pqres
, map
, ai_pqres_map
, ZEND_ACC_PUBLIC
)
3081 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
3082 ZEND_ARG_OBJ_INFO(0, Connection
, pq
\\Connection
, 0)
3083 ZEND_ARG_INFO(0, type
)
3084 ZEND_ARG_INFO(0, query
)
3085 ZEND_ARG_ARRAY_INFO(0, types
, 1)
3086 ZEND_ARG_INFO(0, async
)
3087 ZEND_END_ARG_INFO();
3088 static PHP_METHOD(pqstm
, __construct
) {
3089 zend_error_handling zeh
;
3090 zval
*zconn
, *ztypes
= NULL
;
3091 char *name_str
, *query_str
;
3092 int name_len
, *query_len
;
3093 zend_bool async
= 0;
3095 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3096 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
)) {
3097 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3098 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3100 if (conn_obj
->intern
) {
3103 conn_obj
->intern
->poller
= PQconsumeInput
;
3104 rv
= php_pqconn_prepare_async(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
3106 rv
= php_pqconn_prepare(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
3107 php_pqconn_notify_listeners(conn_obj TSRMLS_CC
);
3110 if (SUCCESS
== rv
) {
3111 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
3113 php_pq_object_addref(conn_obj TSRMLS_CC
);
3114 stm
->conn
= conn_obj
;
3115 stm
->name
= estrdup(name_str
);
3119 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3122 zend_restore_error_handling(&zeh TSRMLS_CC
);
3125 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
3126 ZEND_ARG_ARRAY_INFO(0, params
, 1)
3127 ZEND_END_ARG_INFO();
3128 static PHP_METHOD(pqstm
, exec
) {
3129 zend_error_handling zeh
;
3130 zval
*zparams
= NULL
;
3132 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3133 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
3134 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3137 if (obj
->intern
->conn
->intern
) {
3139 char **params
= NULL
;
3144 ZEND_INIT_SYMTABLE(&zdtor
);
3145 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
3148 res
= PQexecPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0);
3154 zend_hash_destroy(&zdtor
);
3157 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3160 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3161 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
3164 return_value
->type
= IS_OBJECT
;
3165 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
3168 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3171 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3174 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3177 zend_restore_error_handling(&zeh TSRMLS_CC
);
3180 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec_async
, 0, 0, 0)
3181 ZEND_ARG_ARRAY_INFO(0, params
, 1)
3182 ZEND_ARG_INFO(0, callable
)
3183 ZEND_END_ARG_INFO();
3184 static PHP_METHOD(pqstm
, execAsync
) {
3185 zend_error_handling zeh
;
3186 zval
*zparams
= NULL
;
3187 php_pq_callback_t resolver
= {{0}};
3189 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3190 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!f", &zparams
, &resolver
.fci
, &resolver
.fcc
)) {
3191 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3194 if (obj
->intern
->conn
->intern
) {
3196 char **params
= NULL
;
3200 ZEND_INIT_SYMTABLE(&zdtor
);
3201 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
3204 php_pq_callback_dtor(&obj
->intern
->conn
->intern
->onevent
);
3205 if (resolver
.fci
.size
> 0) {
3206 obj
->intern
->conn
->intern
->onevent
= resolver
;
3207 php_pq_callback_addref(&obj
->intern
->conn
->intern
->onevent
);
3210 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3212 if (PQsendQueryPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0)) {
3213 if (obj
->intern
->conn
->intern
->unbuffered
) {
3214 if (!PQsetSingleRowMode(obj
->intern
->conn
->intern
->conn
)) {
3215 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3220 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3228 zend_hash_destroy(&zdtor
);
3231 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3234 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3238 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3242 zend_restore_error_handling(&zeh TSRMLS_CC
);
3245 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc
, 0, 0, 0)
3246 ZEND_END_ARG_INFO();
3247 static PHP_METHOD(pqstm
, desc
) {
3248 zend_error_handling zeh
;
3250 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3251 if (SUCCESS
== zend_parse_parameters_none()) {
3252 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3255 if (obj
->intern
->conn
->intern
) {
3256 PGresult
*res
= PQdescribePrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
);
3258 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3261 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3264 array_init(return_value
);
3265 for (p
= 0, params
= PQnparams(res
); p
< params
; ++p
) {
3266 add_next_index_long(return_value
, PQparamtype(res
, p
));
3270 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3273 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3276 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3279 zend_restore_error_handling(&zeh TSRMLS_CC
);
3282 static zend_function_entry php_pqstm_methods
[] = {
3283 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3284 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
3285 PHP_ME(pqstm
, desc
, ai_pqstm_desc
, ZEND_ACC_PUBLIC
)
3286 PHP_ME(pqstm
, execAsync
, ai_pqstm_exec_async
, ZEND_ACC_PUBLIC
)
3290 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_construct
, 0, 0, 1)
3291 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3292 ZEND_ARG_INFO(0, async
)
3293 ZEND_ARG_INFO(0, isolation
)
3294 ZEND_ARG_INFO(0, readonly
)
3295 ZEND_ARG_INFO(0, deferrable
)
3296 ZEND_END_ARG_INFO();
3297 static PHP_METHOD(pqtxn
, __construct
) {
3298 zend_error_handling zeh
;
3300 long isolation
= PHP_PQTXN_READ_COMMITTED
;
3301 zend_bool async
= 0, readonly
= 0, deferrable
= 0;
3303 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3304 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|blbb", &zconn
, php_pqconn_class_entry
, &async
, &isolation
, &readonly
, &deferrable
)) {
3306 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3307 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3309 if (conn_obj
->intern
) {
3311 rv
= php_pqconn_start_transaction_async(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3313 rv
= php_pqconn_start_transaction(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3316 if (SUCCESS
== rv
) {
3317 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3319 php_pq_object_addref(conn_obj TSRMLS_CC
);
3320 obj
->intern
->conn
= conn_obj
;
3321 obj
->intern
->isolation
= isolation
;
3322 obj
->intern
->readonly
= readonly
;
3323 obj
->intern
->deferrable
= deferrable
;
3326 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3329 zend_restore_error_handling(&zeh TSRMLS_CC
);
3332 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_savepoint
, 0, 0, 0)
3333 ZEND_END_ARG_INFO();
3334 static PHP_METHOD(pqtxn
, savepoint
) {
3335 zend_error_handling zeh
;
3337 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3338 if (SUCCESS
== zend_parse_parameters_none()) {
3339 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3345 spprintf(&cmd
, 0, "SAVEPOINT \"%u\"", ++obj
->intern
->savepoint
);
3346 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3349 php_pqres_success(res TSRMLS_CC
);
3352 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3357 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3360 zend_restore_error_handling(&zeh TSRMLS_CC
);
3363 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_savepoint_async
, 0, 0, 0)
3364 ZEND_END_ARG_INFO();
3365 static PHP_METHOD(pqtxn
, savepointAsync
) {
3366 zend_error_handling zeh
;
3368 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3369 if (SUCCESS
== zend_parse_parameters_none()) {
3370 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3375 spprintf(&cmd
, 0, "SAVEPOINT \"%u\"", ++obj
->intern
->savepoint
);
3376 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3377 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3382 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3385 zend_restore_error_handling(&zeh TSRMLS_CC
);
3388 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit
, 0, 0, 0)
3389 ZEND_END_ARG_INFO();
3390 static PHP_METHOD(pqtxn
, commit
) {
3391 zend_error_handling zeh
;
3393 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3394 if (SUCCESS
== zend_parse_parameters_none()) {
3395 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3400 if (obj
->intern
->savepoint
) {
3403 spprintf(&cmd
, 0, "RELEASE SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3404 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3407 php_pqres_success(res TSRMLS_CC
);
3410 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3415 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "COMMIT");
3418 php_pqres_success(res TSRMLS_CC
);
3421 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3425 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3428 zend_restore_error_handling(&zeh TSRMLS_CC
);
3431 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit_async
, 0, 0, 0)
3432 ZEND_END_ARG_INFO();
3433 static PHP_METHOD(pqtxn
, commitAsync
) {
3434 zend_error_handling zeh
;
3436 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3437 if (SUCCESS
== zend_parse_parameters_none()) {
3438 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3441 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3443 if (obj
->intern
->savepoint
) {
3446 spprintf(&cmd
, 0, "RELEASE SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3447 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3448 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3453 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "COMMIT")) {
3454 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3458 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3461 zend_restore_error_handling(&zeh TSRMLS_CC
);
3464 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback
, 0, 0, 0)
3465 ZEND_END_ARG_INFO();
3466 static PHP_METHOD(pqtxn
, rollback
) {
3467 zend_error_handling zeh
;
3469 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3470 if (SUCCESS
== zend_parse_parameters_none()) {
3471 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3476 if (obj
->intern
->savepoint
) {
3479 spprintf(&cmd
, 0, "ROLLBACK TO SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3480 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3483 php_pqres_success(res TSRMLS_CC
);
3486 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3491 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "ROLLBACK");
3494 php_pqres_success(res TSRMLS_CC
);
3497 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3501 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3504 zend_restore_error_handling(&zeh TSRMLS_CC
);
3507 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback_async
, 0, 0, 0)
3508 ZEND_END_ARG_INFO();
3509 static PHP_METHOD(pqtxn
, rollbackAsync
) {
3510 zend_error_handling zeh
;
3512 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3513 if (SUCCESS
== zend_parse_parameters_none()) {
3514 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3517 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3519 if (obj
->intern
->savepoint
) {
3522 spprintf(&cmd
, 0, "ROLLBACK TO SAVEPOINT \"%u\"", obj
->intern
->savepoint
--);
3523 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3524 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3529 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "ROLLBACK")) {
3530 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3534 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3537 zend_restore_error_handling(&zeh TSRMLS_CC
);
3540 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_export_snapshot
, 0, 0, 0)
3541 ZEND_END_ARG_INFO();
3542 static PHP_METHOD(pqtxn
, exportSnapshot
) {
3543 zend_error_handling zeh
;
3545 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3546 if (SUCCESS
== zend_parse_parameters_none()) {
3547 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3550 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SELECT pg_export_snapshot()");
3553 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3554 RETVAL_STRING(PQgetvalue(res
, 0, 0), 1);
3559 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to export transaction snapshot (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3562 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3565 zend_restore_error_handling(&zeh TSRMLS_CC
);
3568 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_export_snapshot_async
, 0, 0, 0)
3569 ZEND_END_ARG_INFO();
3570 static PHP_METHOD(pqtxn
, exportSnapshotAsync
) {
3571 zend_error_handling zeh
;
3573 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3574 if (SUCCESS
== zend_parse_parameters_none()) {
3575 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3578 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3580 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "SELECT pg_export_snapshot()")) {
3581 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to export transaction snapshot (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3584 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3587 zend_restore_error_handling(&zeh TSRMLS_CC
);
3590 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_import_snapshot
, 0, 0, 1)
3591 ZEND_ARG_INFO(0, snapshot_id
)
3592 ZEND_END_ARG_INFO();
3593 static PHP_METHOD(pqtxn
, importSnapshot
) {
3594 zend_error_handling zeh
;
3598 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3599 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &snapshot_str
, &snapshot_len
)) {
3600 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3603 if (obj
->intern
->isolation
>= PHP_PQTXN_REPEATABLE_READ
) {
3604 char *cmd
, *sid
= PQescapeLiteral(obj
->intern
->conn
->intern
->conn
, snapshot_str
, snapshot_len
);
3607 spprintf(&cmd
, 0, "SET TRANSACTION SNAPSHOT %s", sid
);
3608 res
= PQexec(obj
->intern
->conn
->intern
->conn
, cmd
);
3611 php_pqres_success(res TSRMLS_CC
);
3614 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3617 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");
3620 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3623 zend_restore_error_handling(&zeh TSRMLS_CC
);
3626 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_import_snapshot_async
, 0, 0, 1)
3627 ZEND_ARG_INFO(0, snapshot_id
)
3628 ZEND_END_ARG_INFO();
3629 static PHP_METHOD(pqtxn
, importSnapshotAsync
) {
3630 zend_error_handling zeh
;
3634 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3635 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &snapshot_str
, &snapshot_len
)) {
3636 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3639 if (obj
->intern
->isolation
>= PHP_PQTXN_REPEATABLE_READ
) {
3640 char *sid
= PQescapeLiteral(obj
->intern
->conn
->intern
->conn
, snapshot_str
, snapshot_len
);
3644 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3646 spprintf(&cmd
, 0, "SET TRANSACTION SNAPSHOT %s", sid
);
3647 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, cmd
)) {
3648 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to %s (%s)", cmd
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3652 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to quote snapshot identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3655 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");
3658 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3661 zend_restore_error_handling(&zeh TSRMLS_CC
);
3664 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_open_lob
, 0, 0, 1)
3665 ZEND_ARG_INFO(0, oid
)
3666 ZEND_ARG_INFO(0, mode
)
3667 ZEND_END_ARG_INFO();
3668 static PHP_METHOD(pqtxn
, openLOB
) {
3669 zend_error_handling zeh
;
3670 long mode
= INV_WRITE
|INV_READ
, loid
;
3672 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3673 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &loid
, &mode
)) {
3674 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3677 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3680 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3684 php_pq_object_addref(obj TSRMLS_CC
);
3687 return_value
->type
= IS_OBJECT
;
3688 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3690 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
3691 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3692 (mode
& INV_READ
? "r" :
3693 (mode
& INV_WRITE
? "w" : "-"))),
3694 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3698 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3701 zend_restore_error_handling(&zeh TSRMLS_CC
);
3704 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_create_lob
, 0, 0, 0)
3705 ZEND_ARG_INFO(0, mode
)
3706 ZEND_END_ARG_INFO();
3707 static PHP_METHOD(pqtxn
, createLOB
) {
3708 zend_error_handling zeh
;
3709 long mode
= INV_WRITE
|INV_READ
;
3711 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3712 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &mode
)) {
3713 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3716 Oid loid
= lo_creat(obj
->intern
->conn
->intern
->conn
, mode
);
3718 if (loid
!= InvalidOid
) {
3719 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3722 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3725 php_pq_object_addref(obj TSRMLS_CC
);
3728 return_value
->type
= IS_OBJECT
;
3729 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3731 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s': %s",
3732 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3733 (mode
& INV_READ
? "r" :
3734 (mode
& INV_WRITE
? "w" : "-"))),
3735 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3739 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s': %s",
3740 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3741 (mode
& INV_READ
? "r" :
3742 (mode
& INV_WRITE
? "w" : "-"))),
3743 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3747 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3750 zend_restore_error_handling(&zeh TSRMLS_CC
);
3753 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_unlink_lob
, 0, 0, 1)
3754 ZEND_ARG_INFO(0, oid
)
3755 ZEND_END_ARG_INFO();
3756 static PHP_METHOD(pqtxn
, unlinkLOB
) {
3759 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l", &loid
)) {
3760 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3763 if (1 == lo_unlink(obj
->intern
->conn
->intern
->conn
, loid
)) {
3766 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to unlink LOB (oid=%ld): %s", loid
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3770 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3776 static zend_function_entry php_pqtxn_methods
[] = {
3777 PHP_ME(pqtxn
, __construct
, ai_pqtxn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3778 PHP_ME(pqtxn
, commit
, ai_pqtxn_commit
, ZEND_ACC_PUBLIC
)
3779 PHP_ME(pqtxn
, rollback
, ai_pqtxn_rollback
, ZEND_ACC_PUBLIC
)
3780 PHP_ME(pqtxn
, commitAsync
, ai_pqtxn_commit_async
, ZEND_ACC_PUBLIC
)
3781 PHP_ME(pqtxn
, rollbackAsync
, ai_pqtxn_rollback_async
, ZEND_ACC_PUBLIC
)
3782 PHP_ME(pqtxn
, savepoint
, ai_pqtxn_savepoint
, ZEND_ACC_PUBLIC
)
3783 PHP_ME(pqtxn
, savepointAsync
, ai_pqtxn_savepoint_async
, ZEND_ACC_PUBLIC
)
3784 PHP_ME(pqtxn
, exportSnapshot
, ai_pqtxn_export_snapshot
, ZEND_ACC_PUBLIC
)
3785 PHP_ME(pqtxn
, exportSnapshotAsync
, ai_pqtxn_export_snapshot_async
, ZEND_ACC_PUBLIC
)
3786 PHP_ME(pqtxn
, importSnapshot
, ai_pqtxn_import_snapshot
, ZEND_ACC_PUBLIC
)
3787 PHP_ME(pqtxn
, importSnapshotAsync
, ai_pqtxn_import_snapshot_async
, ZEND_ACC_PUBLIC
)
3788 PHP_ME(pqtxn
, openLOB
, ai_pqtxn_open_lob
, ZEND_ACC_PUBLIC
)
3789 PHP_ME(pqtxn
, createLOB
, ai_pqtxn_create_lob
, ZEND_ACC_PUBLIC
)
3790 PHP_ME(pqtxn
, unlinkLOB
, ai_pqtxn_unlink_lob
, ZEND_ACC_PUBLIC
)
3794 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_construct
, 0, 0, 1)
3795 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3796 ZEND_END_ARG_INFO();
3797 static PHP_METHOD(pqcancel
, __construct
) {
3798 zend_error_handling zeh
;
3801 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3802 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
3803 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3805 if (conn_obj
->intern
) {
3806 PGcancel
*cancel
= PQgetCancel(conn_obj
->intern
->conn
);
3809 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3811 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3812 obj
->intern
->cancel
= cancel
;
3813 php_pq_object_addref(conn_obj TSRMLS_CC
);
3814 obj
->intern
->conn
= conn_obj
;
3816 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not acquire cancel (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
3819 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3822 zend_restore_error_handling(&zeh TSRMLS_CC
);
3825 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_cancel
, 0, 0, 0)
3826 ZEND_END_ARG_INFO();
3827 static PHP_METHOD(pqcancel
, cancel
) {
3828 zend_error_handling zeh
;
3830 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3831 if (SUCCESS
== zend_parse_parameters_none()) {
3832 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3837 if (!PQcancel(obj
->intern
->cancel
, err
, sizeof(err
))) {
3838 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not request cancellation: %s", err
);
3841 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Cancel not initialized");
3844 zend_restore_error_handling(&zeh TSRMLS_CC
);
3847 static zend_function_entry php_pqcancel_methods
[] = {
3848 PHP_ME(pqcancel
, __construct
, ai_pqcancel_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3849 PHP_ME(pqcancel
, cancel
, ai_pqcancel_cancel
, ZEND_ACC_PUBLIC
)
3853 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
)
3857 if (SUCCESS
== zend_hash_find(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evhs
)) {
3859 add_next_index_zval(*evhs
, zevent
);
3866 add_next_index_zval(evh
, zevent
);
3867 zend_hash_add(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evh
, sizeof(zval
*), NULL
);
3871 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_construct
, 0, 0, 3)
3872 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3873 ZEND_ARG_INFO(0, type
)
3874 ZEND_ARG_INFO(0, callable
)
3875 ZEND_END_ARG_INFO();
3876 static PHP_METHOD(pqevent
, __construct
) {
3877 zend_error_handling zeh
;
3881 php_pq_callback_t cb
;
3883 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3884 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Osf", &zconn
, php_pqconn_class_entry
, &type_str
, &type_len
, &cb
.fci
, &cb
.fcc
)) {
3885 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3887 if (conn_obj
->intern
) {
3888 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3890 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3891 php_pq_callback_addref(&cb
);
3892 obj
->intern
->cb
= cb
;
3893 php_pq_object_addref(conn_obj TSRMLS_CC
);
3894 obj
->intern
->conn
= conn_obj
;
3895 obj
->intern
->type
= estrdup(type_str
);
3897 php_pqconn_add_eventhandler(zconn
, conn_obj
, type_str
, type_len
, getThis() TSRMLS_CC
);
3900 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3903 zend_restore_error_handling(&zeh TSRMLS_CC
);
3906 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_trigger
, 0, 0, 1)
3907 ZEND_ARG_ARRAY_INFO(0, args
, 1)
3908 ZEND_END_ARG_INFO();
3909 static PHP_METHOD(pqevent
, trigger
) {
3912 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "a/", &args
)) {
3913 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3918 if (SUCCESS
== zend_fcall_info_call(&obj
->intern
->cb
.fci
, &obj
->intern
->cb
.fcc
, &rv
, args TSRMLS_CC
)) {
3920 RETVAL_ZVAL(rv
, 0, 1);
3926 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Event not initialized");
3932 static zend_function_entry php_pqevent_methods
[] = {
3933 PHP_ME(pqevent
, __construct
, ai_pqevent_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3934 PHP_ME(pqevent
, trigger
, ai_pqevent_trigger
, ZEND_ACC_PUBLIC
)
3938 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_construct
, 0, 0, 1)
3939 ZEND_ARG_OBJ_INFO(0, transaction
, pq
\\Transaction
, 0)
3940 ZEND_ARG_INFO(0, oid
)
3941 ZEND_ARG_INFO(0, mode
)
3942 ZEND_END_ARG_INFO();
3943 static PHP_METHOD(pqlob
, __construct
) {
3944 zend_error_handling zeh
;
3946 long mode
= INV_WRITE
|INV_READ
, loid
= InvalidOid
;
3948 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3949 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|ll", &ztxn
, php_pqtxn_class_entry
, &loid
, &mode
)) {
3950 php_pqtxn_object_t
*txn_obj
= zend_object_store_get_object(ztxn TSRMLS_CC
);
3952 if (txn_obj
->intern
) {
3954 if (loid
== InvalidOid
) {
3955 loid
= lo_creat(txn_obj
->intern
->conn
->intern
->conn
, mode
);
3958 if (loid
!= InvalidOid
) {
3959 int lofd
= lo_open(txn_obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3962 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3964 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3965 obj
->intern
->lofd
= lofd
;
3966 obj
->intern
->loid
= loid
;
3967 php_pq_object_addref(txn_obj TSRMLS_CC
);
3968 obj
->intern
->txn
= txn_obj
;
3970 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
3971 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3972 (mode
& INV_READ
? "r" :
3973 (mode
& INV_WRITE
? "w" : "-"))),
3974 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
3978 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create 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(txn_obj
->intern
->conn
->intern
->conn
)
3986 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3989 zend_restore_error_handling(&zeh TSRMLS_CC
);
3992 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_write
, 0, 0, 1)
3993 ZEND_ARG_INFO(0, data
)
3994 ZEND_END_ARG_INFO();
3995 static PHP_METHOD(pqlob
, write
) {
3999 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
4000 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4003 int written
= lo_write(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, data_str
, data_len
);
4006 RETVAL_LONG(written
);
4008 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to write to LOB, oid=%d (%s)", obj
->intern
->loid
,
4009 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4013 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4019 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_read
, 0, 0, 0)
4020 ZEND_ARG_INFO(0, length
)
4021 ZEND_ARG_INFO(1, read
)
4022 ZEND_END_ARG_INFO();
4023 static PHP_METHOD(pqlob
, read
) {
4024 long length
= 0x1000;
4027 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lz!", &length
, &zread
)) {
4028 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4031 char *buffer
= emalloc(length
+ 1);
4032 int read
= lo_read(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, buffer
, length
);
4037 ZVAL_LONG(zread
, read
);
4039 buffer
[read
] = '\0';
4040 RETVAL_STRINGL(buffer
, read
, 0);
4043 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to read from LOB, oid=%d (%s)", obj
->intern
->loid
,
4044 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4049 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4055 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_seek
, 0, 0, 1)
4056 ZEND_ARG_INFO(0, offset
)
4057 ZEND_ARG_INFO(0, whence
)
4058 ZEND_END_ARG_INFO();
4059 static PHP_METHOD(pqlob
, seek
) {
4060 long offset
, whence
= SEEK_SET
;
4062 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &offset
, &whence
)) {
4063 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4066 int position
= lo_lseek(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, offset
, whence
);
4068 if (position
>= 0) {
4069 RETVAL_LONG(position
);
4071 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to seek offset in LOB, oid=%d (%s)", obj
->intern
->loid
,
4072 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4076 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4082 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_tell
, 0, 0, 0)
4083 ZEND_END_ARG_INFO();
4084 static PHP_METHOD(pqlob
, tell
) {
4085 if (SUCCESS
== zend_parse_parameters_none()) {
4086 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4089 int position
= lo_tell(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
4091 if (position
>= 0) {
4092 RETVAL_LONG(position
);
4094 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to tell offset in LOB (oid=%d): %s", obj
->intern
->loid
,
4095 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4099 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4105 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_truncate
, 0, 0, 0)
4106 ZEND_ARG_INFO(0, length
)
4107 ZEND_END_ARG_INFO();
4108 static PHP_METHOD(pqlob
, truncate
) {
4111 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &length
)) {
4112 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4115 if (0 == lo_truncate(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, length
)) {
4118 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to truncate LOB (oid=%d): %s", obj
->intern
->loid
,
4119 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
4123 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
4129 static zend_function_entry php_pqlob_methods
[] = {
4130 PHP_ME(pqlob
, __construct
, ai_pqlob_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4131 PHP_ME(pqlob
, write
, ai_pqlob_write
, ZEND_ACC_PUBLIC
)
4132 PHP_ME(pqlob
, read
, ai_pqlob_read
, ZEND_ACC_PUBLIC
)
4133 PHP_ME(pqlob
, seek
, ai_pqlob_seek
, ZEND_ACC_PUBLIC
)
4134 PHP_ME(pqlob
, tell
, ai_pqlob_tell
, ZEND_ACC_PUBLIC
)
4135 PHP_ME(pqlob
, truncate
, ai_pqlob_truncate
, ZEND_ACC_PUBLIC
)
4139 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_construct
, 0, 0, 3)
4140 ZEND_ARG_OBJ_INFO(0, "connection", pq
\\Connection
, 0)
4141 ZEND_ARG_INFO(0, expression
)
4142 ZEND_ARG_INFO(0, direction
)
4143 ZEND_ARG_INFO(0, options
)
4144 ZEND_END_ARG_INFO();
4145 static PHP_METHOD(pqcopy
, __construct
) {
4146 zend_error_handling zeh
;
4148 char *expr_str
, *opt_str
= "";
4149 int expr_len
, opt_len
= 0;
4152 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4153 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
)) {
4154 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
4156 if (conn_obj
->intern
) {
4159 switch (direction
) {
4160 case PHP_PQCOPY_FROM_STDIN
:
4161 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "FROM STDIN", opt_str
);
4164 case PHP_PQCOPY_TO_STDOUT
:
4165 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "TO STDOUT", opt_str
);
4169 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Invalid COPY direction, expected one of FROM_STDIN (%d) TO_STDOUT (%d), got %ld",
4170 PHP_PQCOPY_FROM_STDIN
, PHP_PQCOPY_TO_STDOUT
, direction
);
4175 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4176 PGresult
*res
= PQexec(conn_obj
->intern
->conn
, copy
);
4180 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4181 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
4182 obj
->intern
->direction
= direction
;
4183 obj
->intern
->expression
= estrdup(expr_str
);
4184 obj
->intern
->options
= estrdup(opt_str
);
4185 obj
->intern
->conn
= conn_obj
;
4186 php_pq_object_addref(conn_obj TSRMLS_CC
);
4192 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
4195 zend_restore_error_handling(&zeh TSRMLS_CC
);
4198 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_put
, 0, 0, 1)
4199 ZEND_ARG_INFO(0, data
)
4200 ZEND_END_ARG_INFO();
4201 static PHP_METHOD(pqcopy
, put
) {
4202 zend_error_handling zeh
;
4206 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4207 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
4208 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4211 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
4212 if (1 == PQputCopyData(obj
->intern
->conn
->intern
->conn
, data_str
, data_len
)) {
4215 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to send COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4218 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
4221 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
4224 zend_restore_error_handling(&zeh TSRMLS_CC
);
4227 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_end
, 0, 0, 0)
4228 ZEND_ARG_INFO(0, error
)
4229 ZEND_END_ARG_INFO();
4230 static PHP_METHOD(pqcopy
, end
) {
4231 zend_error_handling zeh
;
4232 char *error_str
= NULL
;
4235 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4236 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|s!", &error_str
, &error_len
)) {
4237 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4240 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
4241 if (1 == PQputCopyEnd(obj
->intern
->conn
->intern
->conn
, error_str
)) {
4242 PGresult
*res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
4245 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4251 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4254 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to end COPY (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4257 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
4260 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
4263 zend_restore_error_handling(&zeh TSRMLS_CC
);
4266 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_get
, 0, 0, 1)
4267 ZEND_ARG_INFO(1, data
)
4268 ZEND_END_ARG_INFO();
4269 static PHP_METHOD(pqcopy
, get
) {
4270 zend_error_handling zeh
;
4273 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
4274 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &zdata
)) {
4275 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
4276 char *buffer
= NULL
;
4279 if (PHP_PQCOPY_TO_STDOUT
== obj
->intern
->direction
) {
4281 int bytes
= PQgetCopyData(obj
->intern
->conn
->intern
->conn
, &buffer
, 0);
4285 res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
4288 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
4294 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4299 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
4305 ZVAL_STRINGL(zdata
, buffer
, bytes
, 1);
4307 ZVAL_EMPTY_STRING(zdata
);
4319 zend_restore_error_handling(&zeh TSRMLS_CC
);
4322 static zend_function_entry php_pqcopy_methods
[] = {
4323 PHP_ME(pqcopy
, __construct
, ai_pqcopy_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
4324 PHP_ME(pqcopy
, put
, ai_pqcopy_put
, ZEND_ACC_PUBLIC
)
4325 PHP_ME(pqcopy
, end
, ai_pqcopy_end
, ZEND_ACC_PUBLIC
)
4326 PHP_ME(pqcopy
, get
, ai_pqcopy_get
, ZEND_ACC_PUBLIC
)
4330 /* {{{ PHP_MINIT_FUNCTION
4332 static PHP_MINIT_FUNCTION(pq
)
4334 zend_class_entry ce
= {0};
4335 php_pq_object_prophandler_t ph
= {0};
4337 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
4338 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4339 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
4341 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4342 php_pqconn_object_handlers
.read_property
= php_pq_object_read_prop
;
4343 php_pqconn_object_handlers
.write_property
= php_pq_object_write_prop
;
4344 php_pqconn_object_handlers
.clone_obj
= NULL
;
4345 php_pqconn_object_handlers
.get_property_ptr_ptr
= NULL
;
4346 php_pqconn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4348 zend_hash_init(&php_pqconn_object_prophandlers
, 13, NULL
, NULL
, 1);
4350 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4351 ph
.read
= php_pqconn_object_read_status
;
4352 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4354 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4355 ph
.read
= php_pqconn_object_read_transaction_status
;
4356 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
4358 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4359 ph
.read
= NULL
; /* forward to std prophandler */
4360 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
4362 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4363 ph
.read
= php_pqconn_object_read_error_message
;
4364 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4366 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("busy"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4367 ph
.read
= php_pqconn_object_read_busy
;
4368 zend_hash_add(&php_pqconn_object_prophandlers
, "busy", sizeof("busy"), (void *) &ph
, sizeof(ph
), NULL
);
4370 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("encoding"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4371 ph
.read
= php_pqconn_object_read_encoding
;
4372 ph
.write
= php_pqconn_object_write_encoding
;
4373 zend_hash_add(&php_pqconn_object_prophandlers
, "encoding", sizeof("encoding"), (void *) &ph
, sizeof(ph
), NULL
);
4376 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("unbuffered"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4377 ph
.read
= php_pqconn_object_read_unbuffered
;
4378 ph
.write
= php_pqconn_object_write_unbuffered
;
4379 zend_hash_add(&php_pqconn_object_prophandlers
, "unbuffered", sizeof("unbuffered"), (void *) &ph
, sizeof(ph
), NULL
);
4382 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("db"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4383 ph
.read
= php_pqconn_object_read_db
;
4384 zend_hash_add(&php_pqconn_object_prophandlers
, "db", sizeof("db"), (void *) &ph
, sizeof(ph
), NULL
);
4386 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4387 ph
.read
= php_pqconn_object_read_user
;
4388 zend_hash_add(&php_pqconn_object_prophandlers
, "user", sizeof("user"), (void *) &ph
, sizeof(ph
), NULL
);
4390 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("pass"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4391 ph
.read
= php_pqconn_object_read_pass
;
4392 zend_hash_add(&php_pqconn_object_prophandlers
, "pass", sizeof("pass"), (void *) &ph
, sizeof(ph
), NULL
);
4394 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("host"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4395 ph
.read
= php_pqconn_object_read_host
;
4396 zend_hash_add(&php_pqconn_object_prophandlers
, "host", sizeof("host"), (void *) &ph
, sizeof(ph
), NULL
);
4398 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("port"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4399 ph
.read
= php_pqconn_object_read_port
;
4400 zend_hash_add(&php_pqconn_object_prophandlers
, "port", sizeof("port"), (void *) &ph
, sizeof(ph
), NULL
);
4402 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4403 ph
.read
= php_pqconn_object_read_options
;
4404 zend_hash_add(&php_pqconn_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
4406 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
4407 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
4408 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
4409 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
4410 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
4411 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
4412 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
4413 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
4415 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
4416 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
4417 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
4418 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
4419 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
4421 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
4422 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
4423 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
4424 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
4426 memset(&ce
, 0, sizeof(ce
));
4427 INIT_NS_CLASS_ENTRY(ce
, "pq", "Types", php_pqtypes_methods
);
4428 php_pqtypes_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4429 php_pqtypes_class_entry
->create_object
= php_pqtypes_create_object
;
4431 memcpy(&php_pqtypes_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4432 php_pqtypes_object_handlers
.read_property
= php_pq_object_read_prop
;
4433 php_pqtypes_object_handlers
.write_property
= php_pq_object_write_prop
;
4434 php_pqtypes_object_handlers
.clone_obj
= NULL
;
4435 php_pqtypes_object_handlers
.get_property_ptr_ptr
= NULL
;
4436 php_pqtypes_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4437 php_pqtypes_object_handlers
.has_dimension
= php_pqtypes_object_has_dimension
;
4438 php_pqtypes_object_handlers
.read_dimension
= php_pqtypes_object_read_dimension
;
4439 php_pqtypes_object_handlers
.unset_dimension
= NULL
;
4440 php_pqtypes_object_handlers
.write_dimension
= NULL
;
4442 zend_hash_init(&php_pqtypes_object_prophandlers
, 1, NULL
, NULL
, 1);
4444 zend_declare_property_null(php_pqtypes_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4445 ph
.read
= php_pqtypes_object_read_connection
;
4446 zend_hash_add(&php_pqtypes_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4448 memset(&ce
, 0, sizeof(ce
));
4449 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
4450 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4451 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
4452 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
4453 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
4454 zend_class_implements(php_pqres_class_entry TSRMLS_CC
, 2, zend_ce_traversable
, spl_ce_Countable
);
4456 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4457 php_pqres_object_handlers
.read_property
= php_pq_object_read_prop
;
4458 php_pqres_object_handlers
.write_property
= php_pq_object_write_prop
;
4459 php_pqres_object_handlers
.clone_obj
= NULL
;
4460 php_pqres_object_handlers
.get_property_ptr_ptr
= NULL
;
4461 php_pqres_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4462 php_pqres_object_handlers
.count_elements
= php_pqres_count_elements
;
4464 zend_hash_init(&php_pqres_object_prophandlers
, 6, NULL
, NULL
, 1);
4466 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4467 ph
.read
= php_pqres_object_read_status
;
4468 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4470 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4471 ph
.read
= php_pqres_object_read_error_message
;
4472 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4474 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4475 ph
.read
= php_pqres_object_read_num_rows
;
4476 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
4478 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4479 ph
.read
= php_pqres_object_read_num_cols
;
4480 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
4482 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4483 ph
.read
= php_pqres_object_read_affected_rows
;
4484 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
4486 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4487 ph
.read
= php_pqres_object_read_fetch_type
;
4488 ph
.write
= php_pqres_object_write_fetch_type
;
4489 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
4492 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
4493 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
4494 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
4495 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
4496 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
4497 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
4498 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
4499 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
4500 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
4501 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
4503 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
4504 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
4505 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
4507 memset(&ce
, 0, sizeof(ce
));
4508 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
4509 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4510 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
4512 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4513 php_pqstm_object_handlers
.read_property
= php_pq_object_read_prop
;
4514 php_pqstm_object_handlers
.write_property
= php_pq_object_write_prop
;
4515 php_pqstm_object_handlers
.clone_obj
= NULL
;
4516 php_pqstm_object_handlers
.get_property_ptr_ptr
= NULL
;
4517 php_pqstm_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4519 zend_hash_init(&php_pqstm_object_prophandlers
, 2, NULL
, NULL
, 1);
4521 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4522 ph
.read
= php_pqstm_object_read_name
;
4523 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
4525 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4526 ph
.read
= php_pqstm_object_read_connection
;
4527 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4529 memset(&ce
, 0, sizeof(ce
));
4530 INIT_NS_CLASS_ENTRY(ce
, "pq", "Transaction", php_pqtxn_methods
);
4531 php_pqtxn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4532 php_pqtxn_class_entry
->create_object
= php_pqtxn_create_object
;
4534 memcpy(&php_pqtxn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4535 php_pqtxn_object_handlers
.read_property
= php_pq_object_read_prop
;
4536 php_pqtxn_object_handlers
.write_property
= php_pq_object_write_prop
;
4537 php_pqtxn_object_handlers
.clone_obj
= NULL
;
4538 php_pqtxn_object_handlers
.get_property_ptr_ptr
= NULL
;
4539 php_pqtxn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4541 zend_hash_init(&php_pqtxn_object_prophandlers
, 4, NULL
, NULL
, 1);
4543 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4544 ph
.read
= php_pqtxn_object_read_connection
;
4545 zend_hash_add(&php_pqtxn_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4547 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("isolation"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4548 ph
.read
= php_pqtxn_object_read_isolation
;
4549 ph
.write
= php_pqtxn_object_write_isolation
;
4550 zend_hash_add(&php_pqtxn_object_prophandlers
, "isolation", sizeof("isolation"), (void *) &ph
, sizeof(ph
), NULL
);
4552 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("readonly"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4553 ph
.read
= php_pqtxn_object_read_readonly
;
4554 ph
.write
= php_pqtxn_object_write_readonly
;
4555 zend_hash_add(&php_pqtxn_object_prophandlers
, "readonly", sizeof("readonly"), (void *) &ph
, sizeof(ph
), NULL
);
4557 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("deferrable"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4558 ph
.read
= php_pqtxn_object_read_deferrable
;
4559 ph
.write
= php_pqtxn_object_write_deferrable
;
4560 zend_hash_add(&php_pqtxn_object_prophandlers
, "deferrable", sizeof("deferrable"), (void *) &ph
, sizeof(ph
), NULL
);
4563 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("READ_COMMITTED"), PHP_PQTXN_READ_COMMITTED TSRMLS_CC
);
4564 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("REPEATABLE READ"), PHP_PQTXN_REPEATABLE_READ TSRMLS_CC
);
4565 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("SERIALIZABLE"), PHP_PQTXN_SERIALIZABLE TSRMLS_CC
);
4567 memset(&ce
, 0, sizeof(ce
));
4568 INIT_NS_CLASS_ENTRY(ce
, "pq", "Cancel", php_pqcancel_methods
);
4569 php_pqcancel_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4570 php_pqcancel_class_entry
->create_object
= php_pqcancel_create_object
;
4572 memcpy(&php_pqcancel_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4573 php_pqcancel_object_handlers
.read_property
= php_pq_object_read_prop
;
4574 php_pqcancel_object_handlers
.write_property
= php_pq_object_write_prop
;
4575 php_pqcancel_object_handlers
.clone_obj
= NULL
;
4576 php_pqcancel_object_handlers
.get_property_ptr_ptr
= NULL
;
4577 php_pqcancel_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4579 zend_hash_init(&php_pqcancel_object_prophandlers
, 1, NULL
, NULL
, 1);
4581 zend_declare_property_null(php_pqcancel_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4582 ph
.read
= php_pqcancel_object_read_connection
;
4583 zend_hash_add(&php_pqcancel_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4585 memset(&ce
, 0, sizeof(ce
));
4586 INIT_NS_CLASS_ENTRY(ce
, "pq", "Event", php_pqevent_methods
);
4587 php_pqevent_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4588 php_pqevent_class_entry
->create_object
= php_pqevent_create_object
;
4590 memcpy(&php_pqevent_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4591 php_pqevent_object_handlers
.read_property
= php_pq_object_read_prop
;
4592 php_pqevent_object_handlers
.write_property
= php_pq_object_write_prop
;
4593 php_pqevent_object_handlers
.clone_obj
= NULL
;
4594 php_pqevent_object_handlers
.get_property_ptr_ptr
= NULL
;
4595 php_pqevent_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4597 zend_hash_init(&php_pqevent_object_prophandlers
, 2, NULL
, NULL
, 1);
4599 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4600 ph
.read
= php_pqevent_object_read_connection
;
4601 zend_hash_add(&php_pqevent_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4603 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("type"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4604 ph
.read
= php_pqevent_object_read_type
;
4605 zend_hash_add(&php_pqevent_object_prophandlers
, "type", sizeof("type"), (void *) &ph
, sizeof(ph
), NULL
);
4607 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("NOTICE"), ZEND_STRL("notice") TSRMLS_CC
);
4608 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESULT"), ZEND_STRL("result") TSRMLS_CC
);
4609 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESET"), ZEND_STRL("reset") TSRMLS_CC
);
4611 memset(&ce
, 0, sizeof(ce
));
4612 INIT_NS_CLASS_ENTRY(ce
, "pq", "LOB", php_pqlob_methods
);
4613 php_pqlob_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4614 php_pqlob_class_entry
->create_object
= php_pqlob_create_object
;
4616 memcpy(&php_pqlob_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4617 php_pqlob_object_handlers
.read_property
= php_pq_object_read_prop
;
4618 php_pqlob_object_handlers
.write_property
= php_pq_object_write_prop
;
4619 php_pqlob_object_handlers
.clone_obj
= NULL
;
4620 php_pqlob_object_handlers
.get_property_ptr_ptr
= NULL
;
4621 php_pqlob_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4623 zend_hash_init(&php_pqlob_object_prophandlers
, 2, NULL
, NULL
, 1);
4625 zend_declare_property_null(php_pqlob_class_entry
, ZEND_STRL("transaction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4626 ph
.read
= php_pqlob_object_read_transaction
;
4627 zend_hash_add(&php_pqlob_object_prophandlers
, "transaction", sizeof("transaction"), (void *) &ph
, sizeof(ph
), NULL
);
4629 zend_declare_property_long(php_pqlob_class_entry
, ZEND_STRL("oid"), InvalidOid
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4630 ph
.read
= php_pqlob_object_read_oid
;
4631 zend_hash_add(&php_pqlob_object_prophandlers
, "oid", sizeof("oid"), (void *) &ph
, sizeof(ph
), NULL
);
4633 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("INVALID_OID"), InvalidOid TSRMLS_CC
);
4634 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("R"), INV_READ TSRMLS_CC
);
4635 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("W"), INV_WRITE TSRMLS_CC
);
4636 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("RW"), INV_READ
|INV_WRITE TSRMLS_CC
);
4638 memset(&ce
, 0, sizeof(ce
));
4639 INIT_NS_CLASS_ENTRY(ce
, "pq", "COPY", php_pqcopy_methods
);
4640 php_pqcopy_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4641 php_pqcopy_class_entry
->create_object
= php_pqcopy_create_object
;
4643 memcpy(&php_pqcopy_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4644 php_pqcopy_object_handlers
.read_property
= php_pq_object_read_prop
;
4645 php_pqcopy_object_handlers
.write_property
= php_pq_object_write_prop
;
4646 php_pqcopy_object_handlers
.clone_obj
= NULL
;
4647 php_pqcopy_object_handlers
.get_property_ptr_ptr
= NULL
;
4648 php_pqcopy_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4650 zend_hash_init(&php_pqcopy_object_prophandlers
, 4, NULL
, NULL
, 1);
4652 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4653 ph
.read
= php_pqcopy_object_read_connection
;
4654 zend_hash_add(&php_pqcopy_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4656 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("expression"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4657 ph
.read
= php_pqcopy_object_read_expression
;
4658 zend_hash_add(&php_pqcopy_object_prophandlers
, "expression", sizeof("expression"), (void *) &ph
, sizeof(ph
), NULL
);
4660 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("direction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4661 ph
.read
= php_pqcopy_object_read_direction
;
4662 zend_hash_add(&php_pqcopy_object_prophandlers
, "direction", sizeof("direction"), (void *) &ph
, sizeof(ph
), NULL
);
4664 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4665 ph
.read
= php_pqcopy_object_read_options
;
4666 zend_hash_add(&php_pqcopy_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
4668 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("FROM_STDIN"), PHP_PQCOPY_FROM_STDIN TSRMLS_CC
);
4669 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("TO_STDOUT"), PHP_PQCOPY_TO_STDOUT TSRMLS_CC
);
4672 REGISTER_INI_ENTRIES();
4678 /* {{{ PHP_MSHUTDOWN_FUNCTION
4680 static PHP_MSHUTDOWN_FUNCTION(pq
)
4682 /* uncomment this line if you have INI entries
4683 UNREGISTER_INI_ENTRIES();
4689 /* {{{ PHP_MINFO_FUNCTION
4691 static PHP_MINFO_FUNCTION(pq
)
4693 php_info_print_table_start();
4694 php_info_print_table_header(2, "pq support", "enabled");
4695 php_info_print_table_end();
4697 /* Remove comments if you have entries in php.ini
4698 DISPLAY_INI_ENTRIES();
4703 const zend_function_entry pq_functions
[] = {
4707 /* {{{ pq_module_entry
4709 zend_module_entry pq_module_entry
= {
4710 STANDARD_MODULE_HEADER
,
4715 NULL
,/*PHP_RINIT(pq),*/
4716 NULL
,/*PHP_RSHUTDOWN(pq),*/
4719 STANDARD_MODULE_PROPERTIES
4723 #ifdef COMPILE_DL_PQ
4733 * vim600: noet sw=4 ts=4 fdm=marker
4734 * vim<600: noet sw=4 ts=4