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 *PHP_PQerrorMessage(PGconn
*c
) {
31 char *e
= PQerrorMessage(c
);
34 while (l
-- > 0 && e
[l
] == '\n') {
42 ZEND_DECLARE_MODULE_GLOBALS(pq)
48 /* Remove comments and fill if you need to have entries in php.ini
50 STD_PHP_INI_ENTRY("pq.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_pq_globals, pq_globals)
51 STD_PHP_INI_ENTRY("pq.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_pq_globals, pq_globals)
56 /* {{{ php_pq_init_globals
58 /* Uncomment this function if you have INI entries
59 static void php_pq_init_globals(zend_pq_globals *pq_globals)
61 pq_globals->global_value = 0;
62 pq_globals->global_string = NULL;
67 static zend_class_entry
*php_pqconn_class_entry
;
68 static zend_class_entry
*php_pqtypes_class_entry
;
69 static zend_class_entry
*php_pqres_class_entry
;
70 static zend_class_entry
*php_pqstm_class_entry
;
71 static zend_class_entry
*php_pqtxn_class_entry
;
72 static zend_class_entry
*php_pqcancel_class_entry
;
73 static zend_class_entry
*php_pqevent_class_entry
;
74 static zend_class_entry
*php_pqlob_class_entry
;
76 static zend_object_handlers php_pqconn_object_handlers
;
77 static zend_object_handlers php_pqtypes_object_handlers
;
78 static zend_object_handlers php_pqres_object_handlers
;
79 static zend_object_handlers php_pqstm_object_handlers
;
80 static zend_object_handlers php_pqtxn_object_handlers
;
81 static zend_object_handlers php_pqcancel_object_handlers
;
82 static zend_object_handlers php_pqevent_object_handlers
;
83 static zend_object_handlers php_pqlob_object_handlers
;
85 typedef struct php_pq_callback
{
87 zend_fcall_info_cache fcc
;
91 typedef struct php_pq_object
{
94 HashTable
*prophandler
;
98 typedef struct php_pqconn
{
100 int (*poller
)(PGconn
*);
102 HashTable eventhandlers
;
103 php_pq_callback_t onevent
;
104 unsigned unbuffered
:1;
107 typedef struct php_pqconn_object
{
109 zend_object_value zv
;
110 HashTable
*prophandler
;
111 php_pqconn_t
*intern
;
112 } php_pqconn_object_t
;
114 typedef struct php_pqtypes
{
116 php_pqconn_object_t
*conn
;
119 typedef struct php_pqtypes_object
{
121 zend_object_value zv
;
122 HashTable
*prophandler
;
123 php_pqtypes_t
*intern
;
124 } php_pqtypes_object_t
;
126 typedef struct php_pqconn_event_data
{
127 php_pqconn_object_t
*obj
;
131 } php_pqconn_event_data_t
;
133 typedef enum php_pqres_fetch
{
134 PHP_PQRES_FETCH_ARRAY
,
135 PHP_PQRES_FETCH_ASSOC
,
136 PHP_PQRES_FETCH_OBJECT
139 typedef struct php_pqres_iterator
{
140 zend_object_iterator zi
;
143 php_pqres_fetch_t fetch_type
;
144 } php_pqres_iterator_t
;
146 typedef struct php_pqres
{
148 php_pqres_iterator_t
*iter
;
151 typedef struct php_pqres_object
{
153 zend_object_value zv
;
154 HashTable
*prophandler
;
156 } php_pqres_object_t
;
158 typedef struct php_pqstm
{
159 php_pqconn_object_t
*conn
;
163 typedef struct php_pqstm_object
{
165 zend_object_value zv
;
166 HashTable
*prophandler
;
168 } php_pqstm_object_t
;
170 typedef enum php_pqtxn_isolation
{
171 PHP_PQTXN_READ_COMMITTED
,
172 PHP_PQTXN_REPEATABLE_READ
,
173 PHP_PQTXN_SERIALIZABLE
,
174 } php_pqtxn_isolation_t
;
176 typedef struct php_pqtxn
{
177 php_pqconn_object_t
*conn
;
178 php_pqtxn_isolation_t isolation
;
180 unsigned deferrable
:1;
183 typedef struct php_pqtxn_object
{
185 zend_object_value zv
;
186 HashTable
*prophandler
;
188 } php_pqtxn_object_t
;
190 typedef struct php_pqcancel
{
192 php_pqconn_object_t
*conn
;
195 typedef struct php_pqcancel_object
{
197 zend_object_value zv
;
198 HashTable
*prophandler
;
199 php_pqcancel_t
*intern
;
200 } php_pqcancel_object_t
;
202 typedef struct php_pqevent
{
203 php_pq_callback_t cb
;
204 php_pqconn_object_t
*conn
;
208 typedef struct php_pqevent_object
{
210 zend_object_value zv
;
211 HashTable
*prophandler
;
212 php_pqevent_t
*intern
;
213 } php_pqevent_object_t
;
215 typedef struct php_pqlob
{
218 php_pqtxn_object_t
*txn
;
221 typedef struct php_pqlob_object
{
223 zend_object_value zv
;
224 HashTable
*prophandler
;
226 } php_pqlob_object_t
;
228 static HashTable php_pqconn_object_prophandlers
;
229 static HashTable php_pqtypes_object_prophandlers
;
230 static HashTable php_pqres_object_prophandlers
;
231 static HashTable php_pqstm_object_prophandlers
;
232 static HashTable php_pqtxn_object_prophandlers
;
233 static HashTable php_pqcancel_object_prophandlers
;
234 static HashTable php_pqevent_object_prophandlers
;
235 static HashTable php_pqlob_object_prophandlers
;
237 typedef void (*php_pq_object_prophandler_func_t
)(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
);
239 typedef struct php_pq_object_prophandler
{
240 php_pq_object_prophandler_func_t read
;
241 php_pq_object_prophandler_func_t write
;
242 } php_pq_object_prophandler_t
;
244 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
246 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
248 php_pqres_iterator_t
*iter
;
249 zval
*prop
, *zfetch_type
;
251 iter
= ecalloc(1, sizeof(*iter
));
252 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
253 iter
->zi
.data
= object
;
256 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
257 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
258 convert_to_long_ex(&zfetch_type
);
260 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
261 if (zfetch_type
!= prop
) {
262 zval_ptr_dtor(&zfetch_type
);
264 if (Z_REFCOUNT_P(prop
)) {
265 zval_ptr_dtor(&prop
);
271 return (zend_object_iterator
*) iter
;
274 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
276 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
278 if (iter
->current_val
) {
279 zval_ptr_dtor(&iter
->current_val
);
280 iter
->current_val
= NULL
;
282 zval_ptr_dtor((zval
**) &iter
->zi
.data
);
286 static STATUS
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
288 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
289 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
291 if (PQresultStatus(obj
->intern
->res
) != PGRES_TUPLES_OK
) {
294 if (PQntuples(obj
->intern
->res
) <= iter
->index
) {
301 static zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type TSRMLS_DC
)
307 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
313 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
314 if (PQgetisnull(res
, row
, c
)) {
315 switch (fetch_type
) {
316 case PHP_PQRES_FETCH_OBJECT
:
317 add_property_null(data
, PQfname(res
, c
));
320 case PHP_PQRES_FETCH_ASSOC
:
321 add_assoc_null(data
, PQfname(res
, c
));
324 case PHP_PQRES_FETCH_ARRAY
:
325 add_index_null(data
, c
);
329 char *val
= PQgetvalue(res
, row
, c
);
330 int len
= PQgetlength(res
, row
, c
);
332 switch (fetch_type
) {
333 case PHP_PQRES_FETCH_OBJECT
:
334 add_property_stringl(data
, PQfname(res
, c
), val
, len
, 1);
337 case PHP_PQRES_FETCH_ASSOC
:
338 add_assoc_stringl(data
, PQfname(res
, c
), val
, len
, 1);
341 case PHP_PQRES_FETCH_ARRAY
:
342 add_index_stringl(data
, c
, val
, len
,1);
351 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
353 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
354 php_pqres_object_t
*obj
= zend_object_store_get_object(iter
->zi
.data TSRMLS_CC
);
356 if (iter
->current_val
) {
357 zval_ptr_dtor(&iter
->current_val
);
359 iter
->current_val
= php_pqres_row_to_zval(obj
->intern
->res
, iter
->index
, iter
->fetch_type TSRMLS_CC
);
360 *data_ptr
= &iter
->current_val
;
363 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
365 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
367 *key_num
= (ulong
) iter
->index
;
369 return HASH_KEY_IS_LONG
;
372 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
374 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
379 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
381 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
386 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
387 php_pqres_iterator_dtor
,
388 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
389 php_pqres_iterator_valid
,
390 /* fetch the item data for the current element */
391 php_pqres_iterator_current
,
392 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
393 php_pqres_iterator_key
,
394 /* step forwards to next element */
395 php_pqres_iterator_next
,
396 /* rewind to start of data (optional, may be NULL) */
397 php_pqres_iterator_rewind
,
398 /* invalidate current value/key (optional, may be NULL) */
402 static STATUS
php_pqres_success(PGresult
*res TSRMLS_DC
)
404 switch (PQresultStatus(res
)) {
405 case PGRES_BAD_RESPONSE
:
406 case PGRES_NONFATAL_ERROR
:
407 case PGRES_FATAL_ERROR
:
408 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "%s", PQresultErrorMessage(res
));
415 static void php_pq_callback_dtor(php_pq_callback_t
*cb
) {
416 if (cb
->fci
.size
> 0) {
417 zend_fcall_info_args_clear(&cb
->fci
, 1);
418 zval_ptr_dtor(&cb
->fci
.function_name
);
419 if (cb
->fci
.object_ptr
) {
420 zval_ptr_dtor(&cb
->fci
.object_ptr
);
426 static void php_pq_callback_addref(php_pq_callback_t
*cb
)
428 Z_ADDREF_P(cb
->fci
.function_name
);
429 if (cb
->fci
.object_ptr
) {
430 Z_ADDREF_P(cb
->fci
.object_ptr
);
434 static void php_pq_object_to_zval(void *o
, zval
**zv TSRMLS_DC
)
436 php_pq_object_t
*obj
= o
;
442 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
444 (*zv
)->type
= IS_OBJECT
;
445 (*zv
)->value
.obj
= obj
->zv
;
448 static void php_pq_object_addref(void *o TSRMLS_DC
)
450 php_pq_object_t
*obj
= o
;
451 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
454 static void php_pq_object_delref(void *o TSRMLS_DC
)
456 php_pq_object_t
*obj
= o
;
457 zend_objects_store_del_ref_by_handle_ex(obj
->zv
.handle
, obj
->zv
.handlers TSRMLS_CC
);
460 static void php_pqconn_object_free(void *o TSRMLS_DC
)
462 php_pqconn_object_t
*obj
= o
;
465 PQfinish(obj
->intern
->conn
);
466 php_pq_callback_dtor(&obj
->intern
->onevent
);
467 zend_hash_destroy(&obj
->intern
->listeners
);
468 zend_hash_destroy(&obj
->intern
->eventhandlers
);
472 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
476 static void php_pqtypes_object_free(void *o TSRMLS_DC
)
478 php_pqtypes_object_t
*obj
= o
;
481 zend_hash_destroy(&obj
->intern
->types
);
482 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
486 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
490 static int php_pqconn_event(PGEventId id
, void *e
, void *data
);
492 static void php_pqres_object_free(void *o TSRMLS_DC
)
494 php_pqres_object_t
*obj
= o
;
497 if (obj
->intern
->res
) {
498 zval
*res
= PQresultInstanceData(obj
->intern
->res
, php_pqconn_event
);
500 PQresultSetInstanceData(obj
->intern
->res
, php_pqconn_event
, NULL
);
503 PQclear(obj
->intern
->res
);
504 obj
->intern
->res
= NULL
;
508 if (obj
->intern
->iter
) {
509 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
510 obj
->intern
->iter
= NULL
;
516 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
520 static void php_pqstm_object_free(void *o TSRMLS_DC
)
522 php_pqstm_object_t
*obj
= o
;
525 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
526 efree(obj
->intern
->name
);
530 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
534 static void php_pqtxn_object_free(void *o TSRMLS_DC
)
536 php_pqtxn_object_t
*obj
= o
;
539 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
543 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
547 static void php_pqcancel_object_free(void *o TSRMLS_DC
)
549 php_pqcancel_object_t
*obj
= o
;
552 PQfreeCancel(obj
->intern
->cancel
);
553 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
557 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
561 static void php_pqevent_object_free(void *o TSRMLS_DC
)
563 php_pqevent_object_t
*obj
= o
;
566 php_pq_callback_dtor(&obj
->intern
->cb
);
567 php_pq_object_delref(obj
->intern
->conn TSRMLS_CC
);
568 efree(obj
->intern
->type
);
572 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
576 static void php_pqlob_object_free(void *o TSRMLS_DC
)
578 php_pqlob_object_t
*obj
= o
;
581 if (obj
->intern
->lofd
) {
582 lo_close(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
584 php_pq_object_delref(obj
->intern
->txn TSRMLS_CC
);
588 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
592 static zend_object_value
php_pqconn_create_object_ex(zend_class_entry
*ce
, php_pqconn_t
*intern
, php_pqconn_object_t
**ptr TSRMLS_DC
)
594 php_pqconn_object_t
*o
;
596 o
= ecalloc(1, sizeof(*o
));
597 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
598 object_properties_init((zend_object
*) o
, ce
);
599 o
->prophandler
= &php_pqconn_object_prophandlers
;
609 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqconn_object_free
, NULL TSRMLS_CC
);
610 o
->zv
.handlers
= &php_pqconn_object_handlers
;
615 static zend_object_value
php_pqtypes_create_object_ex(zend_class_entry
*ce
, php_pqtypes_t
*intern
, php_pqtypes_object_t
**ptr TSRMLS_DC
)
617 php_pqtypes_object_t
*o
;
619 o
= ecalloc(1, sizeof(*o
));
620 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
621 object_properties_init((zend_object
*) o
, ce
);
622 o
->prophandler
= &php_pqtypes_object_prophandlers
;
632 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtypes_object_free
, NULL TSRMLS_CC
);
633 o
->zv
.handlers
= &php_pqtypes_object_handlers
;
638 static zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, php_pqres_t
*intern
, php_pqres_object_t
**ptr TSRMLS_DC
)
640 php_pqres_object_t
*o
;
642 o
= ecalloc(1, sizeof(*o
));
643 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
644 object_properties_init((zend_object
*) o
, ce
);
645 o
->prophandler
= &php_pqres_object_prophandlers
;
655 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
656 o
->zv
.handlers
= &php_pqres_object_handlers
;
661 static zend_object_value
php_pqstm_create_object_ex(zend_class_entry
*ce
, php_pqstm_t
*intern
, php_pqstm_object_t
**ptr TSRMLS_DC
)
663 php_pqstm_object_t
*o
;
665 o
= ecalloc(1, sizeof(*o
));
666 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
667 object_properties_init((zend_object
*) o
, ce
);
668 o
->prophandler
= &php_pqstm_object_prophandlers
;
678 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqstm_object_free
, NULL TSRMLS_CC
);
679 o
->zv
.handlers
= &php_pqstm_object_handlers
;
684 static zend_object_value
php_pqtxn_create_object_ex(zend_class_entry
*ce
, php_pqtxn_t
*intern
, php_pqtxn_object_t
**ptr TSRMLS_DC
)
686 php_pqtxn_object_t
*o
;
688 o
= ecalloc(1, sizeof(*o
));
689 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
690 object_properties_init((zend_object
*) o
, ce
);
691 o
->prophandler
= &php_pqtxn_object_prophandlers
;
701 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqtxn_object_free
, NULL TSRMLS_CC
);
702 o
->zv
.handlers
= &php_pqtxn_object_handlers
;
707 static zend_object_value
php_pqcancel_create_object_ex(zend_class_entry
*ce
, php_pqcancel_t
*intern
, php_pqcancel_object_t
**ptr TSRMLS_DC
)
709 php_pqcancel_object_t
*o
;
711 o
= ecalloc(1, sizeof(*o
));
712 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
713 object_properties_init((zend_object
*) o
, ce
);
714 o
->prophandler
= &php_pqcancel_object_prophandlers
;
724 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqcancel_object_free
, NULL TSRMLS_CC
);
725 o
->zv
.handlers
= &php_pqcancel_object_handlers
;
730 static zend_object_value
php_pqevent_create_object_ex(zend_class_entry
*ce
, php_pqevent_t
*intern
, php_pqevent_object_t
**ptr TSRMLS_DC
)
732 php_pqevent_object_t
*o
;
734 o
= ecalloc(1, sizeof(*o
));
735 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
736 object_properties_init((zend_object
*) o
, ce
);
737 o
->prophandler
= &php_pqevent_object_prophandlers
;
747 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqevent_object_free
, NULL TSRMLS_CC
);
748 o
->zv
.handlers
= &php_pqevent_object_handlers
;
753 static zend_object_value
php_pqlob_create_object_ex(zend_class_entry
*ce
, php_pqlob_t
*intern
, php_pqlob_object_t
**ptr TSRMLS_DC
)
755 php_pqlob_object_t
*o
;
757 o
= ecalloc(1, sizeof(*o
));
758 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
759 object_properties_init((zend_object
*) o
, ce
);
760 o
->prophandler
= &php_pqlob_object_prophandlers
;
770 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqlob_object_free
, NULL TSRMLS_CC
);
771 o
->zv
.handlers
= &php_pqlob_object_handlers
;
776 static zend_object_value
php_pqconn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
778 return php_pqconn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
781 static zend_object_value
php_pqtypes_create_object(zend_class_entry
*class_type TSRMLS_DC
)
783 return php_pqtypes_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
786 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
788 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
791 static zend_object_value
php_pqstm_create_object(zend_class_entry
*class_type TSRMLS_DC
)
793 return php_pqstm_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
796 static zend_object_value
php_pqtxn_create_object(zend_class_entry
*class_type TSRMLS_DC
)
798 return php_pqtxn_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
801 static zend_object_value
php_pqcancel_create_object(zend_class_entry
*class_type TSRMLS_DC
)
803 return php_pqcancel_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
806 static zend_object_value
php_pqevent_create_object(zend_class_entry
*class_type TSRMLS_DC
)
808 return php_pqevent_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
811 static zend_object_value
php_pqlob_create_object(zend_class_entry
*class_type TSRMLS_DC
)
813 return php_pqlob_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
816 static int apply_ph_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
818 php_pq_object_prophandler_t
*ph
= p
;
819 HashTable
*ht
= va_arg(argv
, HashTable
*);
820 zval
**return_value
, *object
= va_arg(argv
, zval
*);
821 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
823 if (SUCCESS
== zend_hash_find(ht
, key
->arKey
, key
->nKeyLength
, (void *) &return_value
)) {
826 zval_ptr_dtor(return_value
);
827 MAKE_STD_ZVAL(*return_value
);
828 ZVAL_NULL(*return_value
);
830 ph
->read(object
, obj
, *return_value TSRMLS_CC
);
834 return ZEND_HASH_APPLY_KEEP
;
837 static int apply_pi_to_debug(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
839 zend_property_info
*pi
= p
;
840 HashTable
*ht
= va_arg(argv
, HashTable
*);
841 zval
*object
= va_arg(argv
, zval
*);
842 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
843 zval
*property
= zend_read_property(obj
->zo
.ce
, object
, pi
->name
, pi
->name_length
, 0 TSRMLS_CC
);
845 if (!Z_REFCOUNT_P(property
)) {
846 Z_ADDREF_P(property
);
848 zend_hash_add(ht
, pi
->name
, pi
->name_length
+ 1, (void *) &property
, sizeof(zval
*), NULL
);
850 return ZEND_HASH_APPLY_KEEP
;
853 static HashTable
*php_pq_object_debug_info(zval
*object
, int *temp TSRMLS_DC
)
856 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
860 ZEND_INIT_SYMTABLE(ht
);
862 zend_hash_apply_with_arguments(&obj
->zo
.ce
->properties_info TSRMLS_CC
, apply_pi_to_debug
, 3, ht
, object
, obj
);
863 zend_hash_apply_with_arguments(obj
->prophandler TSRMLS_CC
, apply_ph_to_debug
, 3, ht
, object
, obj
);
868 static void php_pqconn_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
870 php_pqconn_object_t
*obj
= o
;
872 RETVAL_LONG(PQstatus(obj
->intern
->conn
));
875 static void php_pqconn_object_read_transaction_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
877 php_pqconn_object_t
*obj
= o
;
879 RETVAL_LONG(PQtransactionStatus(obj
->intern
->conn
));
882 static void php_pqconn_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
884 php_pqconn_object_t
*obj
= o
;
885 char *error
= PHP_PQerrorMessage(obj
->intern
->conn
);
888 RETVAL_STRING(error
, 1);
894 static int apply_notify_listener(void *p
, void *arg TSRMLS_DC
)
896 php_pq_callback_t
*listener
= p
;
898 zval
*zpid
, *zchannel
, *zmessage
;
901 ZVAL_LONG(zpid
, nfy
->be_pid
);
902 MAKE_STD_ZVAL(zchannel
);
903 ZVAL_STRING(zchannel
, nfy
->relname
, 1);
904 MAKE_STD_ZVAL(zmessage
);
905 ZVAL_STRING(zmessage
, nfy
->extra
, 1);
907 zend_fcall_info_argn(&listener
->fci TSRMLS_CC
, 3, &zchannel
, &zmessage
, &zpid
);
908 zend_fcall_info_call(&listener
->fci
, &listener
->fcc
, NULL
, NULL TSRMLS_CC
);
910 zval_ptr_dtor(&zchannel
);
911 zval_ptr_dtor(&zmessage
);
912 zval_ptr_dtor(&zpid
);
914 return ZEND_HASH_APPLY_KEEP
;
917 static int apply_notify_listeners(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
919 HashTable
*listeners
= p
;
920 PGnotify
*nfy
= va_arg(argv
, PGnotify
*);
922 if (0 == fnmatch(key
->arKey
, nfy
->relname
, 0)) {
923 zend_hash_apply_with_argument(listeners
, apply_notify_listener
, nfy TSRMLS_CC
);
926 return ZEND_HASH_APPLY_KEEP
;
929 static void php_pqconn_notify_listeners(php_pqconn_object_t
*obj TSRMLS_DC
)
933 while ((nfy
= PQnotifies(obj
->intern
->conn
))) {
934 zend_hash_apply_with_arguments(&obj
->intern
->listeners TSRMLS_CC
, apply_notify_listeners
, 1, nfy
);
939 static void php_pqconn_object_read_busy(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
941 php_pqconn_object_t
*obj
= o
;
943 RETVAL_BOOL(PQisBusy(obj
->intern
->conn
));
946 static void php_pqconn_object_read_encoding(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
948 php_pqconn_object_t
*obj
= o
;
950 RETVAL_STRING(pg_encoding_to_char(PQclientEncoding(obj
->intern
->conn
)), 1);
953 static void php_pqconn_object_write_encoding(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
955 php_pqconn_object_t
*obj
= o
;
958 if (Z_TYPE_P(value
) != IS_STRING
) {
959 convert_to_string_ex(&zenc
);
962 if (0 > PQsetClientEncoding(obj
->intern
->conn
, Z_STRVAL_P(zenc
))) {
963 zend_error(E_NOTICE
, "Unrecognized encoding '%s'", Z_STRVAL_P(zenc
));
967 zval_ptr_dtor(&zenc
);
971 static void php_pqconn_object_read_unbuffered(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
973 php_pqconn_object_t
*obj
= o
;
975 RETVAL_BOOL(obj
->intern
->unbuffered
);
978 static void php_pqconn_object_write_unbuffered(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
980 php_pqconn_object_t
*obj
= o
;
982 obj
->intern
->unbuffered
= zend_is_true(value
);
985 static void php_pqconn_object_read_db(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
987 php_pqconn_object_t
*obj
= o
;
988 char *db
= PQdb(obj
->intern
->conn
);
991 RETVAL_STRING(db
, 1);
993 RETVAL_EMPTY_STRING();
997 static void php_pqconn_object_read_user(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
999 php_pqconn_object_t
*obj
= o
;
1000 char *user
= PQuser(obj
->intern
->conn
);
1003 RETVAL_STRING(user
, 1);
1005 RETVAL_EMPTY_STRING();
1009 static void php_pqconn_object_read_pass(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1011 php_pqconn_object_t
*obj
= o
;
1012 char *pass
= PQpass(obj
->intern
->conn
);
1015 RETVAL_STRING(pass
, 1);
1017 RETVAL_EMPTY_STRING();
1021 static void php_pqconn_object_read_host(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1023 php_pqconn_object_t
*obj
= o
;
1024 char *host
= PQhost(obj
->intern
->conn
);
1027 RETVAL_STRING(host
, 1);
1029 RETVAL_EMPTY_STRING();
1033 static void php_pqconn_object_read_port(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1035 php_pqconn_object_t
*obj
= o
;
1036 char *port
= PQport(obj
->intern
->conn
);
1039 RETVAL_STRING(port
, 1);
1041 RETVAL_EMPTY_STRING();
1045 static void php_pqconn_object_read_options(zval
*objec
, void *o
, zval
*return_value TSRMLS_DC
)
1047 php_pqconn_object_t
*obj
= o
;
1048 char *options
= PQoptions(obj
->intern
->conn
);
1051 RETVAL_STRING(options
, 1);
1053 RETVAL_EMPTY_STRING();
1057 static void php_pqtypes_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1059 php_pqtypes_object_t
*obj
= o
;
1061 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1064 static int has_dimension(HashTable
*ht
, zval
*member
, char **key_str
, int *key_len
, long *index TSRMLS_DC
)
1069 switch (Z_TYPE_P(member
)) {
1071 convert_to_string_ex(&tmp
);
1074 if (!is_numeric_string(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
), &lval
, NULL
, 0)) {
1075 if (member
!= tmp
) {
1076 zval_ptr_dtor(&tmp
);
1079 *key_str
= estrndup(Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
));
1081 *key_len
= Z_STRLEN_P(tmp
) + 1;
1084 return zend_hash_exists(ht
, Z_STRVAL_P(tmp
), Z_STRLEN_P(tmp
) + 1);
1088 lval
= Z_LVAL_P(member
);
1092 if (member
!= tmp
) {
1093 zval_ptr_dtor(&tmp
);
1098 return zend_hash_index_exists(ht
, lval
);
1101 static int php_pqtypes_object_has_dimension(zval
*object
, zval
*member
, int check_empty TSRMLS_DC
)
1103 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1104 char *key_str
= NULL
;
1109 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1112 if (key_str
&& key_len
) {
1113 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1115 return Z_TYPE_PP(data
) != IS_NULL
;
1119 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) data
)) {
1120 return Z_TYPE_PP(data
) != IS_NULL
;
1125 return has_dimension(&obj
->intern
->types
, member
, NULL
, NULL
, NULL TSRMLS_CC
);
1131 static zval
*php_pqtypes_object_read_dimension(zval
*object
, zval
*member
, int type TSRMLS_DC
)
1134 char *key_str
= NULL
;
1136 php_pqtypes_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1138 if (has_dimension(&obj
->intern
->types
, member
, &key_str
, &key_len
, &index TSRMLS_CC
)) {
1141 if (key_str
&& key_len
) {
1142 if (SUCCESS
== zend_hash_find(&obj
->intern
->types
, key_str
, key_len
, (void *) &data
)) {
1147 if (SUCCESS
== zend_hash_index_find(&obj
->intern
->types
, index
, (void *) &data
)) {
1156 static void php_pqres_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1158 php_pqres_object_t
*obj
= o
;
1160 RETVAL_LONG(PQresultStatus(obj
->intern
->res
));
1163 static void php_pqres_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1165 php_pqres_object_t
*obj
= o
;
1166 char *error
= PQresultErrorMessage(obj
->intern
->res
);
1169 RETVAL_STRING(error
, 1);
1175 static void php_pqres_object_read_num_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1177 php_pqres_object_t
*obj
= o
;
1179 RETVAL_LONG(PQntuples(obj
->intern
->res
));
1182 static void php_pqres_object_read_num_cols(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1184 php_pqres_object_t
*obj
= o
;
1186 RETVAL_LONG(PQnfields(obj
->intern
->res
));
1189 static void php_pqres_object_read_affected_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1191 php_pqres_object_t
*obj
= o
;
1193 RETVAL_LONG(atoi(PQcmdTuples(obj
->intern
->res
)));
1196 static void php_pqres_object_read_fetch_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1198 php_pqres_object_t
*obj
= o
;
1200 if (obj
->intern
->iter
) {
1201 RETVAL_LONG(obj
->intern
->iter
->fetch_type
);
1203 RETVAL_LONG(PHP_PQRES_FETCH_ARRAY
);
1207 static void php_pqres_object_write_fetch_type(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1209 php_pqres_object_t
*obj
= o
;
1210 zval
*zfetch_type
= value
;
1212 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
1213 convert_to_long_ex(&zfetch_type
);
1216 if (!obj
->intern
->iter
) {
1217 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
1218 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
1220 obj
->intern
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
1222 if (zfetch_type
!= value
) {
1223 zval_ptr_dtor(&zfetch_type
);
1227 static void php_pqstm_object_read_name(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1229 php_pqstm_object_t
*obj
= o
;
1231 RETVAL_STRING(obj
->intern
->name
, 1);
1234 static void php_pqstm_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1236 php_pqstm_object_t
*obj
= o
;
1238 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1241 static void php_pqtxn_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1243 php_pqtxn_object_t
*obj
= o
;
1245 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1248 static void php_pqtxn_object_read_isolation(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1250 php_pqtxn_object_t
*obj
= o
;
1252 RETVAL_LONG(obj
->intern
->isolation
);
1255 static void php_pqtxn_object_read_readonly(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1257 php_pqtxn_object_t
*obj
= o
;
1259 RETVAL_LONG(obj
->intern
->readonly
);
1262 static void php_pqtxn_object_read_deferrable(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1264 php_pqtxn_object_t
*obj
= o
;
1266 RETVAL_LONG(obj
->intern
->deferrable
);
1269 static void php_pqtxn_object_write_isolation(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1271 php_pqtxn_object_t
*obj
= o
;
1272 php_pqtxn_isolation_t orig
= obj
->intern
->isolation
;
1273 zval
*zisolation
= value
;
1276 if (Z_TYPE_P(zisolation
) != IS_LONG
) {
1277 convert_to_long_ex(&zisolation
);
1280 switch ((obj
->intern
->isolation
= Z_LVAL_P(zisolation
))) {
1281 case PHP_PQTXN_READ_COMMITTED
:
1282 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ COMMITED");
1284 case PHP_PQTXN_REPEATABLE_READ
:
1285 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION REPEATABLE READ");
1287 case PHP_PQTXN_SERIALIZABLE
:
1288 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION SERIALIZABLE");
1291 obj
->intern
->isolation
= orig
;
1296 if (zisolation
!= value
) {
1297 zval_ptr_dtor(&zisolation
);
1301 php_pqres_success(res TSRMLS_CC
);
1306 static void php_pqtxn_object_write_readonly(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1308 php_pqtxn_object_t
*obj
= o
;
1311 if ((obj
->intern
->readonly
= zend_is_true(value
))) {
1312 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ ONLY");
1314 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION READ WRITE");
1318 php_pqres_success(res TSRMLS_CC
);
1323 static void php_pqtxn_object_write_deferrable(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
1325 php_pqtxn_object_t
*obj
= o
;
1328 if ((obj
->intern
->deferrable
= zend_is_true(value
))) {
1329 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION DEFERRABLE");
1331 res
= PQexec(obj
->intern
->conn
->intern
->conn
, "SET TRANSACTION NOT DEFERRABLE");
1335 php_pqres_success(res TSRMLS_CC
);
1340 static void php_pqcancel_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1342 php_pqcancel_object_t
*obj
= o
;
1344 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1347 static void php_pqevent_object_read_connection(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1349 php_pqevent_object_t
*obj
= o
;
1351 php_pq_object_to_zval(obj
->intern
->conn
, &return_value TSRMLS_CC
);
1354 static void php_pqevent_object_read_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1356 php_pqevent_object_t
*obj
= o
;
1358 RETVAL_STRING(obj
->intern
->type
, 1);
1361 static void php_pqlob_object_read_transaction(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1363 php_pqlob_object_t
*obj
= o
;
1365 php_pq_object_to_zval(obj
->intern
->txn
, &return_value TSRMLS_CC
);
1368 static void php_pqlob_object_read_oid(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
1370 php_pqlob_object_t
*obj
= o
;
1372 RETVAL_LONG(obj
->intern
->loid
);
1375 static zend_class_entry
*ancestor(zend_class_entry
*ce
) {
1376 while (ce
->parent
) {
1382 static zval
*php_pq_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
1384 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1385 php_pq_object_prophandler_t
*handler
;
1389 zend_error(E_WARNING
, "%s not initialized", ancestor(obj
->zo
.ce
)->name
);
1390 } else if ((SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) && handler
->read
) {
1391 if (type
== BP_VAR_R
) {
1392 ALLOC_ZVAL(return_value
);
1393 Z_SET_REFCOUNT_P(return_value
, 0);
1394 Z_UNSET_ISREF_P(return_value
);
1396 handler
->read(object
, obj
, return_value TSRMLS_CC
);
1398 zend_error(E_ERROR
, "Cannot access %s properties by reference or array key/index", ancestor(obj
->zo
.ce
)->name
);
1399 return_value
= NULL
;
1402 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
1405 return return_value
;
1408 static void php_pq_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
1410 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
1411 php_pq_object_prophandler_t
*handler
;
1413 if (SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
1414 if (handler
->write
) {
1415 handler
->write(object
, obj
, value TSRMLS_CC
);
1418 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
1422 static STATUS
php_pqconn_update_socket(zval
*this_ptr
, php_pqconn_object_t
*obj TSRMLS_DC
)
1424 zval
*zsocket
, zmember
;
1430 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1433 INIT_PZVAL(&zmember
);
1434 ZVAL_STRINGL(&zmember
, "socket", sizeof("socket")-1, 0);
1435 MAKE_STD_ZVAL(zsocket
);
1437 if ((CONNECTION_BAD
!= PQstatus(obj
->intern
->conn
))
1438 && (-1 < (socket
= PQsocket(obj
->intern
->conn
)))
1439 && (stream
= php_stream_fopen_from_fd(socket
, "r+b", NULL
))) {
1440 php_stream_to_zval(stream
, zsocket
);
1446 zend_get_std_object_handlers()->write_property(getThis(), &zmember
, zsocket
, NULL TSRMLS_CC
);
1447 zval_ptr_dtor(&zsocket
);
1453 # define TSRMLS_DF(d) TSRMLS_D = (d)->ts
1454 # define TSRMLS_CF(d) (d)->ts = TSRMLS_C
1456 # define TSRMLS_DF(d)
1457 # define TSRMLS_CF(d)
1460 static void php_pqconn_event_register(PGEventRegister
*event
, php_pqconn_event_data_t
*data
)
1462 PQsetInstanceData(event
->conn
, php_pqconn_event
, data
);
1465 static void php_pqconn_event_conndestroy(PGEventConnDestroy
*event
, php_pqconn_event_data_t
*data
)
1467 PQsetInstanceData(event
->conn
, php_pqconn_event
, NULL
);
1471 static int apply_event(void *p
, void *a TSRMLS_DC
)
1475 zval
*retval
= NULL
;
1477 zend_call_method_with_1_params(evh
, Z_OBJCE_PP(evh
), NULL
, "trigger", &retval
, args
);
1479 zval_ptr_dtor(&retval
);
1482 return ZEND_HASH_APPLY_KEEP
;
1485 static void php_pqconn_event_connreset(PGEventConnReset
*event
, php_pqconn_event_data_t
*data
)
1490 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("reset"), (void *) &evhs
)) {
1491 zval
*args
, *connection
= NULL
;
1493 MAKE_STD_ZVAL(args
);
1495 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1496 add_next_index_zval(args
, connection
);
1497 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1498 zval_ptr_dtor(&args
);
1502 static zval
*result_instance_zval(PGresult
*res TSRMLS_DC
)
1504 zval
*rid
= PQresultInstanceData(res
, php_pqconn_event
);
1507 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1511 rid
->type
= IS_OBJECT
;
1512 rid
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1514 PQresultSetInstanceData(res
, php_pqconn_event
, rid
);
1521 static void php_pqconn_event_resultcreate(PGEventResultCreate
*event
, php_pqconn_event_data_t
*data
)
1526 /* event listener */
1527 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("result"), (void *) &evhs
)) {
1528 zval
*args
, *connection
= NULL
, *res
= result_instance_zval(event
->result TSRMLS_CC
);
1530 MAKE_STD_ZVAL(args
);
1532 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1533 add_next_index_zval(args
, connection
);
1534 add_next_index_zval(args
, res
);
1535 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1536 zval_ptr_dtor(&args
);
1539 /* async callback */
1540 if (data
->obj
->intern
->onevent
.fci
.size
> 0) {
1541 zval
*res
= result_instance_zval(event
->result TSRMLS_CC
);
1543 zend_fcall_info_argn(&data
->obj
->intern
->onevent
.fci TSRMLS_CC
, 1, &res
);
1544 zend_fcall_info_call(&data
->obj
->intern
->onevent
.fci
, &data
->obj
->intern
->onevent
.fcc
, NULL
, NULL TSRMLS_CC
);
1545 zval_ptr_dtor(&res
);
1549 static int php_pqconn_event(PGEventId id
, void *e
, void *data
)
1552 case PGEVT_REGISTER
:
1553 php_pqconn_event_register(e
, data
);
1555 case PGEVT_CONNDESTROY
:
1556 php_pqconn_event_conndestroy(e
, data
);
1558 case PGEVT_CONNRESET
:
1559 php_pqconn_event_connreset(e
, data
);
1561 case PGEVT_RESULTCREATE
:
1562 php_pqconn_event_resultcreate(e
, data
);
1571 static php_pqconn_event_data_t
*php_pqconn_event_data_init(php_pqconn_object_t
*obj TSRMLS_DC
)
1573 php_pqconn_event_data_t
*data
= emalloc(sizeof(*data
));
1581 static void php_pqconn_notice_recv(void *p
, const PGresult
*res
)
1583 php_pqconn_event_data_t
*data
= p
;
1587 if (SUCCESS
== zend_hash_find(&data
->obj
->intern
->eventhandlers
, ZEND_STRS("notice"), (void *) &evhs
)) {
1588 zval
*args
, *connection
= NULL
;
1590 MAKE_STD_ZVAL(args
);
1592 php_pq_object_to_zval(data
->obj
, &connection TSRMLS_CC
);
1593 add_next_index_zval(args
, connection
);
1594 add_next_index_string(args
, PQresultErrorMessage(res
), 1);
1595 zend_hash_apply_with_argument(Z_ARRVAL_PP(evhs
), apply_event
, args TSRMLS_CC
);
1596 zval_ptr_dtor(&args
);
1600 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_construct
, 0, 0, 1)
1601 ZEND_ARG_INFO(0, dsn
)
1602 ZEND_ARG_INFO(0, async
)
1603 ZEND_END_ARG_INFO();
1604 static PHP_METHOD(pqconn
, __construct
) {
1605 zend_error_handling zeh
;
1608 zend_bool async
= 0;
1610 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1611 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|sb", &dsn_str
, &dsn_len
, &async
)) {
1612 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1613 php_pqconn_event_data_t
*data
= php_pqconn_event_data_init(obj TSRMLS_CC
);
1615 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
1617 zend_hash_init(&obj
->intern
->listeners
, 0, NULL
, (dtor_func_t
) zend_hash_destroy
, 0);
1618 zend_hash_init(&obj
->intern
->eventhandlers
, 0, NULL
, ZVAL_PTR_DTOR
, 0);
1622 obj
->intern
->conn
= PQconnectStart(dsn_str
);
1623 obj
->intern
->poller
= (int (*)(PGconn
*)) PQconnectPoll
;
1625 obj
->intern
->conn
= PQconnectdb(dsn_str
);
1628 PQsetNoticeReceiver(obj
->intern
->conn
, php_pqconn_notice_recv
, data
);
1629 PQregisterEventProc(obj
->intern
->conn
, php_pqconn_event
, "ext-pq", data
);
1631 if (SUCCESS
!= php_pqconn_update_socket(getThis(), obj TSRMLS_CC
)) {
1632 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection failed (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1635 zend_restore_error_handling(&zeh TSRMLS_CC
);
1638 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset
, 0, 0, 0)
1639 ZEND_END_ARG_INFO();
1640 static PHP_METHOD(pqconn
, reset
) {
1641 if (SUCCESS
== zend_parse_parameters_none()) {
1642 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1645 PQreset(obj
->intern
->conn
);
1647 if (CONNECTION_OK
== PQstatus(obj
->intern
->conn
)) {
1650 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Connection reset failed: (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1653 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1659 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_reset_async
, 0, 0, 0)
1660 ZEND_END_ARG_INFO();
1661 static PHP_METHOD(pqconn
, resetAsync
) {
1662 if (SUCCESS
== zend_parse_parameters_none()) {
1663 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1666 if (PQresetStart(obj
->intern
->conn
)) {
1667 obj
->intern
->poller
= (int (*)(PGconn
*)) PQresetPoll
;
1671 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1677 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
)
1679 HashTable ht
, *existing_listeners
;
1681 php_pq_callback_addref(listener
);
1683 if (SUCCESS
== zend_hash_find(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &existing_listeners
)) {
1684 zend_hash_next_index_insert(existing_listeners
, (void *) listener
, sizeof(*listener
), NULL
);
1686 zend_hash_init(&ht
, 1, NULL
, (dtor_func_t
) php_pq_callback_dtor
, 0);
1687 zend_hash_next_index_insert(&ht
, (void *) listener
, sizeof(*listener
), NULL
);
1688 zend_hash_add(&obj
->intern
->listeners
, channel_str
, channel_len
+ 1, (void *) &ht
, sizeof(HashTable
), NULL
);
1692 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_listen
, 0, 0, 0)
1693 ZEND_ARG_INFO(0, channel
)
1694 ZEND_ARG_INFO(0, callable
)
1695 ZEND_END_ARG_INFO();
1696 static PHP_METHOD(pqconn
, listen
) {
1697 char *channel_str
= NULL
;
1698 int channel_len
= 0;
1699 php_pq_callback_t listener
;
1701 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sf", &channel_str
, &channel_len
, &listener
.fci
, &listener
.fcc
)) {
1702 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1704 obj
->intern
->poller
= PQconsumeInput
;
1707 char *quoted_channel
= PQescapeIdentifier(obj
->intern
->conn
, channel_str
, channel_len
);
1709 if (quoted_channel
) {
1713 spprintf(&cmd
, 0, "LISTEN %s", channel_str
);
1714 res
= PQexec(obj
->intern
->conn
, cmd
);
1717 PQfreemem(quoted_channel
);
1720 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1721 php_pqconn_add_listener(obj
, channel_str
, channel_len
, &listener TSRMLS_CC
);
1728 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not install listener (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1732 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1734 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape channel identifier (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1737 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1743 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_notify
, 0, 0, 2)
1744 ZEND_ARG_INFO(0, channel
)
1745 ZEND_ARG_INFO(0, message
)
1746 ZEND_END_ARG_INFO();
1747 static PHP_METHOD(pqconn
, notify
) {
1748 char *channel_str
, *message_str
;
1749 int channel_len
, message_len
;
1751 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss", &channel_str
, &channel_len
, &message_str
, &message_len
)) {
1752 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1756 char *params
[2] = {channel_str
, message_str
};
1758 res
= PQexecParams(obj
->intern
->conn
, "select pg_notify($1, $2)", 2, NULL
, (const char *const*) params
, NULL
, NULL
, 0);
1761 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1768 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not notify listeners (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1772 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1775 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1781 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_poll
, 0, 0, 0)
1782 ZEND_END_ARG_INFO();
1783 static PHP_METHOD(pqconn
, poll
) {
1784 if (SUCCESS
== zend_parse_parameters_none()) {
1785 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1788 if (obj
->intern
->poller
) {
1789 if (obj
->intern
->poller
== PQconsumeInput
) {
1790 RETVAL_LONG(obj
->intern
->poller(obj
->intern
->conn
) * PGRES_POLLING_OK
);
1791 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1794 RETURN_LONG(obj
->intern
->poller(obj
->intern
->conn
));
1797 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No asynchronous operation active");
1800 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1806 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec
, 0, 0, 1)
1807 ZEND_ARG_INFO(0, query
)
1808 ZEND_END_ARG_INFO();
1809 static PHP_METHOD(pqconn
, exec
) {
1810 zend_error_handling zeh
;
1814 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1815 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &query_str
, &query_len
)) {
1816 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1819 PGresult
*res
= PQexec(obj
->intern
->conn
, query_str
);
1821 php_pqconn_notify_listeners(obj TSRMLS_CC
);
1824 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
1825 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1828 return_value
->type
= IS_OBJECT
;
1829 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1832 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1835 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1838 zend_restore_error_handling(&zeh TSRMLS_CC
);
1841 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_get_result
, 0, 0, 0)
1842 ZEND_END_ARG_INFO();
1843 static PHP_METHOD(pqconn
, getResult
) {
1844 if (SUCCESS
== zend_parse_parameters_none()) {
1845 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1848 PGresult
*res
= PQgetResult(obj
->intern
->conn
);
1851 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
1854 return_value
->type
= IS_OBJECT
;
1855 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
1860 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1866 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_async
, 0, 0, 1)
1867 ZEND_ARG_INFO(0, query
)
1868 ZEND_ARG_INFO(0, callable
)
1869 ZEND_END_ARG_INFO();
1870 static PHP_METHOD(pqconn
, execAsync
) {
1871 zend_error_handling zeh
;
1872 php_pq_callback_t resolver
= {{0}};
1876 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1877 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s|f", &query_str
, &query_len
, &resolver
.fci
, &resolver
.fcc
)) {
1878 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1881 php_pq_callback_dtor(&obj
->intern
->onevent
);
1882 if (resolver
.fci
.size
> 0) {
1883 obj
->intern
->onevent
= resolver
;
1884 php_pq_callback_addref(&obj
->intern
->onevent
);
1887 obj
->intern
->poller
= PQconsumeInput
;
1889 if (PQsendQuery(obj
->intern
->conn
, query_str
)) {
1890 if (obj
->intern
->unbuffered
) {
1891 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
1892 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1897 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
1901 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
1905 zend_restore_error_handling(&zeh TSRMLS_CC
);
1908 static int apply_to_oid(void *p
, void *arg TSRMLS_DC
)
1913 if (Z_TYPE_PP(ztype
) != IS_LONG
) {
1914 convert_to_long_ex(ztype
);
1917 **types
= Z_LVAL_PP(ztype
);
1920 if (*ztype
!= *(zval
**)p
) {
1921 zval_ptr_dtor(ztype
);
1923 return ZEND_HASH_APPLY_KEEP
;
1926 static int apply_to_param(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
1932 params
= (char ***) va_arg(argv
, char ***);
1933 zdtor
= (HashTable
*) va_arg(argv
, HashTable
*);
1935 if (Z_TYPE_PP(zparam
) == IS_NULL
) {
1939 if (Z_TYPE_PP(zparam
) != IS_STRING
) {
1940 convert_to_string_ex(zparam
);
1943 **params
= Z_STRVAL_PP(zparam
);
1946 if (*zparam
!= *(zval
**)p
) {
1947 zend_hash_next_index_insert(zdtor
, zparam
, sizeof(zval
*), NULL
);
1950 return ZEND_HASH_APPLY_KEEP
;
1953 static int php_pq_types_to_array(HashTable
*ht
, Oid
**types TSRMLS_DC
)
1955 int count
= zend_hash_num_elements(ht
);
1962 /* +1 for when less types than params are specified */
1963 *types
= tmp
= ecalloc(count
+ 1, sizeof(Oid
));
1964 zend_hash_apply_with_argument(ht
, apply_to_oid
, &tmp TSRMLS_CC
);
1970 static int php_pq_params_to_array(HashTable
*ht
, char ***params
, HashTable
*zdtor TSRMLS_DC
)
1972 int count
= zend_hash_num_elements(ht
);
1979 *params
= tmp
= ecalloc(count
, sizeof(char *));
1980 zend_hash_apply_with_arguments(ht TSRMLS_CC
, apply_to_param
, 2, &tmp
, zdtor
);
1986 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params
, 0, 0, 2)
1987 ZEND_ARG_INFO(0, query
)
1988 ZEND_ARG_ARRAY_INFO(0, params
, 0)
1989 ZEND_ARG_ARRAY_INFO(0, types
, 1)
1990 ZEND_END_ARG_INFO();
1991 static PHP_METHOD(pqconn
, execParams
) {
1992 zend_error_handling zeh
;
1996 zval
*ztypes
= NULL
;
1998 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
1999 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!", &query_str
, &query_len
, &zparams
, &ztypes
)) {
2000 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2006 char **params
= NULL
;
2009 ZEND_INIT_SYMTABLE(&zdtor
);
2010 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2013 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2016 res
= PQexecParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0);
2018 zend_hash_destroy(&zdtor
);
2026 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2029 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2030 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2033 return_value
->type
= IS_OBJECT
;
2034 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2037 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2041 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2045 zend_restore_error_handling(&zeh TSRMLS_CC
);
2048 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_exec_params_async
, 0, 0, 2)
2049 ZEND_ARG_INFO(0, query
)
2050 ZEND_ARG_ARRAY_INFO(0, params
, 0)
2051 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2052 ZEND_ARG_INFO(0, callable
)
2053 ZEND_END_ARG_INFO();
2054 static PHP_METHOD(pqconn
, execParamsAsync
) {
2055 zend_error_handling zeh
;
2056 php_pq_callback_t resolver
= {{0}};
2060 zval
*ztypes
= NULL
;
2062 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2063 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa/|a/!f", &query_str
, &query_len
, &zparams
, &ztypes
, &resolver
.fci
, &resolver
.fcc
)) {
2064 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2069 char **params
= NULL
;
2072 ZEND_INIT_SYMTABLE(&zdtor
);
2073 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2076 php_pq_types_to_array(Z_ARRVAL_P(ztypes
), &types TSRMLS_CC
);
2079 php_pq_callback_dtor(&obj
->intern
->onevent
);
2080 if (resolver
.fci
.size
> 0) {
2081 obj
->intern
->onevent
= resolver
;
2082 php_pq_callback_addref(&obj
->intern
->onevent
);
2085 obj
->intern
->poller
= PQconsumeInput
;
2087 if (PQsendQueryParams(obj
->intern
->conn
, query_str
, count
, types
, (const char *const*) params
, NULL
, NULL
, 0)) {
2088 if (obj
->intern
->unbuffered
) {
2089 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2090 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2095 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute query (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2099 zend_hash_destroy(&zdtor
);
2107 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2110 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2114 zend_restore_error_handling(&zeh TSRMLS_CC
);
2117 static STATUS
php_pqconn_prepare(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2125 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2129 count
= zend_hash_num_elements(typest
);
2130 php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2133 res
= PQprepare(obj
->intern
->conn
, name
, query
, count
, types
);
2140 rv
= php_pqres_success(res TSRMLS_CC
);
2144 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2150 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare
, 0, 0, 2)
2151 ZEND_ARG_INFO(0, type
)
2152 ZEND_ARG_INFO(0, query
)
2153 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2154 ZEND_END_ARG_INFO();
2155 static PHP_METHOD(pqconn
, prepare
) {
2156 zend_error_handling zeh
;
2157 zval
*ztypes
= NULL
;
2158 char *name_str
, *query_str
;
2159 int name_len
, *query_len
;
2161 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2162 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2163 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2166 if (SUCCESS
== php_pqconn_prepare(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2167 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2169 php_pq_object_addref(obj TSRMLS_CC
);
2171 stm
->name
= estrdup(name_str
);
2173 return_value
->type
= IS_OBJECT
;
2174 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2176 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2178 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2181 zend_restore_error_handling(&zeh TSRMLS_CC
);
2184 static STATUS
php_pqconn_prepare_async(zval
*object
, php_pqconn_object_t
*obj
, const char *name
, const char *query
, HashTable
*typest TSRMLS_DC
)
2191 obj
= zend_object_store_get_object(object TSRMLS_CC
);
2195 count
= php_pq_types_to_array(typest
, &types TSRMLS_CC
);
2198 if (PQsendPrepare(obj
->intern
->conn
, name
, query
, count
, types
)) {
2199 if (obj
->intern
->unbuffered
) {
2200 if (!PQsetSingleRowMode(obj
->intern
->conn
)) {
2201 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2206 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not prepare statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2217 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_prepare_async
, 0, 0, 2)
2218 ZEND_ARG_INFO(0, type
)
2219 ZEND_ARG_INFO(0, query
)
2220 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2221 ZEND_END_ARG_INFO();
2222 static PHP_METHOD(pqconn
, prepareAsync
) {
2223 zend_error_handling zeh
;
2224 zval
*ztypes
= NULL
;
2225 char *name_str
, *query_str
;
2226 int name_len
, *query_len
;
2228 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2229 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "ss|a/!", &name_str
, &name_len
, &query_str
, &query_len
, &ztypes
)) {
2230 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2233 obj
->intern
->poller
= PQconsumeInput
;
2234 if (SUCCESS
== php_pqconn_prepare_async(getThis(), obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
)) {
2235 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2237 php_pq_object_addref(obj TSRMLS_CC
);
2239 stm
->name
= estrdup(name_str
);
2241 return_value
->type
= IS_OBJECT
;
2242 return_value
->value
.obj
= php_pqstm_create_object_ex(php_pqstm_class_entry
, stm
, NULL TSRMLS_CC
);
2244 php_pqconn_notify_listeners(obj TSRMLS_CC
);
2246 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2249 zend_restore_error_handling(&zeh TSRMLS_CC
);
2252 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote
, 0, 0, 1)
2253 ZEND_ARG_INFO(0, string
)
2254 ZEND_END_ARG_INFO();
2255 static PHP_METHOD(pqconn
, quote
) {
2259 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2260 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2263 char *quoted
= PQescapeLiteral(obj
->intern
->conn
, str
, len
);
2266 RETVAL_STRING(quoted
, 1);
2269 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote string (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2273 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2279 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_quote_name
, 0, 0, 1)
2280 ZEND_ARG_INFO(0, type
)
2281 ZEND_END_ARG_INFO();
2282 static PHP_METHOD(pqconn
, quoteName
) {
2286 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2287 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2290 char *quoted
= PQescapeIdentifier(obj
->intern
->conn
, str
, len
);
2293 RETVAL_STRING(quoted
, 1);
2296 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not quote name (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2300 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2306 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_escape_bytea
, 0, 0, 1)
2307 ZEND_ARG_INFO(0, bytea
)
2308 ZEND_END_ARG_INFO();
2309 static PHP_METHOD(pqconn
, escapeBytea
) {
2313 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2314 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2318 char *escaped_str
= (char *) PQescapeByteaConn(obj
->intern
->conn
, (unsigned char *) str
, len
, &escaped_len
);
2321 RETVAL_STRINGL(escaped_str
, escaped_len
- 1, 1);
2322 PQfreemem(escaped_str
);
2324 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not escape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2328 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2334 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_unescape_bytea
, 0, 0, 1)
2335 ZEND_ARG_INFO(0, bytea
)
2336 ZEND_END_ARG_INFO();
2337 static PHP_METHOD(pqconn
, unescapeBytea
) {
2341 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &str
, &len
)) {
2342 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2345 size_t unescaped_len
;
2346 char *unescaped_str
= (char *) PQunescapeBytea((unsigned char *)str
, &unescaped_len
);
2348 if (unescaped_str
) {
2349 RETVAL_STRINGL(unescaped_str
, unescaped_len
, 1);
2350 PQfreemem(unescaped_str
);
2352 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not unescape bytea (%s)", PHP_PQerrorMessage(obj
->intern
->conn
));
2356 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2362 static const char *isolation_level(long *isolation
) {
2363 switch (*isolation
) {
2364 case PHP_PQTXN_SERIALIZABLE
:
2365 return "SERIALIZABLE";
2366 case PHP_PQTXN_REPEATABLE_READ
:
2367 return "REPEATABLE READ";
2369 *isolation
= PHP_PQTXN_READ_COMMITTED
;
2371 case PHP_PQTXN_READ_COMMITTED
:
2372 return "READ COMMITTED";
2376 static STATUS
php_pqconn_start_transaction(zval
*zconn
, php_pqconn_object_t
*conn_obj
, long isolation
, zend_bool readonly
, zend_bool deferrable TSRMLS_DC
)
2379 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2382 if (conn_obj
->intern
) {
2386 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2387 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2389 res
= PQexec(conn_obj
->intern
->conn
, cmd
);
2394 STATUS rv
= php_pqres_success(res TSRMLS_CC
);
2399 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2403 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2408 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
)
2411 conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2414 if (conn_obj
->intern
->conn
) {
2417 spprintf(&cmd
, 0, "START TRANSACTION ISOLATION LEVEL %s, READ %s, %s DEFERRABLE",
2418 isolation_level(&isolation
), readonly
? "ONLY" : "WRITE", deferrable
? "": "NOT");
2420 if (PQsendQuery(conn_obj
->intern
->conn
, cmd
)) {
2421 conn_obj
->intern
->poller
= PQconsumeInput
;
2426 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not start transaction (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
2430 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2435 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction
, 0, 0, 0)
2436 ZEND_ARG_INFO(0, isolation
)
2437 ZEND_ARG_INFO(0, readonly
)
2438 ZEND_ARG_INFO(0, deferrable
)
2439 ZEND_END_ARG_INFO();
2440 static PHP_METHOD(pqconn
, startTransaction
) {
2441 zend_error_handling zeh
;
2442 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2443 zend_bool readonly
= 0, deferrable
= 0;
2445 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2446 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2448 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2450 rv
= php_pqconn_start_transaction(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2452 if (SUCCESS
== rv
) {
2453 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2455 php_pq_object_addref(obj TSRMLS_CC
);
2457 txn
->isolation
= isolation
;
2458 txn
->readonly
= readonly
;
2459 txn
->deferrable
= deferrable
;
2461 return_value
->type
= IS_OBJECT
;
2462 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2465 zend_restore_error_handling(&zeh TSRMLS_CC
);
2469 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_start_transaction_async
, 0, 0, 0)
2470 ZEND_ARG_INFO(0, isolation
)
2471 ZEND_ARG_INFO(0, readonly
)
2472 ZEND_ARG_INFO(0, deferrable
)
2473 ZEND_END_ARG_INFO();
2474 static PHP_METHOD(pqconn
, startTransactionAsync
) {
2475 zend_error_handling zeh
;
2476 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2477 zend_bool readonly
= 0, deferrable
= 0;
2479 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2480 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lbb", &isolation
, &readonly
, &deferrable
)) {
2482 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2484 rv
= php_pqconn_start_transaction_async(getThis(), obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2486 if (SUCCESS
== rv
) {
2487 php_pqtxn_t
*txn
= ecalloc(1, sizeof(*txn
));
2489 php_pq_object_addref(obj TSRMLS_CC
);
2491 txn
->isolation
= isolation
;
2492 txn
->readonly
= readonly
;
2493 txn
->deferrable
= deferrable
;
2495 return_value
->type
= IS_OBJECT
;
2496 return_value
->value
.obj
= php_pqtxn_create_object_ex(php_pqtxn_class_entry
, txn
, NULL TSRMLS_CC
);
2499 zend_restore_error_handling(&zeh TSRMLS_CC
);
2502 ZEND_BEGIN_ARG_INFO_EX(ai_pqconn_trace
, 0, 0, 0)
2503 ZEND_ARG_INFO(0, stdio_stream
)
2504 ZEND_END_ARG_INFO();
2505 static PHP_METHOD(pqconn
, trace
) {
2506 zval
*zstream
= NULL
;
2508 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|r!", &zstream
)) {
2509 php_pqconn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2513 php_stream
*stream
= NULL
;
2515 php_stream_from_zval(stream
, &zstream
);
2517 if (SUCCESS
== php_stream_cast(stream
, PHP_STREAM_AS_STDIO
, (void *) &fp
, REPORT_ERRORS
)) {
2518 stream
->flags
|= PHP_STREAM_FLAG_NO_CLOSE
;
2519 PQtrace(obj
->intern
->conn
, fp
);
2525 PQuntrace(obj
->intern
->conn
);
2529 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2535 static zend_function_entry php_pqconn_methods
[] = {
2536 PHP_ME(pqconn
, __construct
, ai_pqconn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2537 PHP_ME(pqconn
, reset
, ai_pqconn_reset
, ZEND_ACC_PUBLIC
)
2538 PHP_ME(pqconn
, resetAsync
, ai_pqconn_reset_async
, ZEND_ACC_PUBLIC
)
2539 PHP_ME(pqconn
, poll
, ai_pqconn_poll
, ZEND_ACC_PUBLIC
)
2540 PHP_ME(pqconn
, exec
, ai_pqconn_exec
, ZEND_ACC_PUBLIC
)
2541 PHP_ME(pqconn
, execAsync
, ai_pqconn_exec_async
, ZEND_ACC_PUBLIC
)
2542 PHP_ME(pqconn
, execParams
, ai_pqconn_exec_params
, ZEND_ACC_PUBLIC
)
2543 PHP_ME(pqconn
, execParamsAsync
, ai_pqconn_exec_params_async
, ZEND_ACC_PUBLIC
)
2544 PHP_ME(pqconn
, prepare
, ai_pqconn_prepare
, ZEND_ACC_PUBLIC
)
2545 PHP_ME(pqconn
, prepareAsync
, ai_pqconn_prepare_async
, ZEND_ACC_PUBLIC
)
2546 PHP_ME(pqconn
, listen
, ai_pqconn_listen
, ZEND_ACC_PUBLIC
)
2547 PHP_ME(pqconn
, notify
, ai_pqconn_notify
, ZEND_ACC_PUBLIC
)
2548 PHP_ME(pqconn
, getResult
, ai_pqconn_get_result
, ZEND_ACC_PUBLIC
)
2549 PHP_ME(pqconn
, quote
, ai_pqconn_quote
, ZEND_ACC_PUBLIC
)
2550 PHP_ME(pqconn
, quoteName
, ai_pqconn_quote_name
, ZEND_ACC_PUBLIC
)
2551 PHP_ME(pqconn
, escapeBytea
, ai_pqconn_escape_bytea
, ZEND_ACC_PUBLIC
)
2552 PHP_ME(pqconn
, unescapeBytea
, ai_pqconn_unescape_bytea
, ZEND_ACC_PUBLIC
)
2553 PHP_ME(pqconn
, startTransaction
, ai_pqconn_start_transaction
, ZEND_ACC_PUBLIC
)
2554 PHP_ME(pqconn
, startTransactionAsync
, ai_pqconn_start_transaction_async
, ZEND_ACC_PUBLIC
)
2555 PHP_ME(pqconn
, trace
, ai_pqconn_trace
, ZEND_ACC_PUBLIC
)
2559 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_construct
, 0, 0, 1)
2560 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
2561 ZEND_END_ARG_INFO();
2562 static PHP_METHOD(pqtypes
, __construct
) {
2563 zend_error_handling zeh
;
2566 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2567 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
2568 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2570 if (conn_obj
->intern
) {
2571 zval
*retval
= NULL
;
2572 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2574 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
2575 obj
->intern
->conn
= conn_obj
;
2576 php_pq_object_addref(conn_obj TSRMLS_CC
);
2577 zend_hash_init(&obj
->intern
->types
, 300, NULL
, ZVAL_PTR_DTOR
, 0);
2579 zend_call_method_with_0_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "refresh", &retval
);
2581 zval_ptr_dtor(&retval
);
2584 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2587 zend_restore_error_handling(&zeh TSRMLS_CC
);
2590 #define PHP_PQ_TYPES_QUERY \
2591 "select t.oid, t.* " \
2592 "from pg_type t join pg_namespace n on t.typnamespace=n.oid " \
2593 "where typisdefined " \
2595 "and nspname in ('public', 'pg_catalog')"
2597 ZEND_BEGIN_ARG_INFO_EX(ai_pqtypes_refresh
, 0, 0, 0)
2598 ZEND_END_ARG_INFO();
2599 static PHP_METHOD(pqtypes
, refresh
) {
2600 if (SUCCESS
== zend_parse_parameters_none()) {
2601 php_pqtypes_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2604 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, PHP_PQ_TYPES_QUERY
);
2606 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2609 if (PGRES_TUPLES_OK
== PQresultStatus(res
)) {
2612 for (r
= 0, rows
= PQntuples(res
); r
< rows
; ++r
) {
2613 zval
*row
= php_pqres_row_to_zval(res
, r
, PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
2614 long oid
= atol(PQgetvalue(res
, r
, 0 ));
2615 char *name
= PQgetvalue(res
, r
, 1);
2619 zend_hash_index_update(&obj
->intern
->types
, oid
, (void *) &row
, sizeof(zval
*), NULL
);
2620 zend_hash_add(&obj
->intern
->types
, name
, strlen(name
) + 1, (void *) &row
, sizeof(zval
*), NULL
);
2623 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types: %s", PQresultErrorMessage(res
));
2627 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not fetch types (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2631 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Types not initialized");
2636 static zend_function_entry php_pqtypes_methods
[] = {
2637 PHP_ME(pqtypes
, __construct
, ai_pqtypes_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2638 PHP_ME(pqtypes
, refresh
, ai_pqtypes_refresh
, ZEND_ACC_PUBLIC
)
2642 static zval
**php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type TSRMLS_DC
)
2645 php_pqres_fetch_t orig_fetch
;
2648 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2651 if (!obj
->intern
->iter
) {
2652 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
2653 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2655 orig_fetch
= obj
->intern
->iter
->fetch_type
;
2656 obj
->intern
->iter
->fetch_type
= fetch_type
;
2657 if (SUCCESS
== obj
->intern
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
)) {
2658 obj
->intern
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->intern
->iter
, &row TSRMLS_CC
);
2659 obj
->intern
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
2661 obj
->intern
->iter
->fetch_type
= orig_fetch
;
2663 return row
? row
: NULL
;
2666 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
2667 ZEND_ARG_INFO(0, fetch_type
)
2668 ZEND_END_ARG_INFO();
2669 static PHP_METHOD(pqres
, fetchRow
) {
2670 zend_error_handling zeh
;
2671 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2672 long fetch_type
= obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: PHP_PQRES_FETCH_ARRAY
;
2674 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2675 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
)) {
2676 zval
**row
= php_pqres_iteration(getThis(), obj
, fetch_type TSRMLS_CC
);
2679 RETVAL_ZVAL(*row
, 1, 0);
2684 zend_restore_error_handling(&zeh TSRMLS_CC
);
2687 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
2690 HashTable
*ht
= HASH_OF(row
);
2691 int count
= zend_hash_num_elements(ht
);
2694 zend_hash_internal_pointer_reset(ht
);
2696 zend_hash_move_forward(ht
);
2698 zend_hash_get_current_data(ht
, (void *) &data
);
2700 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d exceeds column count %d", col
, count
);
2705 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 0)
2706 ZEND_ARG_INFO(0, col_num
)
2707 ZEND_END_ARG_INFO();
2708 static PHP_METHOD(pqres
, fetchCol
) {
2709 zend_error_handling zeh
;
2712 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2713 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_col
)) {
2714 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2715 zval
**row
= php_pqres_iteration(getThis(), obj
, obj
->intern
->iter
? obj
->intern
->iter
->fetch_type
: 0 TSRMLS_CC
);
2718 zval
**col
= column_at(*row
, fetch_col TSRMLS_CC
);
2721 RETVAL_ZVAL(*col
, 1, 0);
2729 zend_restore_error_handling(&zeh TSRMLS_CC
);
2733 static zend_function_entry php_pqres_methods
[] = {
2734 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
2735 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
2739 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_construct
, 0, 0, 3)
2740 ZEND_ARG_OBJ_INFO(0, Connection
, pq
\\Connection
, 0)
2741 ZEND_ARG_INFO(0, type
)
2742 ZEND_ARG_INFO(0, query
)
2743 ZEND_ARG_ARRAY_INFO(0, types
, 1)
2744 ZEND_ARG_INFO(0, async
)
2745 ZEND_END_ARG_INFO();
2746 static PHP_METHOD(pqstm
, __construct
) {
2747 zend_error_handling zeh
;
2748 zval
*zconn
, *ztypes
= NULL
;
2749 char *name_str
, *query_str
;
2750 int name_len
, *query_len
;
2751 zend_bool async
= 0;
2753 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2754 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
)) {
2755 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2756 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2758 if (conn_obj
->intern
) {
2761 conn_obj
->intern
->poller
= PQconsumeInput
;
2762 rv
= php_pqconn_prepare_async(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
2764 rv
= php_pqconn_prepare(zconn
, conn_obj
, name_str
, query_str
, ztypes
? Z_ARRVAL_P(ztypes
) : NULL TSRMLS_CC
);
2765 php_pqconn_notify_listeners(conn_obj TSRMLS_CC
);
2768 if (SUCCESS
== rv
) {
2769 php_pqstm_t
*stm
= ecalloc(1, sizeof(*stm
));
2771 php_pq_object_addref(conn_obj TSRMLS_CC
);
2772 stm
->conn
= conn_obj
;
2773 stm
->name
= estrdup(name_str
);
2777 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2780 zend_restore_error_handling(&zeh TSRMLS_CC
);
2783 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec
, 0, 0, 0)
2784 ZEND_ARG_ARRAY_INFO(0, params
, 1)
2785 ZEND_END_ARG_INFO();
2786 static PHP_METHOD(pqstm
, exec
) {
2787 zend_error_handling zeh
;
2788 zval
*zparams
= NULL
;
2790 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2791 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &zparams
)) {
2792 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2795 if (obj
->intern
->conn
->intern
) {
2797 char **params
= NULL
;
2802 ZEND_INIT_SYMTABLE(&zdtor
);
2803 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2806 res
= PQexecPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0);
2812 zend_hash_destroy(&zdtor
);
2815 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2818 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2819 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
2822 return_value
->type
= IS_OBJECT
;
2823 return_value
->value
.obj
= php_pqres_create_object_ex(php_pqres_class_entry
, r
, NULL TSRMLS_CC
);
2826 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2829 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2832 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
2835 zend_restore_error_handling(&zeh TSRMLS_CC
);
2838 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_exec_async
, 0, 0, 0)
2839 ZEND_ARG_ARRAY_INFO(0, params
, 1)
2840 ZEND_ARG_INFO(0, callable
)
2841 ZEND_END_ARG_INFO();
2842 static PHP_METHOD(pqstm
, execAsync
) {
2843 zend_error_handling zeh
;
2844 zval
*zparams
= NULL
;
2845 php_pq_callback_t resolver
= {{0}};
2847 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2848 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!f", &zparams
, &resolver
.fci
, &resolver
.fcc
)) {
2849 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2852 if (obj
->intern
->conn
->intern
) {
2854 char **params
= NULL
;
2858 ZEND_INIT_SYMTABLE(&zdtor
);
2859 count
= php_pq_params_to_array(Z_ARRVAL_P(zparams
), ¶ms
, &zdtor TSRMLS_CC
);
2862 php_pq_callback_dtor(&obj
->intern
->conn
->intern
->onevent
);
2863 if (resolver
.fci
.size
> 0) {
2864 obj
->intern
->conn
->intern
->onevent
= resolver
;
2865 php_pq_callback_addref(&obj
->intern
->conn
->intern
->onevent
);
2868 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
2870 if (PQsendQueryPrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
, count
, (const char *const*) params
, NULL
, NULL
, 0)) {
2871 if (obj
->intern
->conn
->intern
->unbuffered
) {
2872 if (!PQsetSingleRowMode(obj
->intern
->conn
->intern
->conn
)) {
2873 php_error_docref(NULL TSRMLS_CC
, E_NOTICE
, "Could not enable unbuffered mode (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2878 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not execute statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2886 zend_hash_destroy(&zdtor
);
2889 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2892 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2896 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
2900 zend_restore_error_handling(&zeh TSRMLS_CC
);
2903 ZEND_BEGIN_ARG_INFO_EX(ai_pqstm_desc
, 0, 0, 0)
2904 ZEND_END_ARG_INFO();
2905 static PHP_METHOD(pqstm
, desc
) {
2906 zend_error_handling zeh
;
2908 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2909 if (SUCCESS
== zend_parse_parameters_none()) {
2910 php_pqstm_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2913 if (obj
->intern
->conn
->intern
) {
2914 PGresult
*res
= PQdescribePrepared(obj
->intern
->conn
->intern
->conn
, obj
->intern
->name
);
2916 php_pqconn_notify_listeners(obj
->intern
->conn TSRMLS_CC
);
2919 if (SUCCESS
== php_pqres_success(res TSRMLS_CC
)) {
2922 array_init(return_value
);
2923 for (p
= 0, params
= PQnparams(res
); p
< params
; ++p
) {
2924 add_next_index_long(return_value
, PQparamtype(res
, p
));
2928 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not describe statement (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
2931 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2934 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Statement not initialized");
2937 zend_restore_error_handling(&zeh TSRMLS_CC
);
2940 static zend_function_entry php_pqstm_methods
[] = {
2941 PHP_ME(pqstm
, __construct
, ai_pqstm_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
2942 PHP_ME(pqstm
, exec
, ai_pqstm_exec
, ZEND_ACC_PUBLIC
)
2943 PHP_ME(pqstm
, desc
, ai_pqstm_desc
, ZEND_ACC_PUBLIC
)
2944 PHP_ME(pqstm
, execAsync
, ai_pqstm_exec_async
, ZEND_ACC_PUBLIC
)
2948 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_construct
, 0, 0, 1)
2949 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
2950 ZEND_ARG_INFO(0, async
)
2951 ZEND_ARG_INFO(0, isolation
)
2952 ZEND_ARG_INFO(0, readonly
)
2953 ZEND_ARG_INFO(0, deferrable
)
2954 ZEND_END_ARG_INFO();
2955 static PHP_METHOD(pqtxn
, __construct
) {
2956 zend_error_handling zeh
;
2958 long isolation
= PHP_PQTXN_READ_COMMITTED
;
2959 zend_bool async
= 0, readonly
= 0, deferrable
= 0;
2961 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2962 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|blbb", &zconn
, php_pqconn_class_entry
, &async
, &isolation
, &readonly
, &deferrable
)) {
2964 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
2965 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
2967 if (conn_obj
->intern
) {
2969 rv
= php_pqconn_start_transaction_async(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2971 rv
= php_pqconn_start_transaction(zconn
, conn_obj
, isolation
, readonly
, deferrable TSRMLS_CC
);
2974 if (SUCCESS
== rv
) {
2975 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
2977 php_pq_object_addref(conn_obj TSRMLS_CC
);
2978 obj
->intern
->conn
= conn_obj
;
2979 obj
->intern
->isolation
= isolation
;
2980 obj
->intern
->readonly
= readonly
;
2981 obj
->intern
->deferrable
= deferrable
;
2984 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
2987 zend_restore_error_handling(&zeh TSRMLS_CC
);
2990 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit
, 0, 0, 0)
2991 ZEND_END_ARG_INFO();
2992 static PHP_METHOD(pqtxn
, commit
) {
2993 zend_error_handling zeh
;
2995 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
2996 if (SUCCESS
== zend_parse_parameters_none()) {
2997 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3001 if (obj
->intern
->conn
->intern
) {
3002 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, "COMMIT");
3005 php_pqres_success(res TSRMLS_CC
);
3008 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3011 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not intialized");
3014 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3017 zend_restore_error_handling(&zeh TSRMLS_CC
);
3020 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_commit_async
, 0, 0, 0)
3021 ZEND_END_ARG_INFO();
3022 static PHP_METHOD(pqtxn
, commitAsync
) {
3023 zend_error_handling zeh
;
3025 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3026 if (SUCCESS
== zend_parse_parameters_none()) {
3027 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3030 if (obj
->intern
->conn
->intern
) {
3031 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3033 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "COMMIT")) {
3034 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not commit transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3037 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not intialized");
3040 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3043 zend_restore_error_handling(&zeh TSRMLS_CC
);
3046 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback
, 0, 0, 0)
3047 ZEND_END_ARG_INFO();
3048 static PHP_METHOD(pqtxn
, rollback
) {
3049 zend_error_handling zeh
;
3051 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3052 if (SUCCESS
== zend_parse_parameters_none()) {
3053 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3056 if (obj
->intern
->conn
->intern
) {
3057 PGresult
*res
= PQexec(obj
->intern
->conn
->intern
->conn
, "ROLLBACK");
3060 php_pqres_success(res TSRMLS_CC
);
3063 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3066 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not intialized");
3069 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3072 zend_restore_error_handling(&zeh TSRMLS_CC
);
3075 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_rollback_async
, 0, 0, 0)
3076 ZEND_END_ARG_INFO();
3077 static PHP_METHOD(pqtxn
, rollbackAsync
) {
3078 zend_error_handling zeh
;
3080 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3081 if (SUCCESS
== zend_parse_parameters_none()) {
3082 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3085 if (obj
->intern
->conn
->intern
) {
3086 obj
->intern
->conn
->intern
->poller
= PQconsumeInput
;
3087 if (!PQsendQuery(obj
->intern
->conn
->intern
->conn
, "REOLLBACK")) {
3088 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not rollback transaction (%s)", PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3091 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not intialized");
3094 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3097 zend_restore_error_handling(&zeh TSRMLS_CC
);
3100 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_open_lob
, 0, 0, 1)
3101 ZEND_ARG_INFO(0, oid
)
3102 ZEND_ARG_INFO(0, mode
)
3103 ZEND_END_ARG_INFO();
3104 static PHP_METHOD(pqtxn
, openLOB
) {
3105 zend_error_handling zeh
;
3106 long mode
= INV_WRITE
|INV_READ
, loid
;
3108 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3109 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &loid
, &mode
)) {
3110 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3113 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3116 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3120 php_pq_object_addref(obj TSRMLS_CC
);
3123 return_value
->type
= IS_OBJECT
;
3124 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3126 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
3127 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3128 (mode
& INV_READ
? "r" :
3129 (mode
& INV_WRITE
? "w" : "-"))),
3130 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3134 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3137 zend_restore_error_handling(&zeh TSRMLS_CC
);
3140 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_create_lob
, 0, 0, 0)
3141 ZEND_ARG_INFO(0, mode
)
3142 ZEND_END_ARG_INFO();
3143 static PHP_METHOD(pqtxn
, createLOB
) {
3144 zend_error_handling zeh
;
3145 long mode
= INV_WRITE
|INV_READ
;
3147 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3148 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &mode
)) {
3149 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3152 Oid loid
= lo_creat(obj
->intern
->conn
->intern
->conn
, mode
);
3154 if (loid
!= InvalidOid
) {
3155 int lofd
= lo_open(obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3158 php_pqlob_t
*lob
= ecalloc(1, sizeof(*lob
));
3161 php_pq_object_addref(obj TSRMLS_CC
);
3164 return_value
->type
= IS_OBJECT
;
3165 return_value
->value
.obj
= php_pqlob_create_object_ex(php_pqlob_class_entry
, lob
, NULL TSRMLS_CC
);
3167 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s': %s",
3168 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3169 (mode
& INV_READ
? "r" :
3170 (mode
& INV_WRITE
? "w" : "-"))),
3171 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3175 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s': %s",
3176 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3177 (mode
& INV_READ
? "r" :
3178 (mode
& INV_WRITE
? "w" : "-"))),
3179 PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
)
3183 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3186 zend_restore_error_handling(&zeh TSRMLS_CC
);
3189 ZEND_BEGIN_ARG_INFO_EX(ai_pqtxn_unlink_lob
, 0, 0, 1)
3190 ZEND_ARG_INFO(0, oid
)
3191 ZEND_END_ARG_INFO();
3192 static PHP_METHOD(pqtxn
, unlinkLOB
) {
3195 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l", &loid
)) {
3196 php_pqtxn_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3199 if (1 == lo_unlink(obj
->intern
->conn
->intern
->conn
, loid
)) {
3202 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to unlink LOB (oid=%ld): %s", loid
, PHP_PQerrorMessage(obj
->intern
->conn
->intern
->conn
));
3206 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3212 static zend_function_entry php_pqtxn_methods
[] = {
3213 PHP_ME(pqtxn
, __construct
, ai_pqtxn_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3214 PHP_ME(pqtxn
, commit
, ai_pqtxn_commit
, ZEND_ACC_PUBLIC
)
3215 PHP_ME(pqtxn
, rollback
, ai_pqtxn_rollback
, ZEND_ACC_PUBLIC
)
3216 PHP_ME(pqtxn
, commitAsync
, ai_pqtxn_commit_async
, ZEND_ACC_PUBLIC
)
3217 PHP_ME(pqtxn
, rollbackAsync
, ai_pqtxn_rollback_async
, ZEND_ACC_PUBLIC
)
3218 PHP_ME(pqtxn
, openLOB
, ai_pqtxn_open_lob
, ZEND_ACC_PUBLIC
)
3219 PHP_ME(pqtxn
, createLOB
, ai_pqtxn_create_lob
, ZEND_ACC_PUBLIC
)
3220 PHP_ME(pqtxn
, unlinkLOB
, ai_pqtxn_unlink_lob
, ZEND_ACC_PUBLIC
)
3224 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_construct
, 0, 0, 1)
3225 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3226 ZEND_END_ARG_INFO();
3227 static PHP_METHOD(pqcancel
, __construct
) {
3228 zend_error_handling zeh
;
3231 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3232 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zconn
, php_pqconn_class_entry
)) {
3233 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3235 if (conn_obj
->intern
) {
3236 PGcancel
*cancel
= PQgetCancel(conn_obj
->intern
->conn
);
3239 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3241 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3242 obj
->intern
->cancel
= cancel
;
3243 php_pq_object_addref(conn_obj TSRMLS_CC
);
3244 obj
->intern
->conn
= conn_obj
;
3246 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not acquire cancel (%s)", PHP_PQerrorMessage(conn_obj
->intern
->conn
));
3249 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3252 zend_restore_error_handling(&zeh TSRMLS_CC
);
3255 ZEND_BEGIN_ARG_INFO_EX(ai_pqcancel_cancel
, 0, 0, 0)
3256 ZEND_END_ARG_INFO();
3257 static PHP_METHOD(pqcancel
, cancel
) {
3258 zend_error_handling zeh
;
3260 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3261 if (SUCCESS
== zend_parse_parameters_none()) {
3262 php_pqcancel_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3267 if (!PQcancel(obj
->intern
->cancel
, err
, sizeof(err
))) {
3268 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Could not request cancellation: %s", err
);
3271 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Cancel not initialized");
3274 zend_restore_error_handling(&zeh TSRMLS_CC
);
3277 static zend_function_entry php_pqcancel_methods
[] = {
3278 PHP_ME(pqcancel
, __construct
, ai_pqcancel_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3279 PHP_ME(pqcancel
, cancel
, ai_pqcancel_cancel
, ZEND_ACC_PUBLIC
)
3283 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
)
3287 if (SUCCESS
== zend_hash_find(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evhs
)) {
3289 add_next_index_zval(*evhs
, zevent
);
3296 add_next_index_zval(evh
, zevent
);
3297 zend_hash_add(&conn_obj
->intern
->eventhandlers
, type_str
, type_len
+ 1, (void *) &evh
, sizeof(zval
*), NULL
);
3301 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_construct
, 0, 0, 3)
3302 ZEND_ARG_OBJ_INFO(0, connection
, pq
\\Connection
, 0)
3303 ZEND_ARG_INFO(0, type
)
3304 ZEND_ARG_INFO(0, callable
)
3305 ZEND_END_ARG_INFO();
3306 static PHP_METHOD(pqevent
, __construct
) {
3307 zend_error_handling zeh
;
3311 php_pq_callback_t cb
;
3313 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3314 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "Osf", &zconn
, php_pqconn_class_entry
, &type_str
, &type_len
, &cb
.fci
, &cb
.fcc
)) {
3315 php_pqconn_object_t
*conn_obj
= zend_object_store_get_object(zconn TSRMLS_CC
);
3317 if (conn_obj
->intern
) {
3318 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3320 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3321 php_pq_callback_addref(&cb
);
3322 obj
->intern
->cb
= cb
;
3323 php_pq_object_addref(conn_obj TSRMLS_CC
);
3324 obj
->intern
->conn
= conn_obj
;
3325 obj
->intern
->type
= estrdup(type_str
);
3327 php_pqconn_add_eventhandler(zconn
, conn_obj
, type_str
, type_len
, getThis() TSRMLS_CC
);
3330 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Connection not initialized");
3333 zend_restore_error_handling(&zeh TSRMLS_CC
);
3336 ZEND_BEGIN_ARG_INFO_EX(ai_pqevent_trigger
, 0, 0, 1)
3337 ZEND_ARG_ARRAY_INFO(0, args
, 1)
3338 ZEND_END_ARG_INFO();
3339 static PHP_METHOD(pqevent
, trigger
) {
3342 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "a/", &args
)) {
3343 php_pqevent_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3348 if (SUCCESS
== zend_fcall_info_call(&obj
->intern
->cb
.fci
, &obj
->intern
->cb
.fcc
, &rv
, args TSRMLS_CC
)) {
3350 RETVAL_ZVAL(rv
, 0, 1);
3356 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Event not initialized");
3362 static zend_function_entry php_pqevent_methods
[] = {
3363 PHP_ME(pqevent
, __construct
, ai_pqevent_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3364 PHP_ME(pqevent
, trigger
, ai_pqevent_trigger
, ZEND_ACC_PUBLIC
)
3368 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_construct
, 0, 0, 1)
3369 ZEND_ARG_OBJ_INFO(0, transaction
, pq
\\Transaction
, 0)
3370 ZEND_ARG_INFO(0, oid
)
3371 ZEND_ARG_INFO(0, mode
)
3372 ZEND_END_ARG_INFO();
3373 static PHP_METHOD(pqlob
, __construct
) {
3374 zend_error_handling zeh
;
3376 long mode
= INV_WRITE
|INV_READ
, loid
= InvalidOid
;
3378 zend_replace_error_handling(EH_THROW
, NULL
, &zeh TSRMLS_CC
);
3379 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O|ll", &ztxn
, php_pqtxn_class_entry
, &loid
, &mode
)) {
3380 php_pqtxn_object_t
*txn_obj
= zend_object_store_get_object(ztxn TSRMLS_CC
);
3382 if (txn_obj
->intern
) {
3384 if (loid
== InvalidOid
) {
3385 loid
= lo_creat(txn_obj
->intern
->conn
->intern
->conn
, mode
);
3388 if (loid
!= InvalidOid
) {
3389 int lofd
= lo_open(txn_obj
->intern
->conn
->intern
->conn
, loid
, mode
);
3392 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3394 obj
->intern
= ecalloc(1, sizeof(*obj
->intern
));
3395 obj
->intern
->lofd
= lofd
;
3396 obj
->intern
->loid
= loid
;
3397 php_pq_object_addref(txn_obj TSRMLS_CC
);
3398 obj
->intern
->txn
= txn_obj
;
3400 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to open large object with mode '%s' (%s)",
3401 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3402 (mode
& INV_READ
? "r" :
3403 (mode
& INV_WRITE
? "w" : "-"))),
3404 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
3408 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to create large object with mode '%s' (%s)",
3409 (mode
& (INV_READ
|INV_WRITE
) ? "rw" :
3410 (mode
& INV_READ
? "r" :
3411 (mode
& INV_WRITE
? "w" : "-"))),
3412 PHP_PQerrorMessage(txn_obj
->intern
->conn
->intern
->conn
)
3416 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\Transaction not initialized");
3419 zend_restore_error_handling(&zeh TSRMLS_CC
);
3422 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_write
, 0, 0, 1)
3423 ZEND_ARG_INFO(0, data
)
3424 ZEND_END_ARG_INFO();
3425 static PHP_METHOD(pqlob
, write
) {
3429 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &data_str
, &data_len
)) {
3430 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3433 int written
= lo_write(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, data_str
, data_len
);
3436 RETVAL_LONG(written
);
3438 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to write to LOB, oid=%d (%s)", obj
->intern
->loid
,
3439 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3443 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3449 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_read
, 0, 0, 0)
3450 ZEND_ARG_INFO(0, length
)
3451 ZEND_ARG_INFO(1, read
)
3452 ZEND_END_ARG_INFO();
3453 static PHP_METHOD(pqlob
, read
) {
3454 long length
= 0x1000;
3457 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|lz!", &length
, &zread
)) {
3458 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3461 char *buffer
= emalloc(length
+ 1);
3462 int read
= lo_read(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, buffer
, length
);
3467 ZVAL_LONG(zread
, read
);
3469 buffer
[read
] = '\0';
3470 RETVAL_STRINGL(buffer
, read
, 0);
3473 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to read from LOB, oid=%d (%s)", obj
->intern
->loid
,
3474 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3479 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3485 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_seek
, 0, 0, 1)
3486 ZEND_ARG_INFO(0, offset
)
3487 ZEND_ARG_INFO(0, whence
)
3488 ZEND_END_ARG_INFO();
3489 static PHP_METHOD(pqlob
, seek
) {
3490 long offset
, whence
= SEEK_SET
;
3492 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "l|l", &offset
, &whence
)) {
3493 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3496 int position
= lo_lseek(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, offset
, whence
);
3498 if (position
>= 0) {
3499 RETVAL_LONG(position
);
3501 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to seek offset in LOB, oid=%d (%s)", obj
->intern
->loid
,
3502 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3506 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3512 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_tell
, 0, 0, 0)
3513 ZEND_END_ARG_INFO();
3514 static PHP_METHOD(pqlob
, tell
) {
3515 if (SUCCESS
== zend_parse_parameters_none()) {
3516 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3519 int position
= lo_tell(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
);
3521 if (position
>= 0) {
3522 RETVAL_LONG(position
);
3524 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to tell offset in LOB (oid=%d): %s", obj
->intern
->loid
,
3525 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3529 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3535 ZEND_BEGIN_ARG_INFO_EX(ai_pqlob_truncate
, 0, 0, 0)
3536 ZEND_ARG_INFO(0, length
)
3537 ZEND_END_ARG_INFO();
3538 static PHP_METHOD(pqlob
, truncate
) {
3541 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &length
)) {
3542 php_pqlob_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
3545 if (0 == lo_truncate(obj
->intern
->txn
->intern
->conn
->intern
->conn
, obj
->intern
->lofd
, length
)) {
3548 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to truncate LOB (oid=%d): %s", obj
->intern
->loid
,
3549 PHP_PQerrorMessage(obj
->intern
->txn
->intern
->conn
->intern
->conn
));
3553 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "pq\\LOB not initialized");
3559 static zend_function_entry php_pqlob_methods
[] = {
3560 PHP_ME(pqlob
, __construct
, ai_pqlob_construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
3561 PHP_ME(pqlob
, write
, ai_pqlob_write
, ZEND_ACC_PUBLIC
)
3562 PHP_ME(pqlob
, read
, ai_pqlob_read
, ZEND_ACC_PUBLIC
)
3563 PHP_ME(pqlob
, seek
, ai_pqlob_seek
, ZEND_ACC_PUBLIC
)
3564 PHP_ME(pqlob
, tell
, ai_pqlob_tell
, ZEND_ACC_PUBLIC
)
3565 PHP_ME(pqlob
, truncate
, ai_pqlob_truncate
, ZEND_ACC_PUBLIC
)
3569 /* {{{ PHP_MINIT_FUNCTION
3571 static PHP_MINIT_FUNCTION(pq
)
3573 zend_class_entry ce
= {0};
3574 php_pq_object_prophandler_t ph
= {0};
3576 INIT_NS_CLASS_ENTRY(ce
, "pq", "Connection", php_pqconn_methods
);
3577 php_pqconn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3578 php_pqconn_class_entry
->create_object
= php_pqconn_create_object
;
3580 memcpy(&php_pqconn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3581 php_pqconn_object_handlers
.read_property
= php_pq_object_read_prop
;
3582 php_pqconn_object_handlers
.write_property
= php_pq_object_write_prop
;
3583 php_pqconn_object_handlers
.clone_obj
= NULL
;
3584 php_pqconn_object_handlers
.get_property_ptr_ptr
= NULL
;
3585 php_pqconn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3587 zend_hash_init(&php_pqconn_object_prophandlers
, 13, NULL
, NULL
, 1);
3589 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("status"), CONNECTION_BAD
, ZEND_ACC_PUBLIC TSRMLS_CC
);
3590 ph
.read
= php_pqconn_object_read_status
;
3591 zend_hash_add(&php_pqconn_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
3593 zend_declare_property_long(php_pqconn_class_entry
, ZEND_STRL("transactionStatus"), PQTRANS_UNKNOWN
, ZEND_ACC_PUBLIC TSRMLS_CC
);
3594 ph
.read
= php_pqconn_object_read_transaction_status
;
3595 zend_hash_add(&php_pqconn_object_prophandlers
, "transactionStatus", sizeof("transactionStatus"), (void *) &ph
, sizeof(ph
), NULL
);
3597 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("socket"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3598 ph
.read
= NULL
; /* forward to std prophandler */
3599 zend_hash_add(&php_pqconn_object_prophandlers
, "socket", sizeof("socket"), (void *) &ph
, sizeof(ph
), NULL
);
3601 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3602 ph
.read
= php_pqconn_object_read_error_message
;
3603 zend_hash_add(&php_pqconn_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
3605 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("busy"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
3606 ph
.read
= php_pqconn_object_read_busy
;
3607 zend_hash_add(&php_pqconn_object_prophandlers
, "busy", sizeof("busy"), (void *) &ph
, sizeof(ph
), NULL
);
3609 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("encoding"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3610 ph
.read
= php_pqconn_object_read_encoding
;
3611 ph
.write
= php_pqconn_object_write_encoding
;
3612 zend_hash_add(&php_pqconn_object_prophandlers
, "encoding", sizeof("encoding"), (void *) &ph
, sizeof(ph
), NULL
);
3615 zend_declare_property_bool(php_pqconn_class_entry
, ZEND_STRL("unbuffered"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
3616 ph
.read
= php_pqconn_object_read_unbuffered
;
3617 ph
.write
= php_pqconn_object_write_unbuffered
;
3618 zend_hash_add(&php_pqconn_object_prophandlers
, "unbuffered", sizeof("unbuffered"), (void *) &ph
, sizeof(ph
), NULL
);
3621 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("db"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3622 ph
.read
= php_pqconn_object_read_db
;
3623 zend_hash_add(&php_pqconn_object_prophandlers
, "db", sizeof("db"), (void *) &ph
, sizeof(ph
), NULL
);
3625 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3626 ph
.read
= php_pqconn_object_read_user
;
3627 zend_hash_add(&php_pqconn_object_prophandlers
, "user", sizeof("user"), (void *) &ph
, sizeof(ph
), NULL
);
3629 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("pass"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3630 ph
.read
= php_pqconn_object_read_pass
;
3631 zend_hash_add(&php_pqconn_object_prophandlers
, "pass", sizeof("pass"), (void *) &ph
, sizeof(ph
), NULL
);
3633 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("host"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3634 ph
.read
= php_pqconn_object_read_host
;
3635 zend_hash_add(&php_pqconn_object_prophandlers
, "host", sizeof("host"), (void *) &ph
, sizeof(ph
), NULL
);
3637 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("port"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3638 ph
.read
= php_pqconn_object_read_port
;
3639 zend_hash_add(&php_pqconn_object_prophandlers
, "port", sizeof("port"), (void *) &ph
, sizeof(ph
), NULL
);
3641 zend_declare_property_null(php_pqconn_class_entry
, ZEND_STRL("options"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3642 ph
.read
= php_pqconn_object_read_options
;
3643 zend_hash_add(&php_pqconn_object_prophandlers
, "options", sizeof("options"), (void *) &ph
, sizeof(ph
), NULL
);
3645 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("OK"), CONNECTION_OK TSRMLS_CC
);
3646 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("BAD"), CONNECTION_BAD TSRMLS_CC
);
3647 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("STARTED"), CONNECTION_STARTED TSRMLS_CC
);
3648 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("MADE"), CONNECTION_MADE TSRMLS_CC
);
3649 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AWAITING_RESPONSE"), CONNECTION_AWAITING_RESPONSE TSRMLS_CC
);
3650 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("AUTH_OK"), CONNECTION_AUTH_OK TSRMLS_CC
);
3651 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SSL_STARTUP"), CONNECTION_SSL_STARTUP TSRMLS_CC
);
3652 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("SETENV"), CONNECTION_SETENV TSRMLS_CC
);
3654 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_IDLE"), PQTRANS_IDLE TSRMLS_CC
);
3655 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_ACTIVE"), PQTRANS_ACTIVE TSRMLS_CC
);
3656 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INTRANS"), PQTRANS_INTRANS TSRMLS_CC
);
3657 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_INERROR"), PQTRANS_INERROR TSRMLS_CC
);
3658 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("TRANS_UNKNOWN"), PQTRANS_UNKNOWN TSRMLS_CC
);
3660 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_FAILED"), PGRES_POLLING_FAILED TSRMLS_CC
);
3661 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_READING"), PGRES_POLLING_READING TSRMLS_CC
);
3662 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_WRITING"), PGRES_POLLING_WRITING TSRMLS_CC
);
3663 zend_declare_class_constant_long(php_pqconn_class_entry
, ZEND_STRL("POLLING_OK"), PGRES_POLLING_OK TSRMLS_CC
);
3665 memset(&ce
, 0, sizeof(ce
));
3666 INIT_NS_CLASS_ENTRY(ce
, "pq", "Types", php_pqtypes_methods
);
3667 php_pqtypes_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3668 php_pqtypes_class_entry
->create_object
= php_pqtypes_create_object
;
3670 memcpy(&php_pqtypes_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3671 php_pqtypes_object_handlers
.read_property
= php_pq_object_read_prop
;
3672 php_pqtypes_object_handlers
.write_property
= php_pq_object_write_prop
;
3673 php_pqtypes_object_handlers
.clone_obj
= NULL
;
3674 php_pqtypes_object_handlers
.get_property_ptr_ptr
= NULL
;
3675 php_pqtypes_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3676 php_pqtypes_object_handlers
.has_dimension
= php_pqtypes_object_has_dimension
;
3677 php_pqtypes_object_handlers
.read_dimension
= php_pqtypes_object_read_dimension
;
3678 php_pqtypes_object_handlers
.unset_dimension
= NULL
;
3679 php_pqtypes_object_handlers
.write_dimension
= NULL
;
3681 zend_hash_init(&php_pqtypes_object_prophandlers
, 1, NULL
, NULL
, 1);
3683 zend_declare_property_null(php_pqtypes_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3684 ph
.read
= php_pqtypes_object_read_connection
;
3685 zend_hash_add(&php_pqtypes_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
3687 memset(&ce
, 0, sizeof(ce
));
3688 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
3689 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3690 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
3691 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
3692 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
3693 zend_class_implements(php_pqres_class_entry TSRMLS_CC
, 1, zend_ce_traversable
);
3695 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3696 php_pqres_object_handlers
.read_property
= php_pq_object_read_prop
;
3697 php_pqres_object_handlers
.write_property
= php_pq_object_write_prop
;
3698 php_pqres_object_handlers
.clone_obj
= NULL
;
3699 php_pqres_object_handlers
.get_property_ptr_ptr
= NULL
;
3700 php_pqres_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3702 zend_hash_init(&php_pqres_object_prophandlers
, 6, NULL
, NULL
, 1);
3704 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3705 ph
.read
= php_pqres_object_read_status
;
3706 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
3708 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3709 ph
.read
= php_pqres_object_read_error_message
;
3710 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
3712 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
3713 ph
.read
= php_pqres_object_read_num_rows
;
3714 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
3716 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
3717 ph
.read
= php_pqres_object_read_num_cols
;
3718 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
3720 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
3721 ph
.read
= php_pqres_object_read_affected_rows
;
3722 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
3724 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
3725 ph
.read
= php_pqres_object_read_fetch_type
;
3726 ph
.write
= php_pqres_object_write_fetch_type
;
3727 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
3730 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
3731 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
3732 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
3733 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
3734 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
3735 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
3736 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
3737 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
3738 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
3739 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
3741 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
3742 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
3743 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
3745 memset(&ce
, 0, sizeof(ce
));
3746 INIT_NS_CLASS_ENTRY(ce
, "pq", "Statement", php_pqstm_methods
);
3747 php_pqstm_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3748 php_pqstm_class_entry
->create_object
= php_pqstm_create_object
;
3750 memcpy(&php_pqstm_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3751 php_pqstm_object_handlers
.read_property
= php_pq_object_read_prop
;
3752 php_pqstm_object_handlers
.write_property
= php_pq_object_write_prop
;
3753 php_pqstm_object_handlers
.clone_obj
= NULL
;
3754 php_pqstm_object_handlers
.get_property_ptr_ptr
= NULL
;
3755 php_pqstm_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3757 zend_hash_init(&php_pqstm_object_prophandlers
, 2, NULL
, NULL
, 1);
3759 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("name"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3760 ph
.read
= php_pqstm_object_read_name
;
3761 zend_hash_add(&php_pqstm_object_prophandlers
, "name", sizeof("name"), (void *) &ph
, sizeof(ph
), NULL
);
3763 zend_declare_property_null(php_pqstm_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3764 ph
.read
= php_pqstm_object_read_connection
;
3765 zend_hash_add(&php_pqstm_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
3767 memset(&ce
, 0, sizeof(ce
));
3768 INIT_NS_CLASS_ENTRY(ce
, "pq", "Transaction", php_pqtxn_methods
);
3769 php_pqtxn_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3770 php_pqtxn_class_entry
->create_object
= php_pqtxn_create_object
;
3772 memcpy(&php_pqtxn_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3773 php_pqtxn_object_handlers
.read_property
= php_pq_object_read_prop
;
3774 php_pqtxn_object_handlers
.write_property
= php_pq_object_write_prop
;
3775 php_pqtxn_object_handlers
.clone_obj
= NULL
;
3776 php_pqtxn_object_handlers
.get_property_ptr_ptr
= NULL
;
3777 php_pqtxn_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3779 zend_hash_init(&php_pqtxn_object_prophandlers
, 4, NULL
, NULL
, 1);
3781 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3782 ph
.read
= php_pqtxn_object_read_connection
;
3783 zend_hash_add(&php_pqtxn_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
3785 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("isolation"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3786 ph
.read
= php_pqtxn_object_read_isolation
;
3787 ph
.write
= php_pqtxn_object_write_isolation
;
3788 zend_hash_add(&php_pqtxn_object_prophandlers
, "isolation", sizeof("isolation"), (void *) &ph
, sizeof(ph
), NULL
);
3790 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("readonly"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3791 ph
.read
= php_pqtxn_object_read_readonly
;
3792 ph
.write
= php_pqtxn_object_write_readonly
;
3793 zend_hash_add(&php_pqtxn_object_prophandlers
, "readonly", sizeof("readonly"), (void *) &ph
, sizeof(ph
), NULL
);
3795 zend_declare_property_null(php_pqtxn_class_entry
, ZEND_STRL("deferrable"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3796 ph
.read
= php_pqtxn_object_read_deferrable
;
3797 ph
.write
= php_pqtxn_object_write_deferrable
;
3798 zend_hash_add(&php_pqtxn_object_prophandlers
, "deferrable", sizeof("deferrable"), (void *) &ph
, sizeof(ph
), NULL
);
3801 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("READ_COMMITTED"), PHP_PQTXN_READ_COMMITTED TSRMLS_CC
);
3802 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("REPEATABLE READ"), PHP_PQTXN_REPEATABLE_READ TSRMLS_CC
);
3803 zend_declare_class_constant_long(php_pqtxn_class_entry
, ZEND_STRL("SERIALIZABLE"), PHP_PQTXN_SERIALIZABLE TSRMLS_CC
);
3805 memset(&ce
, 0, sizeof(ce
));
3806 INIT_NS_CLASS_ENTRY(ce
, "pq", "Cancel", php_pqcancel_methods
);
3807 php_pqcancel_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3808 php_pqcancel_class_entry
->create_object
= php_pqcancel_create_object
;
3810 memcpy(&php_pqcancel_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3811 php_pqcancel_object_handlers
.read_property
= php_pq_object_read_prop
;
3812 php_pqcancel_object_handlers
.write_property
= php_pq_object_write_prop
;
3813 php_pqcancel_object_handlers
.clone_obj
= NULL
;
3814 php_pqcancel_object_handlers
.get_property_ptr_ptr
= NULL
;
3815 php_pqcancel_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3817 zend_hash_init(&php_pqcancel_object_prophandlers
, 1, NULL
, NULL
, 1);
3819 zend_declare_property_null(php_pqcancel_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3820 ph
.read
= php_pqcancel_object_read_connection
;
3821 zend_hash_add(&php_pqcancel_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
3823 memset(&ce
, 0, sizeof(ce
));
3824 INIT_NS_CLASS_ENTRY(ce
, "pq", "Event", php_pqevent_methods
);
3825 php_pqevent_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3826 php_pqevent_class_entry
->create_object
= php_pqevent_create_object
;
3828 memcpy(&php_pqevent_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3829 php_pqevent_object_handlers
.read_property
= php_pq_object_read_prop
;
3830 php_pqevent_object_handlers
.write_property
= php_pq_object_write_prop
;
3831 php_pqevent_object_handlers
.clone_obj
= NULL
;
3832 php_pqevent_object_handlers
.get_property_ptr_ptr
= NULL
;
3833 php_pqevent_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3835 zend_hash_init(&php_pqevent_object_prophandlers
, 2, NULL
, NULL
, 1);
3837 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("connection"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3838 ph
.read
= php_pqevent_object_read_connection
;
3839 zend_hash_add(&php_pqevent_object_prophandlers
, "connection", sizeof("connection"), (void *) &ph
, sizeof(ph
), NULL
);
3841 zend_declare_property_null(php_pqevent_class_entry
, ZEND_STRL("type"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3842 ph
.read
= php_pqevent_object_read_type
;
3843 zend_hash_add(&php_pqevent_object_prophandlers
, "type", sizeof("type"), (void *) &ph
, sizeof(ph
), NULL
);
3845 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("NOTICE"), ZEND_STRL("notice") TSRMLS_CC
);
3846 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESULT"), ZEND_STRL("result") TSRMLS_CC
);
3847 zend_declare_class_constant_stringl(php_pqevent_class_entry
, ZEND_STRL("RESET"), ZEND_STRL("reset") TSRMLS_CC
);
3849 memset(&ce
, 0, sizeof(ce
));
3850 INIT_NS_CLASS_ENTRY(ce
, "pq", "LOB", php_pqlob_methods
);
3851 php_pqlob_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
3852 php_pqlob_class_entry
->create_object
= php_pqlob_create_object
;
3854 memcpy(&php_pqlob_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
3855 php_pqlob_object_handlers
.read_property
= php_pq_object_read_prop
;
3856 php_pqlob_object_handlers
.write_property
= php_pq_object_write_prop
;
3857 php_pqlob_object_handlers
.clone_obj
= NULL
;
3858 php_pqlob_object_handlers
.get_property_ptr_ptr
= NULL
;
3859 php_pqlob_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
3861 zend_hash_init(&php_pqlob_object_prophandlers
, 2, NULL
, NULL
, 1);
3863 zend_declare_property_null(php_pqlob_class_entry
, ZEND_STRL("transaction"), ZEND_ACC_PUBLIC TSRMLS_CC
);
3864 ph
.read
= php_pqlob_object_read_transaction
;
3865 zend_hash_add(&php_pqlob_object_prophandlers
, "transaction", sizeof("transaction"), (void *) &ph
, sizeof(ph
), NULL
);
3867 zend_declare_property_long(php_pqlob_class_entry
, ZEND_STRL("oid"), InvalidOid
, ZEND_ACC_PUBLIC TSRMLS_CC
);
3868 ph
.read
= php_pqlob_object_read_oid
;
3869 zend_hash_add(&php_pqlob_object_prophandlers
, "oid", sizeof("oid"), (void *) &ph
, sizeof(ph
), NULL
);
3871 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("INVALID_OID"), InvalidOid TSRMLS_CC
);
3872 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("R"), INV_READ TSRMLS_CC
);
3873 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("W"), INV_WRITE TSRMLS_CC
);
3874 zend_declare_class_constant_long(php_pqlob_class_entry
, ZEND_STRL("RW"), INV_READ
|INV_WRITE TSRMLS_CC
);
3877 REGISTER_INI_ENTRIES();
3883 /* {{{ PHP_MSHUTDOWN_FUNCTION
3885 static PHP_MSHUTDOWN_FUNCTION(pq
)
3887 /* uncomment this line if you have INI entries
3888 UNREGISTER_INI_ENTRIES();
3894 /* {{{ PHP_MINFO_FUNCTION
3896 static PHP_MINFO_FUNCTION(pq
)
3898 php_info_print_table_start();
3899 php_info_print_table_header(2, "pq support", "enabled");
3900 php_info_print_table_end();
3902 /* Remove comments if you have entries in php.ini
3903 DISPLAY_INI_ENTRIES();
3908 const zend_function_entry pq_functions
[] = {
3912 /* {{{ pq_module_entry
3914 zend_module_entry pq_module_entry
= {
3915 STANDARD_MODULE_HEADER
,
3920 NULL
,/*PHP_RINIT(pq),*/
3921 NULL
,/*PHP_RSHUTDOWN(pq),*/
3924 STANDARD_MODULE_PROPERTIES
3928 #ifdef COMPILE_DL_PQ
3938 * vim600: noet sw=4 ts=4 fdm=marker
3939 * vim<600: noet sw=4 ts=4