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
;
191 unsigned deferrable
:1;
194 typedef struct php_pqtxn_object
{
196 zend_object_value zv
;
197 HashTable
*prophandler
;
199 } php_pqtxn_object_t
;
201 typedef struct php_pqcancel
{
203 php_pqconn_object_t
*conn
;
206 typedef struct php_pqcancel_object
{
208 zend_object_value zv
;
209 HashTable
*prophandler
;
210 php_pqcancel_t
*intern
;
211 } php_pqcancel_object_t
;
213 typedef struct php_pqevent
{
214 php_pq_callback_t cb
;
215 php_pqconn_object_t
*conn
;
219 typedef struct php_pqevent_object
{
221 zend_object_value zv
;
222 HashTable
*prophandler
;
223 php_pqevent_t
*intern
;
224 } php_pqevent_object_t
;
226 typedef struct php_pqlob
{
229 php_pqtxn_object_t
*txn
;
232 typedef struct php_pqlob_object
{
234 zend_object_value zv
;
235 HashTable
*prophandler
;
237 } php_pqlob_object_t
;
239 typedef enum php_pqcopy_direction
{
240 PHP_PQCOPY_FROM_STDIN
,
242 } php_pqcopy_direction_t
;
244 typedef enum php_pqcopy_status
{
248 } php_pqcopy_status_t
;
250 typedef struct php_pqcopy
{
251 php_pqcopy_direction_t direction
;
254 php_pqconn_object_t
*conn
;
257 typedef struct php_pqcopy_object
{
259 zend_object_value zv
;
260 HashTable
*prophandler
;
261 php_pqcopy_t
*intern
;
262 } php_pqcopy_object_t
;
264 static HashTable php_pqconn_object_prophandlers
;
265 static HashTable php_pqtypes_object_prophandlers
;
266 static HashTable php_pqres_object_prophandlers
;
267 static HashTable php_pqstm_object_prophandlers
;
268 static HashTable php_pqtxn_object_prophandlers
;
269 static HashTable php_pqcancel_object_prophandlers
;
270 static HashTable php_pqevent_object_prophandlers
;
271 static HashTable php_pqlob_object_prophandlers
;
272 static HashTable php_pqcopy_object_prophandlers
;
274 typedef void (*php_pq_object_prophandler_func_t
)(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
);
276 typedef struct php_pq_object_prophandler
{
277 php_pq_object_prophandler_func_t read
;
278 php_pq_object_prophandler_func_t write
;
279 } php_pq_object_prophandler_t
;
281 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
283 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
285 php_pqres_iterator_t
*iter
;
286 zval
*prop
, *zfetch_type
;
288 iter
= ecalloc(1, sizeof(*iter
));
289 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
290 iter
->zi
.data
= object
;
293 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
294 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
295 convert_to_long_ex(&zfetch_type
);
297 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
298 if (zfetch_type
!= prop
) {
299 zval_ptr_dtor(&zfetch_type
);
301 if (Z_REFCOUNT_P(prop
)) {
302 zval_ptr_dtor(&prop
);
308 return (zend_object_iterator
*) iter
;
311 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
313 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
315 if (iter
->current_val
) {
316 zval_ptr_dtor(&iter
->current_val
);
317 iter
->current_val
= NULL
;
319 zval_ptr_dtor((zval
**) &iter
->zi
.data
);
323 static STATUS
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
325 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
326 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
328 if (PQresultStatus(obj
->intern
->res
) != PGRES_TUPLES_OK
) {
331 if (PQntuples(obj
->intern
->res
) <= iter
->index
) {
338 static zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type TSRMLS_DC
)
344 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
350 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
351 if (PQgetisnull(res
, row
, c
)) {
352 switch (fetch_type
) {
353 case PHP_PQRES_FETCH_OBJECT
:
354 add_property_null(data
, PQfname(res
, c
));
357 case PHP_PQRES_FETCH_ASSOC
:
358 add_assoc_null(data
, PQfname(res
, c
));
361 case PHP_PQRES_FETCH_ARRAY
:
362 add_index_null(data
, c
);
366 char *val
= PQgetvalue(res
, row
, c
);
367 int len
= PQgetlength(res
, row
, c
);
369 switch (fetch_type
) {
370 case PHP_PQRES_FETCH_OBJECT
:
371 add_property_stringl(data
, PQfname(res
, c
), val
, len
, 1);
374 case PHP_PQRES_FETCH_ASSOC
:
375 add_assoc_stringl(data
, PQfname(res
, c
), val
, len
, 1);
378 case PHP_PQRES_FETCH_ARRAY
:
379 add_index_stringl(data
, c
, val
, len
,1);
388 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
390 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
391 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
393 if (iter
->current_val
) {
394 zval_ptr_dtor(&iter
->current_val
);
396 iter
->current_val
= php_pqres_row_to_zval(obj
->intern
->res
, iter
->index
, iter
->fetch_type TSRMLS_CC
);
397 *data_ptr
= &iter
->current_val
;
400 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
402 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
404 *key_num
= (ulong
) iter
->index
;
406 return HASH_KEY_IS_LONG
;
409 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
411 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
416 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
418 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
423 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
424 php_pqres_iterator_dtor
,
425 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
426 php_pqres_iterator_valid
,
427 /* fetch the item data for the current element */
428 php_pqres_iterator_current
,
429 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
430 php_pqres_iterator_key
,
431 /* step forwards to next element */
432 php_pqres_iterator_next
,
433 /* rewind to start of data (optional, may be NULL) */
434 php_pqres_iterator_rewind
,
435 /* invalidate current value/key (optional, may be NULL) */
439 static STATUS
php_pqres_success(PGresult
*res TSRMLS_DC
)
441 switch (PQresultStatus(res
)) {
442 case PGRES_BAD_RESPONSE
:
443 case PGRES_NONFATAL_ERROR
:
444 case PGRES_FATAL_ERROR
:
445 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "%s", PHP_PQresultErrorMessage(res
));
452 static void php_pq_callback_dtor(php_pq_callback_t
*cb
) {
453 if (cb
->fci
.size
> 0) {
454 zend_fcall_info_args_clear(&cb
->fci
, 1);
455 zval_ptr_dtor(&cb
->fci
.function_name
);
456 if (cb
->fci
.object_ptr
) {
457 zval_ptr_dtor(&cb
->fci
.object_ptr
);
463 static void php_pq_callback_addref(php_pq_callback_t
*cb
)
465 Z_ADDREF_P(cb
->fci
.function_name
);
466 if (cb
->fci
.object_ptr
) {
467 Z_ADDREF_P(cb
->fci
.object_ptr
);
471 static void php_pq_object_to_zval(void *o
, zval
**zv TSRMLS_DC
)
473 php_pq_object_t
*obj
= o
;
479 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
481 (*zv
)->type
= IS_OBJECT
;
482 (*zv
)->value
.obj
= obj
->zv
;
485 static void php_pq_object_addref(void *o TSRMLS_DC
)
487 php_pq_object_t
*obj
= o
;
488 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
491 static void php_pq_object_delref(void *o TSRMLS_DC
)
493 php_pq_object_t
*obj
= o
;
494 zend_objects_store_del_ref_by_handle_ex(obj
->zv
.handle
, obj
->zv
.handlers TSRMLS_CC
);
497 static void php_pqconn_object_free(void *o TSRMLS_DC
)
499 php_pqconn_object_t
*obj
= o
;
502 PQfinish(obj
->intern
->conn
);
503 php_pq_callback_dtor(&obj
->intern
->onevent
);
504 zend_hash_destroy(&obj
->intern
->listeners
);
505 zend_hash_destroy(&obj
->intern
->eventhandlers
);
509 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
513 static void php_pqtypes_object_free(void *o TSRMLS_DC
)
515 php_pqtypes_object_t
*obj
= o
;
518 zend_hash_destroy(&obj
->intern
->types
);
519 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
523 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
527 static void php_pqres_object_free(void *o TSRMLS_DC
)
529 php_pqres_object_t
*obj
= o
;
532 if (obj
->intern
->res
) {
533 zval
*res
= PQresultInstanceData(obj
->intern
->res
, php_pqconn_event
);
535 if (1 == Z_REFCOUNT_P(res
)) {
536 PQresultSetInstanceData(obj
->intern
->res
, php_pqconn_event
, NULL
);
540 PQclear(obj
->intern
->res
);
541 obj
->intern
->res
= NULL
;
545 if (obj
->intern
->iter
) {
546 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
547 obj
->intern
->iter
= NULL
;
553 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
557 static void php_pqstm_object_free(void *o TSRMLS_DC
)
559 php_pqstm_object_t
*obj
= o
;
562 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
563 efree(obj
->intern
->name
);
567 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
571 static void php_pqtxn_object_free(void *o TSRMLS_DC
)
573 php_pqtxn_object_t
*obj
= o
;
576 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
580 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
584 static void php_pqcancel_object_free(void *o TSRMLS_DC
)
586 php_pqcancel_object_t
*obj
= o
;
589 PQfreeCancel(obj
->intern
->cancel
);
590 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
594 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
598 static void php_pqevent_object_free(void *o TSRMLS_DC
)
600 php_pqevent_object_t
*obj
= o
;
603 php_pq_callback_dtor(&obj
->intern
->cb
);
604 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
605 efree(obj
->intern
->type
);
609 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
613 static void php_pqlob_object_free(void *o TSRMLS_DC
)
615 php_pqlob_object_t
*obj
= o
;
618 if (obj
->intern
->lofd
) {
619 lo_close(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
621 php_pq_object_delref(obj
->intern
->txn TSRMLS_CC
);
625 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
629 static void php_pqcopy_object_free(void *o TSRMLS_DC
)
631 php_pqcopy_object_t
*obj
= o
;
634 efree(obj
->intern
->expression
);
635 efree(obj
->intern
->options
);
636 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
640 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
644 static zend_object_value
php_pqconn_create_object_ex(zend_class_entry
*ce
, php_pqconn_t
*intern
, php_pqconn_object_t
**ptr TSRMLS_DC
)
646 php_pqconn_object_t
*o
;
648 o
= ecalloc(1, sizeof(*o
));
649 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
650 object_properties_init((zend_object
*) o
, ce
);
651 o
->prophandler
= &php_pqconn_object_prophandlers
;
661 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqconn_object_free
, NULL TSRMLS_CC
);
662 o
->zv
.handlers
= &php_pqconn_object_handlers
;
667 static zend_object_value
php_pqtypes_create_object_ex(zend_class_entry
*ce
, php_pqtypes_t
*intern
, php_pqtypes_object_t
**ptr TSRMLS_DC
)
669 php_pqtypes_object_t
*o
;
671 o
= ecalloc(1, sizeof(*o
));
672 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
673 object_properties_init((zend_object
*) o
, ce
);
674 o
->prophandler
= &php_pqtypes_object_prophandlers
;
684 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtypes_object_free
, NULL TSRMLS_CC
);
685 o
->zv
.handlers
= &php_pqtypes_object_handlers
;
690 static zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, php_pqres_t
*intern
, php_pqres_object_t
**ptr TSRMLS_DC
)
692 php_pqres_object_t
*o
;
694 o
= ecalloc(1, sizeof(*o
));
695 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
696 object_properties_init((zend_object
*) o
, ce
);
697 o
->prophandler
= &php_pqres_object_prophandlers
;
707 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
708 o
->zv
.handlers
= &php_pqres_object_handlers
;
713 static zend_object_value
php_pqstm_create_object_ex(zend_class_entry
*ce
, php_pqstm_t
*intern
, php_pqstm_object_t
**ptr TSRMLS_DC
)
715 php_pqstm_object_t
*o
;
717 o
= ecalloc(1, sizeof(*o
));
718 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
719 object_properties_init((zend_object
*) o
, ce
);
720 o
->prophandler
= &php_pqstm_object_prophandlers
;
730 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqstm_object_free
, NULL TSRMLS_CC
);
731 o
->zv
.handlers
= &php_pqstm_object_handlers
;
736 static zend_object_value
php_pqtxn_create_object_ex(zend_class_entry
*ce
, php_pqtxn_t
*intern
, php_pqtxn_object_t
**ptr TSRMLS_DC
)
738 php_pqtxn_object_t
*o
;
740 o
= ecalloc(1, sizeof(*o
));
741 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
742 object_properties_init((zend_object
*) o
, ce
);
743 o
->prophandler
= &php_pqtxn_object_prophandlers
;
753 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtxn_object_free
, NULL TSRMLS_CC
);
754 o
->zv
.handlers
= &php_pqtxn_object_handlers
;
759 static zend_object_value
php_pqcancel_create_object_ex(zend_class_entry
*ce
, php_pqcancel_t
*intern
, php_pqcancel_object_t
**ptr TSRMLS_DC
)
761 php_pqcancel_object_t
*o
;
763 o
= ecalloc(1, sizeof(*o
));
764 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
765 object_properties_init((zend_object
*) o
, ce
);
766 o
->prophandler
= &php_pqcancel_object_prophandlers
;
776 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcancel_object_free
, NULL TSRMLS_CC
);
777 o
->zv
.handlers
= &php_pqcancel_object_handlers
;
782 static zend_object_value
php_pqevent_create_object_ex(zend_class_entry
*ce
, php_pqevent_t
*intern
, php_pqevent_object_t
**ptr TSRMLS_DC
)
784 php_pqevent_object_t
*o
;
786 o
= ecalloc(1, sizeof(*o
));
787 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
788 object_properties_init((zend_object
*) o
, ce
);
789 o
->prophandler
= &php_pqevent_object_prophandlers
;
799 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqevent_object_free
, NULL TSRMLS_CC
);
800 o
->zv
.handlers
= &php_pqevent_object_handlers
;
805 static zend_object_value
php_pqlob_create_object_ex(zend_class_entry
*ce
, php_pqlob_t
*intern
, php_pqlob_object_t
**ptr TSRMLS_DC
)
807 php_pqlob_object_t
*o
;
809 o
= ecalloc(1, sizeof(*o
));
810 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
811 object_properties_init((zend_object
*) o
, ce
);
812 o
->prophandler
= &php_pqlob_object_prophandlers
;
822 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqlob_object_free
, NULL TSRMLS_CC
);
823 o
->zv
.handlers
= &php_pqlob_object_handlers
;
828 static zend_object_value
php_pqcopy_create_object_ex(zend_class_entry
*ce
, php_pqcopy_t
*intern
, php_pqcopy_object_t
**ptr TSRMLS_DC
)
830 php_pqcopy_object_t
*o
;
832 o
= ecalloc(1, sizeof(*o
));
833 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
834 object_properties_init((zend_object
*) o
, ce
);
835 o
->prophandler
= &php_pqcopy_object_prophandlers
;
845 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcopy_object_free
, NULL TSRMLS_CC
);
846 o
->zv
.handlers
= &php_pqcopy_object_handlers
;
851 static zend_object_value
php_pqconn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
853 return php_pqconn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
856 static zend_object_value
php_pqtypes_create_object(zend_class_entry
*class_type TSRMLS_DC
)
858 return php_pqtypes_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
861 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
863 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
866 static zend_object_value
php_pqstm_create_object(zend_class_entry
*class_type TSRMLS_DC
)
868 return php_pqstm_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
871 static zend_object_value
php_pqtxn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
873 return php_pqtxn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
876 static zend_object_value
php_pqcancel_create_object(zend_class_entry
*class_type TSRMLS_DC
)
878 return php_pqcancel_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
881 static zend_object_value
php_pqevent_create_object(zend_class_entry
*class_type TSRMLS_DC
)
883 return php_pqevent_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
886 static zend_object_value
php_pqlob_create_object(zend_class_entry
*class_type TSRMLS_DC
)
888 return php_pqlob_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
891 static zend_object_value
php_pqcopy_create_object(zend_class_entry
*class_type TSRMLS_DC
)
893 return php_pqcopy_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
896 static int apply_ph_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
898 php_pq_object_prophandler_t
*ph
= p
;
899 HashTable
*ht
= va_arg(argv
, HashTable
*);
900 zval
**return_value
, *object
= va_arg(argv
, zval
*);
901 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
903 if (SUCCESS
== zend_hash_find(ht
, key
->arKey
, key
->nKeyLength
, (void *) &return_value
)) {
906 zval_ptr_dtor(return_value
);
907 MAKE_STD_ZVAL(*return_value
);
908 ZVAL_NULL(*return_value
);
910 ph
->read(object
, obj
, *return_value TSRMLS_CC
);
914 return ZEND_HASH_APPLY_KEEP
;
917 static int apply_pi_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
919 zend_property_info
*pi
= p
;
920 HashTable
*ht
= va_arg(argv
, HashTable
*);
921 zval
*object
= va_arg(argv
, zval
*);
922 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
923 zval
*property
= zend_read_property(obj
->zo
.ce
, object
, pi
->name
, pi
->name_length
, 0 TSRMLS_CC
);
925 if (1||!Z_REFCOUNT_P(property
)) {
926 Z_ADDREF_P(property
);
928 zend_hash_add(ht
, pi
->name
, pi
->name_length
+ 1, (void *) &property
, sizeof(zval
*), NULL
);
930 return ZEND_HASH_APPLY_KEEP
;
933 static HashTable
*php_pq_object_debug_info(zval
*object
, int *temp TSRMLS_DC
)
936 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
940 ZEND_INIT_SYMTABLE(ht
);
942 zend_hash_apply_with_arguments(&obj
->zo
.ce
->properties_info TSRMLS_CC
, apply_pi_to_debug
, 3, ht
, object
, obj
);
943 zend_hash_apply_with_arguments(obj
->prophandler TSRMLS_CC
, apply_ph_to_debug
, 3, ht
, object
, obj
);
948 static void php_pqconn_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
950 php_pqconn_object_t
*obj
= o
;
952 RETVAL_LONG(PQstatus(obj
->intern
->conn
));
955 static void php_pqconn_object_read_transaction_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
957 php_pqconn_object_t
*obj
= o
;
959 RETVAL_LONG(PQtransactionStatus(obj
->intern
->conn
));
962 static void php_pqconn_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
964 php_pqconn_object_t
*obj
= o
;
965 char *error
= PHP_PQerrorMessage(obj
->intern
->conn
);
968 RETVAL_STRING(error
, 1);
974 static int apply_notify_listener(void *p
, void *arg TSRMLS_DC
)
976 php_pq_callback_t
*listener
= p
;
978 zval
*zpid
, *zchannel
, *zmessage
;
981 ZVAL_LONG(zpid
, nfy
->be_pid
);
982 MAKE_STD_ZVAL(zchannel
);
983 ZVAL_STRING(zchannel
, nfy
->relname
, 1);
984 MAKE_STD_ZVAL(zmessage
);
985 ZVAL_STRING(zmessage
, nfy
->extra
, 1);
987 zend_fcall_info_argn(&listener
->fci TSRMLS_CC
, 3, &zchannel
, &zmessage
, &zpid
);
988 zend_fcall_info_call(&listener
->fci
, &listener
->fcc
, NULL
, NULL TSRMLS_CC
);
990 zval_ptr_dtor(&zchannel
);
991 zval_ptr_dtor(&zmessage
);
992 zval_ptr_dtor(&zpid
);
994 return ZEND_HASH_APPLY_KEEP
;
997 static int apply_notify_listeners(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
999 HashTable
*listeners
= p
;
1000 PGnotify
*nfy
= va_arg(argv
, PGnotify
*);
1002 if (0 == fnmatch(key
->arKey
, nfy
->relname
, 0)) {
1003 zend_hash_apply_with_argument(listeners
, apply_notify_listener
, nfy TSRMLS_CC
);
1006 return ZEND_HASH_APPLY_KEEP
;
1009 static void php_pqconn_notify_listeners(php_pqconn_object_t
*obj TSRMLS_DC
)
1013 while ((nfy
= PQnotifies(obj
->intern
->conn
))) {
1014 zend_hash_apply_with_arguments(&obj
->intern
->listeners TSRMLS_CC
, apply_notify_listeners
, 1, nfy
);
1019 static void php_pqconn_object_read_busy(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1021 php_pqconn_object_t
*obj
= o
;
1023 RETVAL_BOOL(PQisBusy(obj
->intern
->conn
));
1026 static void php_pqconn_object_read_encoding(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1028 php_pqconn_object_t
*obj
= o
;
1030 RETVAL_STRING(pg_encoding_to_char(PQclientEncoding(obj
->intern
->conn
)), 1);
1033 static void php_pqconn_object_write_encoding(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1035 php_pqconn_object_t
*obj
= o
;
1038 if (Z_TYPE_P(value
) != IS_STRING
) {
1039 convert_to_string_ex(&zenc
);
1042 if (0 > PQsetClientEncoding(obj
->intern
->conn
, Z_STRVAL_P(zenc
))) {
1043 zend_error(E_NOTICE
, "Unrecognized encoding '%s'", Z_STRVAL_P(zenc
));
1046 if (zenc
!= value
) {
1047 zval_ptr_dtor(&zenc
);
1051 static void php_pqconn_object_read_unbuffered(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1053 php_pqconn_object_t
*obj
= o
;
1055 RETVAL_BOOL(obj
->intern
->unbuffered
);
1058 static void php_pqconn_object_write_unbuffered(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1060 php_pqconn_object_t
*obj
= o
;
1062 obj
->intern
->unbuffered
= zend_is_true(value
);
1065 static void php_pqconn_object_read_db(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1067 php_pqconn_object_t
*obj
= o
;
1068 char *db
= PQdb(obj
->intern
->conn
);
1071 RETVAL_STRING(db
, 1);
1073 RETVAL_EMPTY_STRING();
1077 static void php_pqconn_object_read_user(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1079 php_pqconn_object_t
*obj
= o
;
1080 char *user
= PQuser(obj
->intern
->conn
);
1083 RETVAL_STRING(user
, 1);
1085 RETVAL_EMPTY_STRING();
1089 static void php_pqconn_object_read_pass(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1091 php_pqconn_object_t
*obj
= o
;
1092 char *pass
= PQpass(obj
->intern
->conn
);
1095 RETVAL_STRING(pass
, 1);
1097 RETVAL_EMPTY_STRING();
1101 static void php_pqconn_object_read_host(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1103 php_pqconn_object_t
*obj
= o
;
1104 char *host
= PQhost(obj
->intern
->conn
);
1107 RETVAL_STRING(host
, 1);
1109 RETVAL_EMPTY_STRING();
1113 static void php_pqconn_object_read_port(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1115 php_pqconn_object_t
*obj
= o
;
1116 char *port
= PQport(obj
->intern
->conn
);
1119 RETVAL_STRING(port
, 1);
1121 RETVAL_EMPTY_STRING();
1125 static void php_pqconn_object_read_options(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1127 php_pqconn_object_t
*obj
= o
;
1128 char *options
= PQoptions(obj
->intern
->conn
);
1131 RETVAL_STRING(options
, 1);
1133 RETVAL_EMPTY_STRING();
1137 static void php_pqtypes_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1139 php_pqtypes_object_t
*obj
= o
;
1141 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1144 static int has_dimension(HashTable
*ht
, zval
*member
, char **key_str
, int *key_len
, long *index TSRMLS_DC
)
1149 switch (Z_TYPE_P(member
)) {
1151 convert_to_string_ex(&tmp
);
1154 if (!is_numeric_string(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
), &lval
, NULL
, 0)) {
1155 if (member
!= tmp
) {
1156 zval_ptr_dtor(&tmp
);
1159 *key_str
= estrndup(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
));
1161 *key_len
= Z_STRLEN_P(tmp
) + 1;
1164 return zend_hash_exists(ht
, Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
) + 1);
1168 lval
= Z_LVAL_P(member
);
1172 if (member
!= tmp
) {
1173 zval_ptr_dtor(&tmp
);
1178 return zend_hash_index_exists(ht
, lval
);
1181 static int php_pqtypes_object_has_dimension(zval
*object
, zval
*member
, int check_empty TSRMLS_DC
)
1183 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1184 char *key_str
= NULL
;
1189 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1192 if (key_str
&& key_len
) {
1193 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1195 return Z_TYPE_PP(data
) != IS_NULL
;
1199 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) data
)) {
1200 return Z_TYPE_PP(data
) != IS_NULL
;
1205 return has_dimension(&obj
->intern
->types
, member
, NULL
, NULL
, NULL TSRMLS_CC
);
1211 static zval
*php_pqtypes_object_read_dimension(zval
*object
, zval
*member
, int type TSRMLS_DC
)
1214 char *key_str
= NULL
;
1216 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1218 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1221 if (key_str
&& key_len
) {
1222 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1227 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) &data
)) {
1236 static void php_pqres_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1238 php_pqres_object_t
*obj
= o
;
1240 RETVAL_LONG(PQresultStatus(obj
->intern
->res
));
1243 static void php_pqres_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1245 php_pqres_object_t
*obj
= o
;
1246 char *error
= PHP_PQresultErrorMessage(obj
->intern
->res
);
1249 RETVAL_STRING(error
, 1);
1255 static void php_pqres_object_read_num_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1257 php_pqres_object_t
*obj
= o
;
1259 RETVAL_LONG(PQntuples(obj
->intern
->res
));
1262 static void php_pqres_object_read_num_cols(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1264 php_pqres_object_t
*obj
= o
;
1266 RETVAL_LONG(PQnfields(obj
->intern
->res
));
1269 static void php_pqres_object_read_affected_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1271 php_pqres_object_t
*obj
= o
;
1273 RETVAL_LONG(atoi(PQcmdTuples(obj
->intern
->res
)));
1276 static void php_pqres_object_read_fetch_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1278 php_pqres_object_t
*obj
= o
;
1280 if (obj
->intern
->iter
) {
1281 RETVAL_LONG(obj
->intern
->iter
->fetch_type
);
1283 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
1287 static void php_pqres_object_write_fetch_type(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1289 php_pqres_object_t
*obj
= o
;
1290 zval
*zfetch_type
= value
;
1292 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
1293 convert_to_long_ex(&zfetch_type
);
1296 if (!obj
->intern
->iter
) {
1297 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
1298 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
1300 obj
->intern
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
1302 if (zfetch_type
!= value
) {
1303 zval_ptr_dtor(&zfetch_type
);
1307 static void php_pqstm_object_read_name(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1309 php_pqstm_object_t
*obj
= o
;
1311 RETVAL_STRING(obj
->intern
->name
, 1);
1314 static void php_pqstm_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1316 php_pqstm_object_t
*obj
= o
;
1318 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1321 static void php_pqtxn_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1323 php_pqtxn_object_t
*obj
= o
;
1325 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1328 static void php_pqtxn_object_read_isolation(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1330 php_pqtxn_object_t
*obj
= o
;
1332 RETVAL_LONG(obj
->intern
->isolation
);
1335 static void php_pqtxn_object_read_readonly(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1337 php_pqtxn_object_t
*obj
= o
;
1339 RETVAL_LONG(obj
->intern
->readonly
);
1342 static void php_pqtxn_object_read_deferrable(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1344 php_pqtxn_object_t
*obj
= o
;
1346 RETVAL_LONG(obj
->intern
->deferrable
);
1349 static void php_pqtxn_object_write_isolation(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1351 php_pqtxn_object_t
*obj
= o
;
1352 php_pqtxn_isolation_t orig
= obj
->intern
->isolation
;
1353 zval
*zisolation
= value
;
1356 if (Z_TYPE_P(zisolation
) != IS_LONG
) {
1357 convert_to_long_ex(&zisolation
);
1360 switch ((obj
->intern
->isolation
= Z_LVAL_P(zisolation
))) {
1361 case PHP_PQTXN_READ_COMMITTED
:
1362 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ COMMITED");
1364 case PHP_PQTXN_REPEATABLE_READ
:
1365 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION REPEATABLE READ");
1367 case PHP_PQTXN_SERIALIZABLE
:
1368 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION SERIALIZABLE");
1371 obj
->intern
->isolation
= orig
;
1376 if (zisolation
!= value
) {
1377 zval_ptr_dtor(&zisolation
);
1381 php_pqres_success(res TSRMLS_CC
);
1386 static void php_pqtxn_object_write_readonly(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1388 php_pqtxn_object_t
*obj
= o
;
1391 if ((obj
->intern
->readonly
= zend_is_true(value
))) {
1392 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ ONLY");
1394 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ WRITE");
1398 php_pqres_success(res TSRMLS_CC
);
1403 static void php_pqtxn_object_write_deferrable(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1405 php_pqtxn_object_t
*obj
= o
;
1408 if ((obj
->intern
->deferrable
= zend_is_true(value
))) {
1409 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION DEFERRABLE");
1411 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION NOT DEFERRABLE");
1415 php_pqres_success(res TSRMLS_CC
);
1420 static void php_pqcancel_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1422 php_pqcancel_object_t
*obj
= o
;
1424 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1427 static void php_pqevent_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1429 php_pqevent_object_t
*obj
= o
;
1431 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1434 static void php_pqevent_object_read_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1436 php_pqevent_object_t
*obj
= o
;
1438 RETVAL_STRING(obj
->intern
->type
, 1);
1441 static void php_pqlob_object_read_transaction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1443 php_pqlob_object_t
*obj
= o
;
1445 php_pq_object_to_zval(obj
->intern
->txn
, &return_value TSRMLS_CC
);
1448 static void php_pqlob_object_read_oid(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1450 php_pqlob_object_t
*obj
= o
;
1452 RETVAL_LONG(obj
->intern
->loid
);
1455 static void php_pqcopy_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1457 php_pqcopy_object_t
*obj
= o
;
1459 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1462 static void php_pqcopy_object_read_direction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1464 php_pqcopy_object_t
*obj
= o
;
1466 RETVAL_LONG(obj
->intern
->direction
);
1469 static void php_pqcopy_object_read_expression(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1471 php_pqcopy_object_t
*obj
= o
;
1473 RETURN_STRING(obj
->intern
->expression
, 1);
1476 static void php_pqcopy_object_read_options(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1478 php_pqcopy_object_t
*obj
= o
;
1480 RETURN_STRING(obj
->intern
->options
, 1);
1483 static zend_class_entry
*ancestor(zend_class_entry
*ce
) {
1484 while (ce
->parent
) {
1490 static zval
*php_pq_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
1492 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1493 php_pq_object_prophandler_t
*handler
;
1497 zend_error(E_WARNING
, "%s not initialized", ancestor(obj
->zo
.ce
)->name
);
1498 } else if ((SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) && handler
->read
) {
1499 if (type
== BP_VAR_R
) {
1500 ALLOC_ZVAL(return_value
);
1501 Z_SET_REFCOUNT_P(return_value
, 0);
1502 Z_UNSET_ISREF_P(return_value
);
1504 handler
->read(object
, obj
, return_value TSRMLS_CC
);
1506 zend_error(E_ERROR
, "Cannot access %s properties by reference or array key/index", ancestor(obj
->zo
.ce
)->name
);
1507 return_value
= NULL
;
1510 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
1513 return return_value
;
1516 static void php_pq_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
1518 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1519 php_pq_object_prophandler_t
*handler
;
1521 if (SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
1522 if (handler
->write
) {
1523 handler
->write(object
, obj
, value TSRMLS_CC
);
1526 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
1530 static STATUS
php_pqconn_update_socket(zval
*this_ptr
, php_pqconn_object_t
*obj TSRMLS_DC
)
1532 zval
*zsocket
, zmember
;
1538 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1541 INIT_PZVAL(&zmember
);
1542 ZVAL_STRINGL(&zmember
, "socket", sizeof("socket")-1, 0);
1543 MAKE_STD_ZVAL(zsocket
);
1545 if ((CONNECTION_BAD
!= PQstatus(obj
->intern
->conn
))
1546 && (-1 < (socket
= PQsocket(obj
->intern
->conn
)))
1547 && (stream
= php_stream_fopen_from_fd(socket
, "r+b", NULL
))) {
1548 php_stream_to_zval(stream
, zsocket
);
1554 zend_get_std_object_handlers()->write_property(getThis(), &zmember
, zsocket
, NULL TSRMLS_CC
);
1555 zval_ptr_dtor(&zsocket
);
1561 # define TSRMLS_DF(d) TSRMLS_D = (d)->ts
1562 # define TSRMLS_CF(d) (d)->ts = TSRMLS_C
1564 # define TSRMLS_DF(d)
1565 # define TSRMLS_CF(d)
1568 static void php_pqconn_event_register(PGEventRegister
*event
, php_pqconn_event_data_t
*data
)
1570 PQsetInstanceData(event
->conn
, php_pqconn_event
, data
);
1573 static void php_pqconn_event_conndestroy(PGEventConnDestroy
*event
, php_pqconn_event_data_t
*data
)
1575 PQsetInstanceData(event
->conn
, php_pqconn_event
, NULL
);
1579 static int apply_event(void *p
, void *a TSRMLS_DC
)
1583 zval
*retval
= NULL
;
1585 zend_call_method_with_1_params(evh
, Z_OBJCE_PP(evh
), NULL
, "trigger", &retval
, args
);
1587 zval_ptr_dtor(&retval
);
1590 return ZEND_HASH_APPLY_KEEP
;
1593 static void php_pqconn_event_connreset(PGEventConnReset
*event
, php_pqconn_event_data_t
*data
)
1598 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("reset"), (void *) &evhs
)) {
1599 zval
*args
, *connection
= NULL
;
1601 MAKE_STD_ZVAL(args
);
1603 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1604 add_next_index_zval(args
, connection
);
1605 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1606 zval_ptr_dtor(&args
);
1610 static zval
*result_instance_zval(PGresult
*res TSRMLS_DC
)
1612 zval
*rid
= PQresultInstanceData(res
, php_pqconn_event
);
1615 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1619 rid
->type
= IS_OBJECT
;
1620 rid
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1622 PQresultSetInstanceData(res
, php_pqconn_event
, rid
);
1629 static void php_pqconn_event_resultcreate(PGEventResultCreate
*event
, php_pqconn_event_data_t
*data
)
1634 /* event listener */
1635 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("result"), (void *) &evhs
)) {
1636 zval
*args
, *connection
= NULL
, *res
= result_instance_zval(event
->result TSRMLS_CC
);
1638 MAKE_STD_ZVAL(args
);
1640 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1641 add_next_index_zval(args
, connection
);
1642 add_next_index_zval(args
, res
);
1643 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1644 zval_ptr_dtor(&args
);
1647 /* async callback */
1648 if (data
->obj
->intern
->onevent
.fci
.size
> 0) {
1649 zval
*res
= result_instance_zval(event
->result TSRMLS_CC
);
1651 zend_fcall_info_argn(&data
->obj
->intern
->onevent
.fci TSRMLS_CC
, 1, &res
);
1652 zend_fcall_info_call(&data
->obj
->intern
->onevent
.fci
, &data
->obj
->intern
->onevent
.fcc
, NULL
, NULL TSRMLS_CC
);
1653 zval_ptr_dtor(&res
);
1657 static int php_pqconn_event(PGEventId id
, void *e
, void *data
)
1660 case PGEVT_REGISTER
:
1661 php_pqconn_event_register(e
, data
);
1663 case PGEVT_CONNDESTROY
:
1664 php_pqconn_event_conndestroy(e
, data
);
1666 case PGEVT_CONNRESET
:
1667 php_pqconn_event_connreset(e
, data
);
1669 case PGEVT_RESULTCREATE
:
1670 php_pqconn_event_resultcreate(e
, data
);
1679 static php_pqconn_event_data_t
*php_pqconn_event_data_init(php_pqconn_object_t
*obj TSRMLS_DC
)
1681 php_pqconn_event_data_t
*data
= emalloc(sizeof(*data
));
1689 static void php_pqconn_notice_recv(void *p
, const PGresult
*res
)
1691 php_pqconn_event_data_t
*data
= p
;
1695 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("notice"), (void *) &evhs
)) {
1696 zval
*args
, *connection
= NULL
;
1698 MAKE_STD_ZVAL(args
);
1700 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1701 add_next_index_zval(args
, connection
);
1702 add_next_index_string(args
, PHP_PQresultErrorMessage(res
), 1);
1703 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1704 zval_ptr_dtor(&args
);
1708 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
1709 ZEND_ARG_INFO(0, dsn
)
1710 ZEND_ARG_INFO(0, async
)
1711 ZEND_END_ARG_INFO();
1712 static PHP_METHOD(pqconn
, __construct
) {
1713 zend_error_handling zeh
;
1716 zend_bool async
= 0;
1718 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1719 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|sb", &dsn_str
, &dsn_len
, &async
)) {
1720 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1721 php_pqconn_event_data_t
*data
= php_pqconn_event_data_init(obj TSRMLS_CC
);
1723 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
1725 zend_hash_init(&obj
->intern
->listeners
, 0, NULL
, (dtor_func_t
) zend_hash_destroy
, 0);
1726 zend_hash_init(&obj
->intern
->eventhandlers
, 0, NULL
, ZVAL_PTR_DTOR
, 0);
1730 obj
->intern
->conn
= PQconnectStart(dsn_str
);
1731 obj
->intern
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
1733 obj
->intern
->conn
= PQconnectdb(dsn_str
);
1736 PQsetNoticeReceiver(obj
->intern
->conn
, php_pqconn_notice_recv
, data
);
1737 PQregisterEventProc(obj
->intern
->conn
, php_pqconn_event
, "ext-pq", data
);
1739 if (SUCCESS
!= php_pqconn_update_socket(getThis(), obj TSRMLS_CC
)) {
1740 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1743 zend_restore_error_handling(&zeh TSRMLS_CC
);
1746 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
1747 ZEND_END_ARG_INFO();
1748 static PHP_METHOD(pqconn
, reset
) {
1749 if (SUCCESS
== zend_parse_parameters_none()) {
1750 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1753 PQreset(obj
->intern
->conn
);
1755 if (CONNECTION_OK
== PQstatus(obj
->intern
->conn
)) {
1758 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection reset failed: (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1761 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1767 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset_async
, 0, 0, 0)
1768 ZEND_END_ARG_INFO();
1769 static PHP_METHOD(pqconn
, resetAsync
) {
1770 if (SUCCESS
== zend_parse_parameters_none()) {
1771 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1774 if (PQresetStart(obj
->intern
->conn
)) {
1775 obj
->intern
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
1779 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1785 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
)
1787 HashTable ht
, *existing_listeners
;
1789 php_pq_callback_addref(listener
);
1791 if (SUCCESS
== zend_hash_find(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &existing_listeners
)) {
1792 zend_hash_next_index_insert(existing_listeners
, (void *) listener
, sizeof(*listener
), NULL
);
1794 zend_hash_init(&ht
, 1, NULL
, (dtor_func_t
) php_pq_callback_dtor
, 0);
1795 zend_hash_next_index_insert(&ht
, (void *) listener
, sizeof(*listener
), NULL
);
1796 zend_hash_add(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &ht
, sizeof(HashTable
), NULL
);
1800 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_listen
, 0, 0, 0)
1801 ZEND_ARG_INFO(0, channel
)
1802 ZEND_ARG_INFO(0, callable
)
1803 ZEND_END_ARG_INFO();
1804 static PHP_METHOD(pqconn
, listen
) {
1805 char *channel_str
= NULL
;
1806 int channel_len
= 0;
1807 php_pq_callback_t listener
;
1809 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sf", &channel_str
, &channel_len
, &listener
.fci
, &listener
.fcc
)) {
1810 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1812 obj
->intern
->poller
= PQconsumeInput
;
1815 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, channel_str
, channel_len
);
1817 if (quoted_channel
) {
1821 spprintf(&cmd
, 0, "LISTEN %s", channel_str
);
1822 res
= PQexec(obj
->intern
->conn
, cmd
);
1825 PQfreemem(quoted_channel
);
1828 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1829 php_pqconn_add_listener(obj
, channel_str
, channel_len
, &listener TSRMLS_CC
);
1836 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not install listener (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1840 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1842 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape channel identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1845 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1851 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_notify
, 0, 0, 2)
1852 ZEND_ARG_INFO(0, channel
)
1853 ZEND_ARG_INFO(0, message
)
1854 ZEND_END_ARG_INFO();
1855 static PHP_METHOD(pqconn
, notify
) {
1856 char *channel_str
, *message_str
;
1857 int channel_len
, message_len
;
1859 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &channel_str
, &channel_len
, &message_str
, &message_len
)) {
1860 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1864 char *params
[2] = {channel_str
, message_str
};
1866 res
= PQexecParams(obj
->intern
->conn
, "select pg_notify($1, $2)", 2, NULL
, (const char *const*) params
, NULL
, NULL
, 0);
1869 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1876 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not notify listeners (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1880 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1883 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1889 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
1890 ZEND_END_ARG_INFO();
1891 static PHP_METHOD(pqconn
, poll
) {
1892 if (SUCCESS
== zend_parse_parameters_none()) {
1893 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1896 if (obj
->intern
->poller
) {
1897 if (obj
->intern
->poller
== PQconsumeInput
) {
1898 RETVAL_LONG(obj
->intern
->poller(obj
->intern
->conn
) * PGRES_POLLING_OK
);
1899 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1902 RETURN_LONG(obj
->intern
->poller(obj
->intern
->conn
));
1905 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
1908 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1914 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
1915 ZEND_ARG_INFO(0, query
)
1916 ZEND_END_ARG_INFO();
1917 static PHP_METHOD(pqconn
, exec
) {
1918 zend_error_handling zeh
;
1922 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1923 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
1924 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1927 PGresult
*res
= PQexec(obj
->intern
->conn
, query_str
);
1929 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1932 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1933 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1936 return_value
->type
= IS_OBJECT
;
1937 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1940 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1943 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1946 zend_restore_error_handling(&zeh TSRMLS_CC
);
1949 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_get_result
, 0, 0, 0)
1950 ZEND_END_ARG_INFO();
1951 static PHP_METHOD(pqconn
, getResult
) {
1952 if (SUCCESS
== zend_parse_parameters_none()) {
1953 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1956 PGresult
*res
= PQgetResult(obj
->intern
->conn
);
1959 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1962 return_value
->type
= IS_OBJECT
;
1963 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1968 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1974 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_async
, 0, 0, 1)
1975 ZEND_ARG_INFO(0, query
)
1976 ZEND_ARG_INFO(0, callable
)
1977 ZEND_END_ARG_INFO();
1978 static PHP_METHOD(pqconn
, execAsync
) {
1979 zend_error_handling zeh
;
1980 php_pq_callback_t resolver
= {{0}};
1984 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1985 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|f", &query_str
, &query_len
, &resolver
.fci
, &resolver
.fcc
)) {
1986 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1989 php_pq_callback_dtor(&obj
->intern
->onevent
);
1990 if (resolver
.fci
.size
> 0) {
1991 obj
->intern
->onevent
= resolver
;
1992 php_pq_callback_addref(&obj
->intern
->onevent
);
1995 obj
->intern
->poller
= PQconsumeInput
;
1997 if (PQsendQuery(obj
->intern
->conn
, query_str
)) {
1998 if (obj
->intern
->unbuffered
) {
1999 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2000 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2005 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2009 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2013 zend_restore_error_handling(&zeh TSRMLS_CC
);
2016 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
2021 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
2022 convert_to_long_ex(ztype
);
2025 **types
= Z_LVAL_PP(ztype
);
2028 if (*ztype
!= *(zval
**)p
) {
2029 zval_ptr_dtor(ztype
);
2031 return ZEND_HASH_APPLY_KEEP
;
2034 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
2040 params
= (char ***) va_arg(argv
, char ***);
2041 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
2043 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
2047 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
2048 convert_to_string_ex(zparam
);
2051 **params
= Z_STRVAL_PP(zparam
);
2054 if (*zparam
!= *(zval
**)p
) {
2055 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
2058 return ZEND_HASH_APPLY_KEEP
;
2061 static int php_pq_types_to_array(HashTable
*ht
, Oid
**types TSRMLS_DC
)
2063 int count
= zend_hash_num_elements(ht
);
2070 /* +1 for when less types than params are specified */
2071 *types
= tmp
= ecalloc(count
+ 1, sizeof(Oid
));
2072 zend_hash_apply_with_argument(ht
, apply_to_oid
, &tmp TSRMLS_CC
);
2078 static int php_pq_params_to_array(HashTable
*ht
, char ***params
, HashTable
*zdtor TSRMLS_DC
)
2080 int count
= zend_hash_num_elements(ht
);
2087 *params
= tmp
= ecalloc(count
, sizeof(char *));
2088 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_param
, 2, &tmp
, zdtor
);
2094 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
2095 ZEND_ARG_INFO(0, query
)
2096 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2097 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2098 ZEND_END_ARG_INFO();
2099 static PHP_METHOD(pqconn
, execParams
) {
2100 zend_error_handling zeh
;
2104 zval
*ztypes
= NULL
;
2106 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2107 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
2108 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2114 char **params
= NULL
;
2117 ZEND_INIT_SYMTABLE(&zdtor
);
2118 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2121 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2124 res
= PQexecParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0);
2126 zend_hash_destroy(&zdtor
);
2134 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2137 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2138 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2141 return_value
->type
= IS_OBJECT
;
2142 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2145 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2149 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2153 zend_restore_error_handling(&zeh TSRMLS_CC
);
2156 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params_async
, 0, 0, 2)
2157 ZEND_ARG_INFO(0, query
)
2158 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2159 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2160 ZEND_ARG_INFO(0, callable
)
2161 ZEND_END_ARG_INFO();
2162 static PHP_METHOD(pqconn
, execParamsAsync
) {
2163 zend_error_handling zeh
;
2164 php_pq_callback_t resolver
= {{0}};
2168 zval
*ztypes
= NULL
;
2170 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2171 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!f", &query_str
, &query_len
, &zparams
, &ztypes
, &resolver
.fci
, &resolver
.fcc
)) {
2172 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2177 char **params
= NULL
;
2180 ZEND_INIT_SYMTABLE(&zdtor
);
2181 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2184 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2187 php_pq_callback_dtor(&obj
->intern
->onevent
);
2188 if (resolver
.fci
.size
> 0) {
2189 obj
->intern
->onevent
= resolver
;
2190 php_pq_callback_addref(&obj
->intern
->onevent
);
2193 obj
->intern
->poller
= PQconsumeInput
;
2195 if (PQsendQueryParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0)) {
2196 if (obj
->intern
->unbuffered
) {
2197 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2198 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2203 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2207 zend_hash_destroy(&zdtor
);
2215 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2218 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2222 zend_restore_error_handling(&zeh TSRMLS_CC
);
2225 static STATUS
php_pqconn_prepare(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2233 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2237 count
= zend_hash_num_elements(typest
);
2238 php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2241 res
= PQprepare(obj
->intern
->conn
, name
, query
, count
, types
);
2248 rv
= php_pqres_success(res TSRMLS_CC
);
2252 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2258 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
2259 ZEND_ARG_INFO(0, type
)
2260 ZEND_ARG_INFO(0, query
)
2261 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2262 ZEND_END_ARG_INFO();
2263 static PHP_METHOD(pqconn
, prepare
) {
2264 zend_error_handling zeh
;
2265 zval
*ztypes
= NULL
;
2266 char *name_str
, *query_str
;
2267 int name_len
, *query_len
;
2269 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2270 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2271 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2274 if (SUCCESS
== php_pqconn_prepare(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2275 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2277 php_pq_object_addref(obj TSRMLS_CC
);
2279 stm
->name
= estrdup(name_str
);
2281 return_value
->type
= IS_OBJECT
;
2282 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2284 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2286 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2289 zend_restore_error_handling(&zeh TSRMLS_CC
);
2292 static STATUS
php_pqconn_prepare_async(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2299 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2303 count
= php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2306 if (PQsendPrepare(obj
->intern
->conn
, name
, query
, count
, types
)) {
2307 if (obj
->intern
->unbuffered
) {
2308 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2309 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2314 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2325 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare_async
, 0, 0, 2)
2326 ZEND_ARG_INFO(0, type
)
2327 ZEND_ARG_INFO(0, query
)
2328 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2329 ZEND_END_ARG_INFO();
2330 static PHP_METHOD(pqconn
, prepareAsync
) {
2331 zend_error_handling zeh
;
2332 zval
*ztypes
= NULL
;
2333 char *name_str
, *query_str
;
2334 int name_len
, *query_len
;
2336 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2337 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2338 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2341 obj
->intern
->poller
= PQconsumeInput
;
2342 if (SUCCESS
== php_pqconn_prepare_async(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2343 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2345 php_pq_object_addref(obj TSRMLS_CC
);
2347 stm
->name
= estrdup(name_str
);
2349 return_value
->type
= IS_OBJECT
;
2350 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2352 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2354 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2357 zend_restore_error_handling(&zeh TSRMLS_CC
);
2360 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote
, 0, 0, 1)
2361 ZEND_ARG_INFO(0, string
)
2362 ZEND_END_ARG_INFO();
2363 static PHP_METHOD(pqconn
, quote
) {
2367 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2368 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2371 char *quoted
= PQescapeLiteral(obj
->intern
->conn
, str
, len
);
2374 RETVAL_STRING(quoted
, 1);
2377 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote string (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2381 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2387 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote_name
, 0, 0, 1)
2388 ZEND_ARG_INFO(0, type
)
2389 ZEND_END_ARG_INFO();
2390 static PHP_METHOD(pqconn
, quoteName
) {
2394 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2395 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2398 char *quoted
= PQescapeIdentifier(obj
->intern
->conn
, str
, len
);
2401 RETVAL_STRING(quoted
, 1);
2404 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote name (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2408 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2414 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_escape_bytea
, 0, 0, 1)
2415 ZEND_ARG_INFO(0, bytea
)
2416 ZEND_END_ARG_INFO();
2417 static PHP_METHOD(pqconn
, escapeBytea
) {
2421 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2422 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2426 char *escaped_str
= (char *) PQescapeByteaConn(obj
->intern
->conn
, (unsigned char *) str
, len
, &escaped_len
);
2429 RETVAL_STRINGL(escaped_str
, escaped_len
- 1, 1);
2430 PQfreemem(escaped_str
);
2432 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2436 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2442 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_unescape_bytea
, 0, 0, 1)
2443 ZEND_ARG_INFO(0, bytea
)
2444 ZEND_END_ARG_INFO();
2445 static PHP_METHOD(pqconn
, unescapeBytea
) {
2449 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2450 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2453 size_t unescaped_len
;
2454 char *unescaped_str
= (char *) PQunescapeBytea((unsigned char *)str
, &unescaped_len
);
2456 if (unescaped_str
) {
2457 RETVAL_STRINGL(unescaped_str
, unescaped_len
, 1);
2458 PQfreemem(unescaped_str
);
2460 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not unescape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2464 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2470 static const char *isolation_level(long *isolation
) {
2471 switch (*isolation
) {
2472 case PHP_PQTXN_SERIALIZABLE
:
2473 return "SERIALIZABLE";
2474 case PHP_PQTXN_REPEATABLE_READ
:
2475 return "REPEATABLE READ";
2477 *isolation
= PHP_PQTXN_READ_COMMITTED
;
2479 case PHP_PQTXN_READ_COMMITTED
:
2480 return "READ COMMITTED";
2484 static STATUS
php_pqconn_start_transaction(zval
*zconn
, php_pqconn_object_t
*conn_obj
, long isolation
, zend_bool readonly
, zend_bool deferrable TSRMLS_DC
)
2487 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2490 if (conn_obj
->intern
) {
2494 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2495 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2497 res
= PQexec(conn_obj
->intern
->conn
, cmd
);
2502 STATUS rv
= php_pqres_success(res TSRMLS_CC
);
2507 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2511 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2516 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
)
2519 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2522 if (conn_obj
->intern
->conn
) {
2525 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2526 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2528 if (PQsendQuery(conn_obj
->intern
->conn
, cmd
)) {
2529 conn_obj
->intern
->poller
= PQconsumeInput
;
2534 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2538 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2543 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction
, 0, 0, 0)
2544 ZEND_ARG_INFO(0, isolation
)
2545 ZEND_ARG_INFO(0, readonly
)
2546 ZEND_ARG_INFO(0, deferrable
)
2547 ZEND_END_ARG_INFO();
2548 static PHP_METHOD(pqconn
, startTransaction
) {
2549 zend_error_handling zeh
;
2550 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2551 zend_bool readonly
= 0, deferrable
= 0;
2553 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2554 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2556 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2558 rv
= php_pqconn_start_transaction(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2560 if (SUCCESS
== rv
) {
2561 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2563 php_pq_object_addref(obj TSRMLS_CC
);
2565 txn
->isolation
= isolation
;
2566 txn
->readonly
= readonly
;
2567 txn
->deferrable
= deferrable
;
2569 return_value
->type
= IS_OBJECT
;
2570 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2573 zend_restore_error_handling(&zeh TSRMLS_CC
);
2577 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction_async
, 0, 0, 0)
2578 ZEND_ARG_INFO(0, isolation
)
2579 ZEND_ARG_INFO(0, readonly
)
2580 ZEND_ARG_INFO(0, deferrable
)
2581 ZEND_END_ARG_INFO();
2582 static PHP_METHOD(pqconn
, startTransactionAsync
) {
2583 zend_error_handling zeh
;
2584 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2585 zend_bool readonly
= 0, deferrable
= 0;
2587 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2588 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2590 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2592 rv
= php_pqconn_start_transaction_async(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2594 if (SUCCESS
== rv
) {
2595 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2597 php_pq_object_addref(obj TSRMLS_CC
);
2599 txn
->isolation
= isolation
;
2600 txn
->readonly
= readonly
;
2601 txn
->deferrable
= deferrable
;
2603 return_value
->type
= IS_OBJECT
;
2604 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2607 zend_restore_error_handling(&zeh TSRMLS_CC
);
2610 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_trace
, 0, 0, 0)
2611 ZEND_ARG_INFO(0, stdio_stream
)
2612 ZEND_END_ARG_INFO();
2613 static PHP_METHOD(pqconn
, trace
) {
2614 zval
*zstream
= NULL
;
2616 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|r!", &zstream
)) {
2617 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2621 php_stream
*stream
= NULL
;
2623 php_stream_from_zval(stream
, &zstream
);
2625 if (SUCCESS
== php_stream_cast(stream
, PHP_STREAM_AS_STDIO
, (void *) &fp
, REPORT_ERRORS
)) {
2626 stream
->flags
|= PHP_STREAM_FLAG_NO_CLOSE
;
2627 PQtrace(obj
->intern
->conn
, fp
);
2633 PQuntrace(obj
->intern
->conn
);
2637 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2643 static zend_function_entry php_pqconn_methods
[] = {
2644 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2645 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
2646 PHP_ME(pqconn
, resetAsync
, ai_pqconn_reset_async
, ZEND_ACC_PUBLIC
)
2647 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
2648 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
2649 PHP_ME(pqconn
, execAsync
, ai_pqconn_exec_async
, ZEND_ACC_PUBLIC
)
2650 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
2651 PHP_ME(pqconn
, execParamsAsync
, ai_pqconn_exec_params_async
, ZEND_ACC_PUBLIC
)
2652 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
2653 PHP_ME(pqconn
, prepareAsync
, ai_pqconn_prepare_async
, ZEND_ACC_PUBLIC
)
2654 PHP_ME(pqconn
, listen
, ai_pqconn_listen
, ZEND_ACC_PUBLIC
)
2655 PHP_ME(pqconn
, notify
, ai_pqconn_notify
, ZEND_ACC_PUBLIC
)
2656 PHP_ME(pqconn
, getResult
, ai_pqconn_get_result
, ZEND_ACC_PUBLIC
)
2657 PHP_ME(pqconn
, quote
, ai_pqconn_quote
, ZEND_ACC_PUBLIC
)
2658 PHP_ME(pqconn
, quoteName
, ai_pqconn_quote_name
, ZEND_ACC_PUBLIC
)
2659 PHP_ME(pqconn
, escapeBytea
, ai_pqconn_escape_bytea
, ZEND_ACC_PUBLIC
)
2660 PHP_ME(pqconn
, unescapeBytea
, ai_pqconn_unescape_bytea
, ZEND_ACC_PUBLIC
)
2661 PHP_ME(pqconn
, startTransaction
, ai_pqconn_start_transaction
, ZEND_ACC_PUBLIC
)
2662 PHP_ME(pqconn
, startTransactionAsync
, ai_pqconn_start_transaction_async
, ZEND_ACC_PUBLIC
)
2663 PHP_ME(pqconn
, trace
, ai_pqconn_trace
, ZEND_ACC_PUBLIC
)
2667 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_construct
, 0, 0, 1)
2668 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
2669 ZEND_END_ARG_INFO();
2670 static PHP_METHOD(pqtypes
, __construct
) {
2671 zend_error_handling zeh
;
2674 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2675 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
2676 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2678 if (conn_obj
->intern
) {
2679 zval
*retval
= NULL
;
2680 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2682 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
2683 obj
->intern
->conn
= conn_obj
;
2684 php_pq_object_addref(conn_obj TSRMLS_CC
);
2685 zend_hash_init(&obj
->intern
->types
, 300, NULL
, ZVAL_PTR_DTOR
, 0);
2687 zend_call_method_with_0_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "refresh", &retval
);
2689 zval_ptr_dtor(&retval
);
2692 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2695 zend_restore_error_handling(&zeh TSRMLS_CC
);
2698 #define PHP_PQ_TYPES_QUERY \
2699 "select t.oid, t.* " \
2700 "from pg_type t join pg_namespace n on t.typnamespace=n.oid " \
2701 "where typisdefined " \
2703 "and nspname in ('public', 'pg_catalog')"
2705 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_refresh
, 0, 0, 0)
2706 ZEND_END_ARG_INFO();
2707 static PHP_METHOD(pqtypes
, refresh
) {
2708 if (SUCCESS
== zend_parse_parameters_none()) {
2709 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2712 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, PHP_PQ_TYPES_QUERY
);
2714 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2717 if (PGRES_TUPLES_OK
== PQresultStatus(res
)) {
2720 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
2721 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
2722 long oid
= atol(PQgetvalue(res
, r
, 0 ));
2723 char *name
= PQgetvalue(res
, r
, 1);
2727 zend_hash_index_update(&obj
->intern
->types
, oid
, (void *) &row
, sizeof(zval
*), NULL
);
2728 zend_hash_add(&obj
->intern
->types
, name
, strlen(name
) + 1, (void *) &row
, sizeof(zval
*), NULL
);
2731 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQresultErrorMessage(res
));
2735 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2739 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Types not initialized");
2744 static zend_function_entry php_pqtypes_methods
[] = {
2745 PHP_ME(pqtypes
, __construct
, ai_pqtypes_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2746 PHP_ME(pqtypes
, refresh
, ai_pqtypes_refresh
, ZEND_ACC_PUBLIC
)
2750 static zval
*php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type
, zval
***row TSRMLS_DC
)
2752 php_pqres_fetch_t orig_fetch
;
2755 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2758 if (!obj
->intern
->iter
) {
2759 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
2760 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2762 orig_fetch
= obj
->intern
->iter
->fetch_type
;
2763 obj
->intern
->iter
->fetch_type
= fetch_type
;
2764 if (SUCCESS
== obj
->intern
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
)) {
2765 obj
->intern
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->intern
->iter
, row TSRMLS_CC
);
2766 obj
->intern
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2768 obj
->intern
->iter
->fetch_type
= orig_fetch
;
2770 return *row
? **row
: NULL
;
2773 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
2774 ZEND_ARG_INFO(0, fetch_type
)
2775 ZEND_END_ARG_INFO();
2776 static PHP_METHOD(pqres
, fetchRow
) {
2777 zend_error_handling zeh
;
2778 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2779 long fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
2781 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2782 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
2785 php_pqres_iteration(getThis(), obj
, fetch_type
, &row TSRMLS_CC
);
2788 RETVAL_ZVAL(*row
, 1, 0);
2793 zend_restore_error_handling(&zeh TSRMLS_CC
);
2796 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
2799 HashTable
*ht
= HASH_OF(row
);
2800 int count
= zend_hash_num_elements(ht
);
2803 zend_hash_internal_pointer_reset(ht
);
2805 zend_hash_move_forward(ht
);
2807 zend_hash_get_current_data(ht
, (void *) &data
);
2809 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d exceeds column count %d", col
, count
);
2814 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 0)
2815 ZEND_ARG_INFO(0, col_num
)
2816 ZEND_END_ARG_INFO();
2817 static PHP_METHOD(pqres
, fetchCol
) {
2818 zend_error_handling zeh
;
2821 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2822 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_col
)) {
2823 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2826 php_pqres_iteration(getThis(), obj
, obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: 0, &row TSRMLS_CC
);
2829 zval
**col
= column_at(*row
, fetch_col TSRMLS_CC
);
2832 RETVAL_ZVAL(*col
, 1, 0);
2840 zend_restore_error_handling(&zeh TSRMLS_CC
);
2844 static zend_function_entry php_pqres_methods
[] = {
2845 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
2846 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
2850 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
2851 ZEND_ARG_OBJ_INFO(0, Connection
, pq
\\Connection
, 0)
2852 ZEND_ARG_INFO(0, type
)
2853 ZEND_ARG_INFO(0, query
)
2854 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2855 ZEND_ARG_INFO(0, async
)
2856 ZEND_END_ARG_INFO();
2857 static PHP_METHOD(pqstm
, __construct
) {
2858 zend_error_handling zeh
;
2859 zval
*zconn
, *ztypes
= NULL
;
2860 char *name_str
, *query_str
;
2861 int name_len
, *query_len
;
2862 zend_bool async
= 0;
2864 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2865 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
)) {
2866 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2867 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2869 if (conn_obj
->intern
) {
2872 conn_obj
->intern
->poller
= PQconsumeInput
;
2873 rv
= php_pqconn_prepare_async(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
2875 rv
= php_pqconn_prepare(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
2876 php_pqconn_notify_listeners(conn_obj TSRMLS_CC
);
2879 if (SUCCESS
== rv
) {
2880 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2882 php_pq_object_addref(conn_obj TSRMLS_CC
);
2883 stm
->conn
= conn_obj
;
2884 stm
->name
= estrdup(name_str
);
2888 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2891 zend_restore_error_handling(&zeh TSRMLS_CC
);
2894 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
2895 ZEND_ARG_ARRAY_INFO(0, params
, 1)
2896 ZEND_END_ARG_INFO();
2897 static PHP_METHOD(pqstm
, exec
) {
2898 zend_error_handling zeh
;
2899 zval
*zparams
= NULL
;
2901 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2902 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
2903 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2906 if (obj
->intern
->conn
->intern
) {
2908 char **params
= NULL
;
2913 ZEND_INIT_SYMTABLE(&zdtor
);
2914 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2917 res
= PQexecPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0);
2923 zend_hash_destroy(&zdtor
);
2926 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2929 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2930 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2933 return_value
->type
= IS_OBJECT
;
2934 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2937 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2940 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2943 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
2946 zend_restore_error_handling(&zeh TSRMLS_CC
);
2949 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec_async
, 0, 0, 0)
2950 ZEND_ARG_ARRAY_INFO(0, params
, 1)
2951 ZEND_ARG_INFO(0, callable
)
2952 ZEND_END_ARG_INFO();
2953 static PHP_METHOD(pqstm
, execAsync
) {
2954 zend_error_handling zeh
;
2955 zval
*zparams
= NULL
;
2956 php_pq_callback_t resolver
= {{0}};
2958 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2959 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!f", &zparams
, &resolver
.fci
, &resolver
.fcc
)) {
2960 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2963 if (obj
->intern
->conn
->intern
) {
2965 char **params
= NULL
;
2969 ZEND_INIT_SYMTABLE(&zdtor
);
2970 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2973 php_pq_callback_dtor(&obj
->intern
->conn
->intern
->onevent
);
2974 if (resolver
.fci
.size
> 0) {
2975 obj
->intern
->conn
->intern
->onevent
= resolver
;
2976 php_pq_callback_addref(&obj
->intern
->conn
->intern
->onevent
);
2979 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
2981 if (PQsendQueryPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0)) {
2982 if (obj
->intern
->conn
->intern
->unbuffered
) {
2983 if (!PQsetSingleRowMode(obj
->intern
->conn
->intern
->conn
)) {
2984 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2989 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2997 zend_hash_destroy(&zdtor
);
3000 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3003 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3007 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3011 zend_restore_error_handling(&zeh TSRMLS_CC
);
3014 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc
, 0, 0, 0)
3015 ZEND_END_ARG_INFO();
3016 static PHP_METHOD(pqstm
, desc
) {
3017 zend_error_handling zeh
;
3019 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3020 if (SUCCESS
== zend_parse_parameters_none()) {
3021 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3024 if (obj
->intern
->conn
->intern
) {
3025 PGresult
*res
= PQdescribePrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
);
3027 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
3030 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3033 array_init(return_value
);
3034 for (p
= 0, params
= PQnparams(res
); p
< params
; ++p
) {
3035 add_next_index_long(return_value
, PQparamtype(res
, p
));
3039 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3042 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3045 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
3048 zend_restore_error_handling(&zeh TSRMLS_CC
);
3051 static zend_function_entry php_pqstm_methods
[] = {
3052 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3053 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
3054 PHP_ME(pqstm
, desc
, ai_pqstm_desc
, ZEND_ACC_PUBLIC
)
3055 PHP_ME(pqstm
, execAsync
, ai_pqstm_exec_async
, ZEND_ACC_PUBLIC
)
3059 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_construct
, 0, 0, 1)
3060 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3061 ZEND_ARG_INFO(0, async
)
3062 ZEND_ARG_INFO(0, isolation
)
3063 ZEND_ARG_INFO(0, readonly
)
3064 ZEND_ARG_INFO(0, deferrable
)
3065 ZEND_END_ARG_INFO();
3066 static PHP_METHOD(pqtxn
, __construct
) {
3067 zend_error_handling zeh
;
3069 long isolation
= PHP_PQTXN_READ_COMMITTED
;
3070 zend_bool async
= 0, readonly
= 0, deferrable
= 0;
3072 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3073 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|blbb", &zconn
, php_pqconn_class_entry
, &async
, &isolation
, &readonly
, &deferrable
)) {
3075 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3076 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3078 if (conn_obj
->intern
) {
3080 rv
= php_pqconn_start_transaction_async(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3082 rv
= php_pqconn_start_transaction(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
3085 if (SUCCESS
== rv
) {
3086 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3088 php_pq_object_addref(conn_obj TSRMLS_CC
);
3089 obj
->intern
->conn
= conn_obj
;
3090 obj
->intern
->isolation
= isolation
;
3091 obj
->intern
->readonly
= readonly
;
3092 obj
->intern
->deferrable
= deferrable
;
3095 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3098 zend_restore_error_handling(&zeh TSRMLS_CC
);
3101 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit
, 0, 0, 0)
3102 ZEND_END_ARG_INFO();
3103 static PHP_METHOD(pqtxn
, commit
) {
3104 zend_error_handling zeh
;
3106 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3107 if (SUCCESS
== zend_parse_parameters_none()) {
3108 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3112 if (obj
->intern
->conn
->intern
) {
3113 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, "COMMIT");
3116 php_pqres_success(res TSRMLS_CC
);
3119 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3122 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not intialized");
3125 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3128 zend_restore_error_handling(&zeh TSRMLS_CC
);
3131 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit_async
, 0, 0, 0)
3132 ZEND_END_ARG_INFO();
3133 static PHP_METHOD(pqtxn
, commitAsync
) {
3134 zend_error_handling zeh
;
3136 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3137 if (SUCCESS
== zend_parse_parameters_none()) {
3138 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3141 if (obj
->intern
->conn
->intern
) {
3142 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3144 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "COMMIT")) {
3145 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3148 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not intialized");
3151 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3154 zend_restore_error_handling(&zeh TSRMLS_CC
);
3157 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback
, 0, 0, 0)
3158 ZEND_END_ARG_INFO();
3159 static PHP_METHOD(pqtxn
, rollback
) {
3160 zend_error_handling zeh
;
3162 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3163 if (SUCCESS
== zend_parse_parameters_none()) {
3164 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3167 if (obj
->intern
->conn
->intern
) {
3168 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, "ROLLBACK");
3171 php_pqres_success(res TSRMLS_CC
);
3174 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3177 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not intialized");
3180 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3183 zend_restore_error_handling(&zeh TSRMLS_CC
);
3186 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback_async
, 0, 0, 0)
3187 ZEND_END_ARG_INFO();
3188 static PHP_METHOD(pqtxn
, rollbackAsync
) {
3189 zend_error_handling zeh
;
3191 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3192 if (SUCCESS
== zend_parse_parameters_none()) {
3193 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3196 if (obj
->intern
->conn
->intern
) {
3197 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3198 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "REOLLBACK")) {
3199 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3202 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not intialized");
3205 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3208 zend_restore_error_handling(&zeh TSRMLS_CC
);
3211 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_open_lob
, 0, 0, 1)
3212 ZEND_ARG_INFO(0, oid
)
3213 ZEND_ARG_INFO(0, mode
)
3214 ZEND_END_ARG_INFO();
3215 static PHP_METHOD(pqtxn
, openLOB
) {
3216 zend_error_handling zeh
;
3217 long mode
= INV_WRITE
|INV_READ
, loid
;
3219 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3220 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &loid
, &mode
)) {
3221 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3224 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3227 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3231 php_pq_object_addref(obj TSRMLS_CC
);
3234 return_value
->type
= IS_OBJECT
;
3235 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3237 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
3238 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3239 (mode
& INV_READ
? "r" :
3240 (mode
& INV_WRITE
? "w" : "-"))),
3241 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3245 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3248 zend_restore_error_handling(&zeh TSRMLS_CC
);
3251 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_create_lob
, 0, 0, 0)
3252 ZEND_ARG_INFO(0, mode
)
3253 ZEND_END_ARG_INFO();
3254 static PHP_METHOD(pqtxn
, createLOB
) {
3255 zend_error_handling zeh
;
3256 long mode
= INV_WRITE
|INV_READ
;
3258 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3259 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &mode
)) {
3260 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3263 Oid loid
= lo_creat(obj
->intern
->conn
->intern
->conn
, mode
);
3265 if (loid
!= InvalidOid
) {
3266 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3269 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3272 php_pq_object_addref(obj TSRMLS_CC
);
3275 return_value
->type
= IS_OBJECT
;
3276 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3278 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s': %s",
3279 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3280 (mode
& INV_READ
? "r" :
3281 (mode
& INV_WRITE
? "w" : "-"))),
3282 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3286 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s': %s",
3287 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3288 (mode
& INV_READ
? "r" :
3289 (mode
& INV_WRITE
? "w" : "-"))),
3290 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3294 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3297 zend_restore_error_handling(&zeh TSRMLS_CC
);
3300 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_unlink_lob
, 0, 0, 1)
3301 ZEND_ARG_INFO(0, oid
)
3302 ZEND_END_ARG_INFO();
3303 static PHP_METHOD(pqtxn
, unlinkLOB
) {
3306 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l", &loid
)) {
3307 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3310 if (1 == lo_unlink(obj
->intern
->conn
->intern
->conn
, loid
)) {
3313 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to unlink LOB (oid=%ld): %s", loid
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3317 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3323 static zend_function_entry php_pqtxn_methods
[] = {
3324 PHP_ME(pqtxn
, __construct
, ai_pqtxn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3325 PHP_ME(pqtxn
, commit
, ai_pqtxn_commit
, ZEND_ACC_PUBLIC
)
3326 PHP_ME(pqtxn
, rollback
, ai_pqtxn_rollback
, ZEND_ACC_PUBLIC
)
3327 PHP_ME(pqtxn
, commitAsync
, ai_pqtxn_commit_async
, ZEND_ACC_PUBLIC
)
3328 PHP_ME(pqtxn
, rollbackAsync
, ai_pqtxn_rollback_async
, ZEND_ACC_PUBLIC
)
3329 PHP_ME(pqtxn
, openLOB
, ai_pqtxn_open_lob
, ZEND_ACC_PUBLIC
)
3330 PHP_ME(pqtxn
, createLOB
, ai_pqtxn_create_lob
, ZEND_ACC_PUBLIC
)
3331 PHP_ME(pqtxn
, unlinkLOB
, ai_pqtxn_unlink_lob
, ZEND_ACC_PUBLIC
)
3335 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_construct
, 0, 0, 1)
3336 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3337 ZEND_END_ARG_INFO();
3338 static PHP_METHOD(pqcancel
, __construct
) {
3339 zend_error_handling zeh
;
3342 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3343 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
3344 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3346 if (conn_obj
->intern
) {
3347 PGcancel
*cancel
= PQgetCancel(conn_obj
->intern
->conn
);
3350 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3352 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3353 obj
->intern
->cancel
= cancel
;
3354 php_pq_object_addref(conn_obj TSRMLS_CC
);
3355 obj
->intern
->conn
= conn_obj
;
3357 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not acquire cancel (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
3360 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3363 zend_restore_error_handling(&zeh TSRMLS_CC
);
3366 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_cancel
, 0, 0, 0)
3367 ZEND_END_ARG_INFO();
3368 static PHP_METHOD(pqcancel
, cancel
) {
3369 zend_error_handling zeh
;
3371 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3372 if (SUCCESS
== zend_parse_parameters_none()) {
3373 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3378 if (!PQcancel(obj
->intern
->cancel
, err
, sizeof(err
))) {
3379 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not request cancellation: %s", err
);
3382 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Cancel not initialized");
3385 zend_restore_error_handling(&zeh TSRMLS_CC
);
3388 static zend_function_entry php_pqcancel_methods
[] = {
3389 PHP_ME(pqcancel
, __construct
, ai_pqcancel_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3390 PHP_ME(pqcancel
, cancel
, ai_pqcancel_cancel
, ZEND_ACC_PUBLIC
)
3394 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
)
3398 if (SUCCESS
== zend_hash_find(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evhs
)) {
3400 add_next_index_zval(*evhs
, zevent
);
3407 add_next_index_zval(evh
, zevent
);
3408 zend_hash_add(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evh
, sizeof(zval
*), NULL
);
3412 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_construct
, 0, 0, 3)
3413 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3414 ZEND_ARG_INFO(0, type
)
3415 ZEND_ARG_INFO(0, callable
)
3416 ZEND_END_ARG_INFO();
3417 static PHP_METHOD(pqevent
, __construct
) {
3418 zend_error_handling zeh
;
3422 php_pq_callback_t cb
;
3424 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3425 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Osf", &zconn
, php_pqconn_class_entry
, &type_str
, &type_len
, &cb
.fci
, &cb
.fcc
)) {
3426 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3428 if (conn_obj
->intern
) {
3429 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3431 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3432 php_pq_callback_addref(&cb
);
3433 obj
->intern
->cb
= cb
;
3434 php_pq_object_addref(conn_obj TSRMLS_CC
);
3435 obj
->intern
->conn
= conn_obj
;
3436 obj
->intern
->type
= estrdup(type_str
);
3438 php_pqconn_add_eventhandler(zconn
, conn_obj
, type_str
, type_len
, getThis() TSRMLS_CC
);
3441 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3444 zend_restore_error_handling(&zeh TSRMLS_CC
);
3447 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_trigger
, 0, 0, 1)
3448 ZEND_ARG_ARRAY_INFO(0, args
, 1)
3449 ZEND_END_ARG_INFO();
3450 static PHP_METHOD(pqevent
, trigger
) {
3453 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "a/", &args
)) {
3454 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3459 if (SUCCESS
== zend_fcall_info_call(&obj
->intern
->cb
.fci
, &obj
->intern
->cb
.fcc
, &rv
, args TSRMLS_CC
)) {
3461 RETVAL_ZVAL(rv
, 0, 1);
3467 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Event not initialized");
3473 static zend_function_entry php_pqevent_methods
[] = {
3474 PHP_ME(pqevent
, __construct
, ai_pqevent_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3475 PHP_ME(pqevent
, trigger
, ai_pqevent_trigger
, ZEND_ACC_PUBLIC
)
3479 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_construct
, 0, 0, 1)
3480 ZEND_ARG_OBJ_INFO(0, transaction
, pq
\\Transaction
, 0)
3481 ZEND_ARG_INFO(0, oid
)
3482 ZEND_ARG_INFO(0, mode
)
3483 ZEND_END_ARG_INFO();
3484 static PHP_METHOD(pqlob
, __construct
) {
3485 zend_error_handling zeh
;
3487 long mode
= INV_WRITE
|INV_READ
, loid
= InvalidOid
;
3489 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3490 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|ll", &ztxn
, php_pqtxn_class_entry
, &loid
, &mode
)) {
3491 php_pqtxn_object_t
*txn_obj
= zend_object_store_get_object(ztxn TSRMLS_CC
);
3493 if (txn_obj
->intern
) {
3495 if (loid
== InvalidOid
) {
3496 loid
= lo_creat(txn_obj
->intern
->conn
->intern
->conn
, mode
);
3499 if (loid
!= InvalidOid
) {
3500 int lofd
= lo_open(txn_obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3503 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3505 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3506 obj
->intern
->lofd
= lofd
;
3507 obj
->intern
->loid
= loid
;
3508 php_pq_object_addref(txn_obj TSRMLS_CC
);
3509 obj
->intern
->txn
= txn_obj
;
3511 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
3512 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3513 (mode
& INV_READ
? "r" :
3514 (mode
& INV_WRITE
? "w" : "-"))),
3515 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
3519 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s' (%s)",
3520 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3521 (mode
& INV_READ
? "r" :
3522 (mode
& INV_WRITE
? "w" : "-"))),
3523 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
3527 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3530 zend_restore_error_handling(&zeh TSRMLS_CC
);
3533 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_write
, 0, 0, 1)
3534 ZEND_ARG_INFO(0, data
)
3535 ZEND_END_ARG_INFO();
3536 static PHP_METHOD(pqlob
, write
) {
3540 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
3541 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3544 int written
= lo_write(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, data_str
, data_len
);
3547 RETVAL_LONG(written
);
3549 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to write to LOB, oid=%d (%s)", obj
->intern
->loid
,
3550 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3554 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3560 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_read
, 0, 0, 0)
3561 ZEND_ARG_INFO(0, length
)
3562 ZEND_ARG_INFO(1, read
)
3563 ZEND_END_ARG_INFO();
3564 static PHP_METHOD(pqlob
, read
) {
3565 long length
= 0x1000;
3568 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lz!", &length
, &zread
)) {
3569 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3572 char *buffer
= emalloc(length
+ 1);
3573 int read
= lo_read(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, buffer
, length
);
3578 ZVAL_LONG(zread
, read
);
3580 buffer
[read
] = '\0';
3581 RETVAL_STRINGL(buffer
, read
, 0);
3584 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to read from LOB, oid=%d (%s)", obj
->intern
->loid
,
3585 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3590 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3596 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_seek
, 0, 0, 1)
3597 ZEND_ARG_INFO(0, offset
)
3598 ZEND_ARG_INFO(0, whence
)
3599 ZEND_END_ARG_INFO();
3600 static PHP_METHOD(pqlob
, seek
) {
3601 long offset
, whence
= SEEK_SET
;
3603 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &offset
, &whence
)) {
3604 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3607 int position
= lo_lseek(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, offset
, whence
);
3609 if (position
>= 0) {
3610 RETVAL_LONG(position
);
3612 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to seek offset in LOB, oid=%d (%s)", obj
->intern
->loid
,
3613 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3617 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3623 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_tell
, 0, 0, 0)
3624 ZEND_END_ARG_INFO();
3625 static PHP_METHOD(pqlob
, tell
) {
3626 if (SUCCESS
== zend_parse_parameters_none()) {
3627 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3630 int position
= lo_tell(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
3632 if (position
>= 0) {
3633 RETVAL_LONG(position
);
3635 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to tell offset in LOB (oid=%d): %s", obj
->intern
->loid
,
3636 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3640 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3646 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_truncate
, 0, 0, 0)
3647 ZEND_ARG_INFO(0, length
)
3648 ZEND_END_ARG_INFO();
3649 static PHP_METHOD(pqlob
, truncate
) {
3652 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &length
)) {
3653 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3656 if (0 == lo_truncate(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, length
)) {
3659 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to truncate LOB (oid=%d): %s", obj
->intern
->loid
,
3660 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3664 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3670 static zend_function_entry php_pqlob_methods
[] = {
3671 PHP_ME(pqlob
, __construct
, ai_pqlob_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3672 PHP_ME(pqlob
, write
, ai_pqlob_write
, ZEND_ACC_PUBLIC
)
3673 PHP_ME(pqlob
, read
, ai_pqlob_read
, ZEND_ACC_PUBLIC
)
3674 PHP_ME(pqlob
, seek
, ai_pqlob_seek
, ZEND_ACC_PUBLIC
)
3675 PHP_ME(pqlob
, tell
, ai_pqlob_tell
, ZEND_ACC_PUBLIC
)
3676 PHP_ME(pqlob
, truncate
, ai_pqlob_truncate
, ZEND_ACC_PUBLIC
)
3680 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_construct
, 0, 0, 3)
3681 ZEND_ARG_OBJ_INFO(0, "connection", pq
\\Connection
, 0)
3682 ZEND_ARG_INFO(0, expression
)
3683 ZEND_ARG_INFO(0, direction
)
3684 ZEND_ARG_INFO(0, options
)
3685 ZEND_END_ARG_INFO();
3686 static PHP_METHOD(pqcopy
, __construct
) {
3687 zend_error_handling zeh
;
3689 char *expr_str
, *opt_str
= "";
3690 int expr_len
, opt_len
= 0;
3693 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3694 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
)) {
3695 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3697 if (conn_obj
->intern
) {
3700 switch (direction
) {
3701 case PHP_PQCOPY_FROM_STDIN
:
3702 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "FROM STDIN", opt_str
);
3705 case PHP_PQCOPY_TO_STDOUT
:
3706 spprintf(©
, 0, "COPY %s %s %s", expr_str
, "TO STDOUT", opt_str
);
3710 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Invalid COPY direction, expected one of FROM_STDIN (%d) TO_STDOUT (%d), got %ld",
3711 PHP_PQCOPY_FROM_STDIN
, PHP_PQCOPY_TO_STDOUT
, direction
);
3716 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3717 PGresult
*res
= PQexec(conn_obj
->intern
->conn
, copy
);
3721 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3722 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3723 obj
->intern
->direction
= direction
;
3724 obj
->intern
->expression
= estrdup(expr_str
);
3725 obj
->intern
->options
= estrdup(opt_str
);
3726 obj
->intern
->conn
= conn_obj
;
3727 php_pq_object_addref(conn_obj TSRMLS_CC
);
3733 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3736 zend_restore_error_handling(&zeh TSRMLS_CC
);
3739 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_put
, 0, 0, 1)
3740 ZEND_ARG_INFO(0, data
)
3741 ZEND_END_ARG_INFO();
3742 static PHP_METHOD(pqcopy
, put
) {
3743 zend_error_handling zeh
;
3747 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3748 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
3749 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3752 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
3753 if (1 == PQputCopyData(obj
->intern
->conn
->intern
->conn
, data_str
, data_len
)) {
3756 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to send COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3759 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
3762 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
3765 zend_restore_error_handling(&zeh TSRMLS_CC
);
3768 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_end
, 0, 0, 0)
3769 ZEND_ARG_INFO(0, error
)
3770 ZEND_END_ARG_INFO();
3771 static PHP_METHOD(pqcopy
, end
) {
3772 zend_error_handling zeh
;
3773 char *error_str
= NULL
;
3776 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3777 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|s!", &error_str
, &error_len
)) {
3778 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3781 if (PHP_PQCOPY_FROM_STDIN
== obj
->intern
->direction
) {
3782 if (1 == PQputCopyEnd(obj
->intern
->conn
->intern
->conn
, error_str
)) {
3783 PGresult
*res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
3786 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3792 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3795 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to end COPY (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3798 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY was not initialized with FROM_STDIN");
3801 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\COPY not initialized");
3804 zend_restore_error_handling(&zeh TSRMLS_CC
);
3807 ZEND_BEGIN_ARG_INFO_EX(ai_pqcopy_get
, 0, 0, 1)
3808 ZEND_ARG_INFO(1, data
)
3809 ZEND_END_ARG_INFO();
3810 static PHP_METHOD(pqcopy
, get
) {
3811 zend_error_handling zeh
;
3814 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3815 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z", &zdata
)) {
3816 php_pqcopy_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3817 char *buffer
= NULL
;
3820 if (PHP_PQCOPY_TO_STDOUT
== obj
->intern
->direction
) {
3822 int bytes
= PQgetCopyData(obj
->intern
->conn
->intern
->conn
, &buffer
, 0);
3826 res
= PQgetResult(obj
->intern
->conn
->intern
->conn
);
3829 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
3835 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY result (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3840 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to get COPY data (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3846 ZVAL_STRINGL(zdata
, buffer
, bytes
, 1);
3848 ZVAL_EMPTY_STRING(zdata
);
3860 zend_restore_error_handling(&zeh TSRMLS_CC
);
3863 static zend_function_entry php_pqcopy_methods
[] = {
3864 PHP_ME(pqcopy
, __construct
, ai_pqcopy_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3865 PHP_ME(pqcopy
, put
, ai_pqcopy_put
, ZEND_ACC_PUBLIC
)
3866 PHP_ME(pqcopy
, end
, ai_pqcopy_end
, ZEND_ACC_PUBLIC
)
3867 PHP_ME(pqcopy
, get
, ai_pqcopy_get
, ZEND_ACC_PUBLIC
)
3871 /* {{{ PHP_MINIT_FUNCTION
3873 static PHP_MINIT_FUNCTION(pq
)
3875 zend_class_entry ce
= {0};
3876 php_pq_object_prophandler_t ph
= {0};
3878 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
3879 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3880 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
3882 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3883 php_pqconn_object_handlers
.read_property
= php_pq_object_read_prop
;
3884 php_pqconn_object_handlers
.write_property
= php_pq_object_write_prop
;
3885 php_pqconn_object_handlers
.clone_obj
= NULL
;
3886 php_pqconn_object_handlers
.get_property_ptr_ptr
= NULL
;
3887 php_pqconn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3889 zend_hash_init(&php_pqconn_object_prophandlers
, 13, NULL
, NULL
, 1);
3891 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
3892 ph
.read
= php_pqconn_object_read_status
;
3893 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
3895 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
3896 ph
.read
= php_pqconn_object_read_transaction_status
;
3897 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
3899 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3900 ph
.read
= NULL
; /* forward to std prophandler */
3901 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
3903 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3904 ph
.read
= php_pqconn_object_read_error_message
;
3905 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
3907 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("busy"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
3908 ph
.read
= php_pqconn_object_read_busy
;
3909 zend_hash_add(&php_pqconn_object_prophandlers
, "busy", sizeof("busy"), (void *) &ph
, sizeof(ph
), NULL
);
3911 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("encoding"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3912 ph
.read
= php_pqconn_object_read_encoding
;
3913 ph
.write
= php_pqconn_object_write_encoding
;
3914 zend_hash_add(&php_pqconn_object_prophandlers
, "encoding", sizeof("encoding"), (void *) &ph
, sizeof(ph
), NULL
);
3917 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("unbuffered"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
3918 ph
.read
= php_pqconn_object_read_unbuffered
;
3919 ph
.write
= php_pqconn_object_write_unbuffered
;
3920 zend_hash_add(&php_pqconn_object_prophandlers
, "unbuffered", sizeof("unbuffered"), (void *) &ph
, sizeof(ph
), NULL
);
3923 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("db"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3924 ph
.read
= php_pqconn_object_read_db
;
3925 zend_hash_add(&php_pqconn_object_prophandlers
, "db", sizeof("db"), (void *) &ph
, sizeof(ph
), NULL
);
3927 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3928 ph
.read
= php_pqconn_object_read_user
;
3929 zend_hash_add(&php_pqconn_object_prophandlers
, "user", sizeof("user"), (void *) &ph
, sizeof(ph
), NULL
);
3931 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("pass"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3932 ph
.read
= php_pqconn_object_read_pass
;
3933 zend_hash_add(&php_pqconn_object_prophandlers
, "pass", sizeof("pass"), (void *) &ph
, sizeof(ph
), NULL
);
3935 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("host"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3936 ph
.read
= php_pqconn_object_read_host
;
3937 zend_hash_add(&php_pqconn_object_prophandlers
, "host", sizeof("host"), (void *) &ph
, sizeof(ph
), NULL
);
3939 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("port"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3940 ph
.read
= php_pqconn_object_read_port
;
3941 zend_hash_add(&php_pqconn_object_prophandlers
, "port", sizeof("port"), (void *) &ph
, sizeof(ph
), NULL
);
3943 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3944 ph
.read
= php_pqconn_object_read_options
;
3945 zend_hash_add(&php_pqconn_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
3947 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
3948 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
3949 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
3950 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
3951 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
3952 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
3953 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
3954 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
3956 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
3957 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
3958 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
3959 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
3960 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
3962 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
3963 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
3964 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
3965 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
3967 memset(&ce
, 0, sizeof(ce
));
3968 INIT_NS_CLASS_ENTRY(ce
, "pq", "Types", php_pqtypes_methods
);
3969 php_pqtypes_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3970 php_pqtypes_class_entry
->create_object
= php_pqtypes_create_object
;
3972 memcpy(&php_pqtypes_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3973 php_pqtypes_object_handlers
.read_property
= php_pq_object_read_prop
;
3974 php_pqtypes_object_handlers
.write_property
= php_pq_object_write_prop
;
3975 php_pqtypes_object_handlers
.clone_obj
= NULL
;
3976 php_pqtypes_object_handlers
.get_property_ptr_ptr
= NULL
;
3977 php_pqtypes_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3978 php_pqtypes_object_handlers
.has_dimension
= php_pqtypes_object_has_dimension
;
3979 php_pqtypes_object_handlers
.read_dimension
= php_pqtypes_object_read_dimension
;
3980 php_pqtypes_object_handlers
.unset_dimension
= NULL
;
3981 php_pqtypes_object_handlers
.write_dimension
= NULL
;
3983 zend_hash_init(&php_pqtypes_object_prophandlers
, 1, NULL
, NULL
, 1);
3985 zend_declare_property_null(php_pqtypes_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3986 ph
.read
= php_pqtypes_object_read_connection
;
3987 zend_hash_add(&php_pqtypes_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
3989 memset(&ce
, 0, sizeof(ce
));
3990 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
3991 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3992 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
3993 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
3994 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
3995 zend_class_implements(php_pqres_class_entry TSRMLS_CC
, 1, zend_ce_traversable
);
3997 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3998 php_pqres_object_handlers
.read_property
= php_pq_object_read_prop
;
3999 php_pqres_object_handlers
.write_property
= php_pq_object_write_prop
;
4000 php_pqres_object_handlers
.clone_obj
= NULL
;
4001 php_pqres_object_handlers
.get_property_ptr_ptr
= NULL
;
4002 php_pqres_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4004 zend_hash_init(&php_pqres_object_prophandlers
, 6, NULL
, NULL
, 1);
4006 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4007 ph
.read
= php_pqres_object_read_status
;
4008 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
4010 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4011 ph
.read
= php_pqres_object_read_error_message
;
4012 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
4014 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4015 ph
.read
= php_pqres_object_read_num_rows
;
4016 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
4018 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4019 ph
.read
= php_pqres_object_read_num_cols
;
4020 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
4022 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
4023 ph
.read
= php_pqres_object_read_affected_rows
;
4024 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
4026 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4027 ph
.read
= php_pqres_object_read_fetch_type
;
4028 ph
.write
= php_pqres_object_write_fetch_type
;
4029 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
4032 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
4033 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
4034 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
4035 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
4036 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
4037 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
4038 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
4039 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
4040 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
4041 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
4043 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
4044 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
4045 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
4047 memset(&ce
, 0, sizeof(ce
));
4048 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
4049 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4050 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
4052 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4053 php_pqstm_object_handlers
.read_property
= php_pq_object_read_prop
;
4054 php_pqstm_object_handlers
.write_property
= php_pq_object_write_prop
;
4055 php_pqstm_object_handlers
.clone_obj
= NULL
;
4056 php_pqstm_object_handlers
.get_property_ptr_ptr
= NULL
;
4057 php_pqstm_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4059 zend_hash_init(&php_pqstm_object_prophandlers
, 2, NULL
, NULL
, 1);
4061 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4062 ph
.read
= php_pqstm_object_read_name
;
4063 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
4065 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4066 ph
.read
= php_pqstm_object_read_connection
;
4067 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4069 memset(&ce
, 0, sizeof(ce
));
4070 INIT_NS_CLASS_ENTRY(ce
, "pq", "Transaction", php_pqtxn_methods
);
4071 php_pqtxn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4072 php_pqtxn_class_entry
->create_object
= php_pqtxn_create_object
;
4074 memcpy(&php_pqtxn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4075 php_pqtxn_object_handlers
.read_property
= php_pq_object_read_prop
;
4076 php_pqtxn_object_handlers
.write_property
= php_pq_object_write_prop
;
4077 php_pqtxn_object_handlers
.clone_obj
= NULL
;
4078 php_pqtxn_object_handlers
.get_property_ptr_ptr
= NULL
;
4079 php_pqtxn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4081 zend_hash_init(&php_pqtxn_object_prophandlers
, 4, NULL
, NULL
, 1);
4083 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4084 ph
.read
= php_pqtxn_object_read_connection
;
4085 zend_hash_add(&php_pqtxn_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4087 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("isolation"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4088 ph
.read
= php_pqtxn_object_read_isolation
;
4089 ph
.write
= php_pqtxn_object_write_isolation
;
4090 zend_hash_add(&php_pqtxn_object_prophandlers
, "isolation", sizeof("isolation"), (void *) &ph
, sizeof(ph
), NULL
);
4092 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("readonly"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4093 ph
.read
= php_pqtxn_object_read_readonly
;
4094 ph
.write
= php_pqtxn_object_write_readonly
;
4095 zend_hash_add(&php_pqtxn_object_prophandlers
, "readonly", sizeof("readonly"), (void *) &ph
, sizeof(ph
), NULL
);
4097 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("deferrable"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4098 ph
.read
= php_pqtxn_object_read_deferrable
;
4099 ph
.write
= php_pqtxn_object_write_deferrable
;
4100 zend_hash_add(&php_pqtxn_object_prophandlers
, "deferrable", sizeof("deferrable"), (void *) &ph
, sizeof(ph
), NULL
);
4103 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("READ_COMMITTED"), PHP_PQTXN_READ_COMMITTED TSRMLS_CC
);
4104 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("REPEATABLE READ"), PHP_PQTXN_REPEATABLE_READ TSRMLS_CC
);
4105 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("SERIALIZABLE"), PHP_PQTXN_SERIALIZABLE TSRMLS_CC
);
4107 memset(&ce
, 0, sizeof(ce
));
4108 INIT_NS_CLASS_ENTRY(ce
, "pq", "Cancel", php_pqcancel_methods
);
4109 php_pqcancel_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4110 php_pqcancel_class_entry
->create_object
= php_pqcancel_create_object
;
4112 memcpy(&php_pqcancel_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4113 php_pqcancel_object_handlers
.read_property
= php_pq_object_read_prop
;
4114 php_pqcancel_object_handlers
.write_property
= php_pq_object_write_prop
;
4115 php_pqcancel_object_handlers
.clone_obj
= NULL
;
4116 php_pqcancel_object_handlers
.get_property_ptr_ptr
= NULL
;
4117 php_pqcancel_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4119 zend_hash_init(&php_pqcancel_object_prophandlers
, 1, NULL
, NULL
, 1);
4121 zend_declare_property_null(php_pqcancel_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4122 ph
.read
= php_pqcancel_object_read_connection
;
4123 zend_hash_add(&php_pqcancel_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4125 memset(&ce
, 0, sizeof(ce
));
4126 INIT_NS_CLASS_ENTRY(ce
, "pq", "Event", php_pqevent_methods
);
4127 php_pqevent_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4128 php_pqevent_class_entry
->create_object
= php_pqevent_create_object
;
4130 memcpy(&php_pqevent_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4131 php_pqevent_object_handlers
.read_property
= php_pq_object_read_prop
;
4132 php_pqevent_object_handlers
.write_property
= php_pq_object_write_prop
;
4133 php_pqevent_object_handlers
.clone_obj
= NULL
;
4134 php_pqevent_object_handlers
.get_property_ptr_ptr
= NULL
;
4135 php_pqevent_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4137 zend_hash_init(&php_pqevent_object_prophandlers
, 2, NULL
, NULL
, 1);
4139 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4140 ph
.read
= php_pqevent_object_read_connection
;
4141 zend_hash_add(&php_pqevent_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4143 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("type"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4144 ph
.read
= php_pqevent_object_read_type
;
4145 zend_hash_add(&php_pqevent_object_prophandlers
, "type", sizeof("type"), (void *) &ph
, sizeof(ph
), NULL
);
4147 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("NOTICE"), ZEND_STRL("notice") TSRMLS_CC
);
4148 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESULT"), ZEND_STRL("result") TSRMLS_CC
);
4149 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESET"), ZEND_STRL("reset") TSRMLS_CC
);
4151 memset(&ce
, 0, sizeof(ce
));
4152 INIT_NS_CLASS_ENTRY(ce
, "pq", "LOB", php_pqlob_methods
);
4153 php_pqlob_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4154 php_pqlob_class_entry
->create_object
= php_pqlob_create_object
;
4156 memcpy(&php_pqlob_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4157 php_pqlob_object_handlers
.read_property
= php_pq_object_read_prop
;
4158 php_pqlob_object_handlers
.write_property
= php_pq_object_write_prop
;
4159 php_pqlob_object_handlers
.clone_obj
= NULL
;
4160 php_pqlob_object_handlers
.get_property_ptr_ptr
= NULL
;
4161 php_pqlob_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4163 zend_hash_init(&php_pqlob_object_prophandlers
, 2, NULL
, NULL
, 1);
4165 zend_declare_property_null(php_pqlob_class_entry
, ZEND_STRL("transaction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4166 ph
.read
= php_pqlob_object_read_transaction
;
4167 zend_hash_add(&php_pqlob_object_prophandlers
, "transaction", sizeof("transaction"), (void *) &ph
, sizeof(ph
), NULL
);
4169 zend_declare_property_long(php_pqlob_class_entry
, ZEND_STRL("oid"), InvalidOid
, ZEND_ACC_PUBLIC TSRMLS_CC
);
4170 ph
.read
= php_pqlob_object_read_oid
;
4171 zend_hash_add(&php_pqlob_object_prophandlers
, "oid", sizeof("oid"), (void *) &ph
, sizeof(ph
), NULL
);
4173 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("INVALID_OID"), InvalidOid TSRMLS_CC
);
4174 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("R"), INV_READ TSRMLS_CC
);
4175 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("W"), INV_WRITE TSRMLS_CC
);
4176 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("RW"), INV_READ
|INV_WRITE TSRMLS_CC
);
4178 memset(&ce
, 0, sizeof(ce
));
4179 INIT_NS_CLASS_ENTRY(ce
, "pq", "COPY", php_pqcopy_methods
);
4180 php_pqcopy_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
4181 php_pqcopy_class_entry
->create_object
= php_pqcopy_create_object
;
4183 memcpy(&php_pqcopy_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
4184 php_pqcopy_object_handlers
.read_property
= php_pq_object_read_prop
;
4185 php_pqcopy_object_handlers
.write_property
= php_pq_object_write_prop
;
4186 php_pqcopy_object_handlers
.clone_obj
= NULL
;
4187 php_pqcopy_object_handlers
.get_property_ptr_ptr
= NULL
;
4188 php_pqcopy_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
4190 zend_hash_init(&php_pqcopy_object_prophandlers
, 4, NULL
, NULL
, 1);
4192 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4193 ph
.read
= php_pqcopy_object_read_connection
;
4194 zend_hash_add(&php_pqcopy_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
4196 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("expression"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4197 ph
.read
= php_pqcopy_object_read_expression
;
4198 zend_hash_add(&php_pqcopy_object_prophandlers
, "expression", sizeof("expression"), (void *) &ph
, sizeof(ph
), NULL
);
4200 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("direction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4201 ph
.read
= php_pqcopy_object_read_direction
;
4202 zend_hash_add(&php_pqcopy_object_prophandlers
, "direction", sizeof("direction"), (void *) &ph
, sizeof(ph
), NULL
);
4204 zend_declare_property_null(php_pqcopy_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
4205 ph
.read
= php_pqcopy_object_read_options
;
4206 zend_hash_add(&php_pqcopy_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
4208 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("FROM_STDIN"), PHP_PQCOPY_FROM_STDIN TSRMLS_CC
);
4209 zend_declare_class_constant_long(php_pqcopy_class_entry
, ZEND_STRL("TO_STDOUT"), PHP_PQCOPY_TO_STDOUT TSRMLS_CC
);
4212 REGISTER_INI_ENTRIES();
4218 /* {{{ PHP_MSHUTDOWN_FUNCTION
4220 static PHP_MSHUTDOWN_FUNCTION(pq
)
4222 /* uncomment this line if you have INI entries
4223 UNREGISTER_INI_ENTRIES();
4229 /* {{{ PHP_MINFO_FUNCTION
4231 static PHP_MINFO_FUNCTION(pq
)
4233 php_info_print_table_start();
4234 php_info_print_table_header(2, "pq support", "enabled");
4235 php_info_print_table_end();
4237 /* Remove comments if you have entries in php.ini
4238 DISPLAY_INI_ENTRIES();
4243 const zend_function_entry pq_functions
[] = {
4247 /* {{{ pq_module_entry
4249 zend_module_entry pq_module_entry
= {
4250 STANDARD_MODULE_HEADER
,
4255 NULL
,/*PHP_RINIT(pq),*/
4256 NULL
,/*PHP_RSHUTDOWN(pq),*/
4259 STANDARD_MODULE_PROPERTIES
4263 #ifdef COMPILE_DL_PQ
4273 * vim600: noet sw=4 ts=4 fdm=marker
4274 * vim<600: noet sw=4 ts=4