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 +--------------------------------------------------------------------+
19 #include <ext/spl/spl_iterators.h>
20 #if PHP_PQ_HAVE_PHP_JSON_H
21 #include <php_json.h> /* we've added the include directory to INCLUDES */
24 #include <libpq-events.h>
27 #include "php_pq_misc.h"
28 #include "php_pq_object.h"
29 #include "php_pqexc.h"
30 #include "php_pqres.h"
32 #include "php_pq_type.h"
34 zend_class_entry
*php_pqres_class_entry
;
35 static zend_object_handlers php_pqres_object_handlers
;
36 static HashTable php_pqres_object_prophandlers
;
37 static zend_object_iterator_funcs php_pqres_iterator_funcs
;
39 static zend_object_iterator
*php_pqres_iterator_init(zend_class_entry
*ce
, zval
*object
, int by_ref TSRMLS_DC
)
41 php_pqres_iterator_t
*iter
;
42 zval
*prop
, *zfetch_type
;
44 iter
= ecalloc(1, sizeof(*iter
));
45 iter
->zi
.funcs
= &php_pqres_iterator_funcs
;
46 iter
->zi
.data
= zend_object_store_get_object(object TSRMLS_CC
);
47 zend_objects_store_add_ref(object TSRMLS_CC
);
49 zfetch_type
= prop
= zend_read_property(ce
, object
, ZEND_STRL("fetchType"), 0 TSRMLS_CC
);
50 if (Z_TYPE_P(zfetch_type
) != IS_LONG
) {
51 convert_to_long_ex(&zfetch_type
);
53 iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
54 if (zfetch_type
!= prop
) {
55 zval_ptr_dtor(&zfetch_type
);
57 if (Z_REFCOUNT_P(prop
)) {
64 return (zend_object_iterator
*) iter
;
67 static void php_pqres_iterator_dtor(zend_object_iterator
*i TSRMLS_DC
)
69 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
70 php_pqres_object_t
*obj
= i
->data
;
72 if (iter
->current_val
) {
73 zval_ptr_dtor(&iter
->current_val
);
74 iter
->current_val
= NULL
;
76 zend_objects_store_del_ref_by_handle_ex(obj
->zv
.handle
, obj
->zv
.handlers TSRMLS_CC
);
80 static ZEND_RESULT_CODE
php_pqres_iterator_valid(zend_object_iterator
*i TSRMLS_DC
)
82 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
83 php_pqres_object_t
*obj
= i
->data
;
85 switch (PQresultStatus(obj
->intern
->res
)) {
87 #ifdef HAVE_PGRES_SINGLE_TUPLE
88 case PGRES_SINGLE_TUPLE
:
90 if (PQntuples(obj
->intern
->res
) <= iter
->index
) {
101 #define PHP_PQRES_JSON_OPTIONS(res) \
102 (php_pqres_fetch_type(res) != PHP_PQRES_FETCH_OBJECT ? PHP_JSON_OBJECT_AS_ARRAY:0)
104 zval
*php_pqres_typed_zval(php_pqres_t
*res
, char *val
, size_t len
, Oid typ TSRMLS_DC
)
110 if (SUCCESS
== zend_hash_index_find(&res
->converters
, typ
, (void *) &zconv
)) {
111 zval
*ztype
, *tmp
= NULL
;
113 MAKE_STD_ZVAL(ztype
);
114 ZVAL_LONG(ztype
, typ
);
115 ZVAL_STRINGL(zv
, val
, len
, 1);
116 zend_call_method_with_2_params(zconv
, NULL
, NULL
, "convertfromstring", &tmp
, zv
, ztype
);
117 zval_ptr_dtor(&ztype
);
128 case PHP_PQ_OID_BOOL
:
129 if (!(res
->auto_convert
& PHP_PQRES_CONV_BOOL
)) {
132 ZVAL_BOOL(zv
, *val
== 't');
135 case PHP_PQ_OID_INT8
:
137 case PHP_PQ_OID_INT4
:
138 case PHP_PQ_OID_INT2
:
141 if (!(res
->auto_convert
& PHP_PQRES_CONV_INT
)) {
148 switch (is_numeric_string(val
, len
, &lval
, &dval
, 0)) {
153 ZVAL_DOUBLE(zv
, dval
);
161 case PHP_PQ_OID_FLOAT4
:
162 case PHP_PQ_OID_FLOAT8
:
163 if (!(res
->auto_convert
& PHP_PQRES_CONV_FLOAT
)) {
166 ZVAL_DOUBLE(zv
, zend_strtod(val
, NULL
));
169 case PHP_PQ_OID_DATE
:
170 if (!(res
->auto_convert
& PHP_PQRES_CONV_DATETIME
)) {
173 php_pqdt_from_string(zv
, NULL
, val
, len
, "Y-m-d", NULL TSRMLS_CC
);
176 case PHP_PQ_OID_ABSTIME
:
177 if (!(res
->auto_convert
& PHP_PQRES_CONV_DATETIME
)) {
180 php_pqdt_from_string(zv
, NULL
, val
, len
, "Y-m-d H:i:s", NULL TSRMLS_CC
);
183 case PHP_PQ_OID_TIMESTAMP
:
184 if (!(res
->auto_convert
& PHP_PQRES_CONV_DATETIME
)) {
187 php_pqdt_from_string(zv
, NULL
, val
, len
, "Y-m-d H:i:s.u", NULL TSRMLS_CC
);
190 case PHP_PQ_OID_TIMESTAMPTZ
:
191 if (!(res
->auto_convert
& PHP_PQRES_CONV_DATETIME
)) {
194 php_pqdt_from_string(zv
, NULL
, val
, len
, "Y-m-d H:i:s.uO", NULL TSRMLS_CC
);
197 #if PHP_PQ_HAVE_PHP_JSON_H && defined(PHP_PQ_OID_JSON)
198 # ifdef PHP_PQ_OID_JSONB
199 case PHP_PQ_OID_JSONB
:
201 case PHP_PQ_OID_JSON
:
202 if (!(res
->auto_convert
& PHP_PQRES_CONV_JSON
)) {
205 php_json_decode_ex(zv
, val
, len
, PHP_PQRES_JSON_OPTIONS(res
), 512 /* PHP_JSON_DEFAULT_DEPTH */ TSRMLS_CC
);
210 if (!(res
->auto_convert
& PHP_PQRES_CONV_ARRAY
)) {
213 if (PHP_PQ_TYPE_IS_ARRAY(typ
) && (Z_ARRVAL_P(zv
) = php_pq_parse_array(res
, val
, len
, PHP_PQ_TYPE_OF_ARRAY(typ
) TSRMLS_CC
))) {
214 Z_TYPE_P(zv
) = IS_ARRAY
;
217 ZVAL_STRINGL(zv
, val
, len
, 1);
225 static inline zval
*php_pqres_get_col(php_pqres_t
*r
, unsigned row
, unsigned col TSRMLS_DC
)
229 if (PQgetisnull(r
->res
, row
, col
)) {
233 zv
= php_pqres_typed_zval(r
, PQgetvalue(r
->res
, row
, col
), PQgetlength(r
->res
, row
, col
), PQftype(r
->res
, col
) TSRMLS_CC
);
239 static inline void php_pqres_add_col_to_zval(php_pqres_t
*r
, unsigned row
, unsigned col
, php_pqres_fetch_t fetch_type
, zval
*data TSRMLS_DC
)
241 if (PQgetisnull(r
->res
, row
, col
)) {
242 switch (fetch_type
) {
243 case PHP_PQRES_FETCH_OBJECT
:
244 add_property_null(data
, PQfname(r
->res
, col
));
247 case PHP_PQRES_FETCH_ASSOC
:
248 add_assoc_null(data
, PQfname(r
->res
, col
));
251 case PHP_PQRES_FETCH_ARRAY
:
252 add_index_null(data
, col
);
258 zv
= php_pqres_typed_zval(r
, PQgetvalue(r
->res
, row
, col
), PQgetlength(r
->res
, row
, col
), PQftype(r
->res
, col
) TSRMLS_CC
);
260 switch (fetch_type
) {
261 case PHP_PQRES_FETCH_OBJECT
:
262 add_property_zval(data
, PQfname(r
->res
, col
), zv
);
266 case PHP_PQRES_FETCH_ASSOC
:
267 add_assoc_zval(data
, PQfname(r
->res
, col
), zv
);
270 case PHP_PQRES_FETCH_ARRAY
:
271 add_index_zval(data
, col
, zv
);
277 zval
*php_pqres_row_to_zval(PGresult
*res
, unsigned row
, php_pqres_fetch_t fetch_type
, zval
**data_ptr TSRMLS_DC
)
281 php_pqres_object_t
*res_obj
= PQresultInstanceData(res
, php_pqconn_event
);
288 if (PHP_PQRES_FETCH_OBJECT
== fetch_type
) {
298 if (PQntuples(res
) > row
) {
299 for (c
= 0, cols
= PQnfields(res
); c
< cols
; ++c
) {
300 php_pqres_add_col_to_zval(res_obj
->intern
, row
, c
, fetch_type
, data TSRMLS_CC
);
307 static void php_pqres_iterator_current(zend_object_iterator
*i
, zval
***data_ptr TSRMLS_DC
)
309 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
310 php_pqres_object_t
*obj
= i
->data
;
312 if (!iter
->current_val
) {
313 iter
->current_val
= php_pqres_row_to_zval(obj
->intern
->res
, iter
->index
, iter
->fetch_type
, NULL TSRMLS_CC
);
315 *data_ptr
= &iter
->current_val
;
318 #if PHP_VERSION_ID >= 50500
319 static void php_pqres_iterator_key(zend_object_iterator
*i
, zval
*key TSRMLS_DC
)
321 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
323 ZVAL_LONG(key
, iter
->index
);
326 static int php_pqres_iterator_key(zend_object_iterator
*i
, char **key_str
, uint
*key_len
, ulong
*key_num TSRMLS_DC
)
328 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
330 *key_num
= (ulong
) iter
->index
;
332 return HASH_KEY_IS_LONG
;
336 static void php_pqres_iterator_invalidate(zend_object_iterator
*i TSRMLS_DC
)
338 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
340 if (iter
->current_val
) {
341 zval_ptr_dtor(&iter
->current_val
);
342 iter
->current_val
= NULL
;
346 static void php_pqres_iterator_next(zend_object_iterator
*i TSRMLS_DC
)
348 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
350 php_pqres_iterator_invalidate(i TSRMLS_CC
);
354 static void php_pqres_iterator_rewind(zend_object_iterator
*i TSRMLS_DC
)
356 php_pqres_iterator_t
*iter
= (php_pqres_iterator_t
*) i
;
358 php_pqres_iterator_invalidate(i TSRMLS_CC
);
362 static zend_object_iterator_funcs php_pqres_iterator_funcs
= {
363 php_pqres_iterator_dtor
,
364 /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
365 php_pqres_iterator_valid
,
366 /* fetch the item data for the current element */
367 php_pqres_iterator_current
,
368 /* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) (optional, may be NULL) */
369 php_pqres_iterator_key
,
370 /* step forwards to next element */
371 php_pqres_iterator_next
,
372 /* rewind to start of data (optional, may be NULL) */
373 php_pqres_iterator_rewind
,
374 /* invalidate current value/key (optional, may be NULL) */
375 php_pqres_iterator_invalidate
378 static int php_pqres_count_elements(zval
*object
, long *count TSRMLS_DC
)
380 php_pqres_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
385 *count
= (long) PQntuples(obj
->intern
->res
);
390 ZEND_RESULT_CODE
php_pqres_success(PGresult
*res TSRMLS_DC
)
394 switch (PQresultStatus(res
)) {
395 case PGRES_BAD_RESPONSE
:
396 case PGRES_NONFATAL_ERROR
:
397 case PGRES_FATAL_ERROR
:
398 zexc
= throw_exce(EX_SQL TSRMLS_CC
, "%s", PHP_PQresultErrorMessage(res
));
399 zend_update_property_string(Z_OBJCE_P(zexc
), zexc
, ZEND_STRL("sqlstate"), PQresultErrorField(res
, PG_DIAG_SQLSTATE
) TSRMLS_CC
);
406 void php_pqres_init_instance_data(PGresult
*res
, php_pqconn_object_t
*conn_obj
, php_pqres_object_t
**ptr TSRMLS_DC
)
408 php_pqres_object_t
*obj
;
409 php_pqres_t
*r
= ecalloc(1, sizeof(*r
));
412 zend_hash_init(&r
->bound
, 0, 0, ZVAL_PTR_DTOR
, 0);
413 zend_hash_init(&r
->converters
, 0, 0, ZVAL_PTR_DTOR
, 0);
414 zend_hash_copy(&r
->converters
, &conn_obj
->intern
->converters
, (copy_ctor_func_t
) zval_add_ref
, NULL
, sizeof(zval
*));
416 r
->auto_convert
= conn_obj
->intern
->default_auto_convert
;
417 r
->default_fetch_type
= conn_obj
->intern
->default_fetch_type
;
419 php_pqres_create_object_ex(php_pqres_class_entry
, r
, &obj TSRMLS_CC
);
420 PQresultSetInstanceData(res
, php_pqconn_event
, obj
);
427 php_pqres_fetch_t
php_pqres_fetch_type(php_pqres_t
*res
)
429 return res
->iter
? res
->iter
->fetch_type
: res
->default_fetch_type
;
432 static void php_pqres_object_free(void *o TSRMLS_DC
)
434 php_pqres_object_t
*obj
= o
;
436 fprintf(stderr
, "FREE res(#%d) %p\n", obj
->zv
.handle
, obj
);
439 if (obj
->intern
->res
) {
440 PQresultSetInstanceData(obj
->intern
->res
, php_pqconn_event
, NULL
);
441 PQclear(obj
->intern
->res
);
442 obj
->intern
->res
= NULL
;
445 if (obj
->intern
->iter
) {
446 php_pqres_iterator_dtor((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
447 obj
->intern
->iter
= NULL
;
450 zend_hash_destroy(&obj
->intern
->bound
);
451 zend_hash_destroy(&obj
->intern
->converters
);
456 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
460 zend_object_value
php_pqres_create_object_ex(zend_class_entry
*ce
, php_pqres_t
*intern
, php_pqres_object_t
**ptr TSRMLS_DC
)
462 php_pqres_object_t
*o
;
464 o
= ecalloc(1, sizeof(*o
));
465 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
466 object_properties_init((zend_object
*) o
, ce
);
467 o
->prophandler
= &php_pqres_object_prophandlers
;
477 o
->zv
.handle
= zend_objects_store_put((zend_object
*) o
, NULL
, php_pqres_object_free
, NULL TSRMLS_CC
);
478 o
->zv
.handlers
= &php_pqres_object_handlers
;
483 static zend_object_value
php_pqres_create_object(zend_class_entry
*class_type TSRMLS_DC
)
485 return php_pqres_create_object_ex(class_type
, NULL
, NULL TSRMLS_CC
);
488 static void php_pqres_object_read_status(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
490 php_pqres_object_t
*obj
= o
;
492 RETVAL_LONG(PQresultStatus(obj
->intern
->res
));
495 static void php_pqres_object_read_status_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
497 php_pqres_object_t
*obj
= o
;
499 RETVAL_STRING(PQresStatus(PQresultStatus(obj
->intern
->res
))+sizeof("PGRES"), 1);
502 static void php_pqres_object_read_error_message(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
504 php_pqres_object_t
*obj
= o
;
505 char *error
= PHP_PQresultErrorMessage(obj
->intern
->res
);
508 RETVAL_STRING(error
, 1);
514 static void php_pqres_object_read_diag(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
516 php_pqres_object_t
*obj
= o
;
520 const char *const name
;
522 #ifdef PG_DIAG_SEVERITY
523 {PG_DIAG_SEVERITY
, "severity"},
525 #ifdef PG_DIAG_SQLSTATE
526 {PG_DIAG_SQLSTATE
, "sqlstate"},
528 #ifdef PG_DIAG_MESSAGE_PRIMARY
529 {PG_DIAG_MESSAGE_PRIMARY
, "message_primary"},
531 #ifdef PG_DIAG_MESSAGE_DETAIL
532 {PG_DIAG_MESSAGE_DETAIL
, "message_detail"},
534 #ifdef PG_DIAG_MESSAGE_HINT
535 {PG_DIAG_MESSAGE_HINT
, "message_hint"},
537 #ifdef PG_DIAG_STATEMENT_POSITION
538 {PG_DIAG_STATEMENT_POSITION
,"statement_position"},
540 #ifdef PG_DIAG_INTERNAL_POSITION
541 {PG_DIAG_INTERNAL_POSITION
, "internal_position"},
543 #ifdef PG_DIAG_INTERNAL_QUERY
544 {PG_DIAG_INTERNAL_QUERY
, "internal_query"},
546 #ifdef PG_DIAG_CONTEXT
547 {PG_DIAG_CONTEXT
, "context"},
549 #ifdef PG_DIAG_SCHEMA_NAME
550 {PG_DIAG_SCHEMA_NAME
, "schema_name"},
552 #ifdef PG_DIAG_TABLE_NAME
553 {PG_DIAG_TABLE_NAME
, "table_name"},
555 #ifdef PG_DIAG_COLUMN_NAME
556 {PG_DIAG_COLUMN_NAME
, "column_name"},
558 #ifdef PG_DIAG_DATATYPE_NAME
559 {PG_DIAG_DATATYPE_NAME
, "datatype_name"},
561 #ifdef PG_DIAG_CONSTRAINT_NAME
562 {PG_DIAG_CONSTRAINT_NAME
, "constraint_name"},
564 #ifdef PG_DIAG_SOURCE_FILE
565 {PG_DIAG_SOURCE_FILE
, "source_file"},
567 #ifdef PG_DIAG_SOURCE_LINE
568 {PG_DIAG_SOURCE_LINE
, "source_line"},
570 #ifdef PG_DIAG_SOURCE_FUNCTION
571 {PG_DIAG_SOURCE_FUNCTION
, "source_function"},
575 array_init_size(return_value
, 32);
576 for (i
= 0; i
< sizeof(diag
)/sizeof(diag
[0]); ++i
) {
577 char *value
= PQresultErrorField(obj
->intern
->res
, diag
[i
].code
);
580 add_assoc_string(return_value
, diag
[i
].name
, value
, 1);
582 add_assoc_null(return_value
, diag
[i
].name
);
587 static void php_pqres_object_read_num_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
589 php_pqres_object_t
*obj
= o
;
591 RETVAL_LONG(PQntuples(obj
->intern
->res
));
594 static void php_pqres_object_read_num_cols(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
596 php_pqres_object_t
*obj
= o
;
598 RETVAL_LONG(PQnfields(obj
->intern
->res
));
601 static void php_pqres_object_read_affected_rows(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
603 php_pqres_object_t
*obj
= o
;
605 RETVAL_LONG(atoi(PQcmdTuples(obj
->intern
->res
)));
608 static void php_pqres_object_read_fetch_type(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
610 php_pqres_object_t
*obj
= o
;
612 RETVAL_LONG(php_pqres_fetch_type(obj
->intern
));
615 static void php_pqres_object_write_fetch_type(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
617 php_pqres_object_t
*obj
= o
;
618 zval
*zfetch_type
= value
;
620 if (Z_TYPE_P(value
) != IS_LONG
) {
621 if (Z_REFCOUNT_P(value
) > 1) {
624 ZVAL_ZVAL(tmp
, zfetch_type
, 1, 0);
625 convert_to_long(tmp
);
628 convert_to_long_ex(&zfetch_type
);
632 if (!obj
->intern
->iter
) {
633 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(object
), object
, 0 TSRMLS_CC
);
634 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
636 obj
->intern
->iter
->fetch_type
= Z_LVAL_P(zfetch_type
);
638 if (zfetch_type
!= value
) {
639 zval_ptr_dtor(&zfetch_type
);
643 static void php_pqres_object_read_auto_conv(zval
*object
, void *o
, zval
*return_value TSRMLS_DC
)
645 php_pqres_object_t
*obj
= o
;
647 RETVAL_LONG(obj
->intern
->auto_convert
);
650 static void php_pqres_object_write_auto_conv(zval
*object
, void *o
, zval
*value TSRMLS_DC
)
652 php_pqres_object_t
*obj
= o
;
653 zval
*zauto_conv
= value
;
655 if (Z_TYPE_P(value
) != IS_LONG
) {
656 if (Z_REFCOUNT_P(value
) > 1) {
659 ZVAL_ZVAL(tmp
, zauto_conv
, 1, 0);
660 convert_to_long(tmp
);
663 convert_to_long_ex(&zauto_conv
);
667 obj
->intern
->auto_convert
= Z_LVAL_P(zauto_conv
);
669 if (zauto_conv
!= value
) {
670 zval_ptr_dtor(&zauto_conv
);
674 static ZEND_RESULT_CODE
php_pqres_iteration(zval
*this_ptr
, php_pqres_object_t
*obj
, php_pqres_fetch_t fetch_type
, zval
***row TSRMLS_DC
)
677 php_pqres_fetch_t orig_fetch
;
680 obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
683 if (obj
->intern
->iter
) {
684 obj
->intern
->iter
->zi
.funcs
->move_forward((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
686 obj
->intern
->iter
= (php_pqres_iterator_t
*) php_pqres_iterator_init(Z_OBJCE_P(getThis()), getThis(), 0 TSRMLS_CC
);
687 obj
->intern
->iter
->zi
.funcs
->rewind((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
);
689 orig_fetch
= obj
->intern
->iter
->fetch_type
;
690 obj
->intern
->iter
->fetch_type
= fetch_type
;
691 if (SUCCESS
== (rv
= obj
->intern
->iter
->zi
.funcs
->valid((zend_object_iterator
*) obj
->intern
->iter TSRMLS_CC
))) {
692 obj
->intern
->iter
->zi
.funcs
->get_current_data((zend_object_iterator
*) obj
->intern
->iter
, row TSRMLS_CC
);
694 obj
->intern
->iter
->fetch_type
= orig_fetch
;
699 typedef struct php_pqres_col
{
704 static ZEND_RESULT_CODE
column_nn(php_pqres_object_t
*obj
, zval
*zcol
, php_pqres_col_t
*col TSRMLS_DC
)
712 switch (Z_TYPE_P(zcol
)) {
718 index
= Z_LVAL_P(zcol
);
722 convert_to_string(zcol
);
726 if (!is_numeric_string(Z_STRVAL_P(zcol
), Z_STRLEN_P(zcol
), &index
, NULL
, 0)) {
727 name
= Z_STRVAL_P(zcol
);
735 col
->num
= PQfnumber(obj
->intern
->res
, name
);
737 col
->name
= PQfname(obj
->intern
->res
, index
);
742 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column at index %ld", index
);
745 if (col
->num
== -1) {
746 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column with name '%s'", name
);
752 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_bind
, 0, 0, 2)
753 ZEND_ARG_INFO(0, col
)
754 ZEND_ARG_INFO(1, ref
)
756 static PHP_METHOD(pqres
, bind
) {
758 zend_error_handling zeh
;
761 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
762 rv
= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z/z", &zcol
, &zref
);
763 zend_restore_error_handling(&zeh TSRMLS_CC
);
766 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
769 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
773 if (SUCCESS
!= column_nn(obj
, zcol
, &col TSRMLS_CC
)) {
778 if (SUCCESS
!= zend_hash_index_update(&obj
->intern
->bound
, col
.num
, (void *) &zref
, sizeof(zval
*), NULL
)) {
779 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to bind column %s@%d", col
.name
, col
.num
);
782 zend_hash_sort(&obj
->intern
->bound
, zend_qsort
, php_pq_compare_index
, 0 TSRMLS_CC
);
790 static int apply_bound(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
792 zval
**zvalue
, **zbound
= p
;
793 zval
**zrow
= va_arg(argv
, zval
**);
794 ZEND_RESULT_CODE
*rv
= va_arg(argv
, ZEND_RESULT_CODE
*);
796 if (SUCCESS
!= zend_hash_index_find(Z_ARRVAL_PP(zrow
), key
->h
, (void *) &zvalue
)) {
797 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Failed to find column ad index %lu", key
->h
);
799 return ZEND_HASH_APPLY_STOP
;
802 ZVAL_COPY_VALUE(*zbound
, *zvalue
);
804 zval_ptr_dtor(zvalue
);
808 return ZEND_HASH_APPLY_KEEP
;
812 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_bound
, 0, 0, 0)
814 static PHP_METHOD(pqres
, fetchBound
) {
815 zend_error_handling zeh
;
818 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
819 rv
= zend_parse_parameters_none();
820 zend_restore_error_handling(&zeh TSRMLS_CC
);
823 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
826 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
830 if (SUCCESS
== php_pqres_iteration(getThis(), obj
, PHP_PQRES_FETCH_ARRAY
, &row TSRMLS_CC
) && row
) {
831 zend_replace_error_handling(EH_THROW
, exce(EX_RUNTIME
), &zeh TSRMLS_CC
);
832 zend_hash_apply_with_arguments(&obj
->intern
->bound TSRMLS_CC
, apply_bound
, 2, row
, &rv
);
833 zend_restore_error_handling(&zeh TSRMLS_CC
);
838 RETVAL_ZVAL(*row
, 1, 0);
845 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_row
, 0, 0, 0)
846 ZEND_ARG_INFO(0, fetch_type
)
848 static PHP_METHOD(pqres
, fetchRow
) {
849 zend_error_handling zeh
;
850 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
851 long fetch_type
= -1;
854 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
855 rv
= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
);
856 zend_restore_error_handling(&zeh TSRMLS_CC
);
860 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
864 if (fetch_type
== -1) {
865 fetch_type
= php_pqres_fetch_type(obj
->intern
);
868 zend_replace_error_handling(EH_THROW
, exce(EX_RUNTIME
), &zeh TSRMLS_CC
);
869 php_pqres_iteration(getThis(), obj
, fetch_type
, &row TSRMLS_CC
);
870 zend_restore_error_handling(&zeh TSRMLS_CC
);
873 RETVAL_ZVAL(*row
, 1, 0);
879 static zval
**column_at(zval
*row
, int col TSRMLS_DC
)
882 HashTable
*ht
= HASH_OF(row
);
883 int count
= zend_hash_num_elements(ht
);
886 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Column index %d exceeds column count %d", col
, count
);
888 zend_hash_internal_pointer_reset(ht
);
890 zend_hash_move_forward(ht
);
892 zend_hash_get_current_data(ht
, (void *) &data
);
897 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col
, 0, 0, 1)
898 ZEND_ARG_INFO(1, ref
)
899 ZEND_ARG_INFO(0, col
)
901 static PHP_METHOD(pqres
, fetchCol
) {
902 zend_error_handling zeh
;
903 zval
*zcol
= NULL
, *zref
;
906 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
907 rv
= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "z|z/!", &zref
, &zcol
);
908 zend_restore_error_handling(&zeh TSRMLS_CC
);
911 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
914 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
918 zend_replace_error_handling(EH_THROW
, exce(EX_RUNTIME
), &zeh TSRMLS_CC
);
919 php_pqres_iteration(getThis(), obj
, php_pqres_fetch_type(obj
->intern
), &row TSRMLS_CC
);
923 if (SUCCESS
!= column_nn(obj
, zcol
, &col TSRMLS_CC
)) {
926 zval
**zres
= column_at(*row
, col
.num TSRMLS_CC
);
932 ZVAL_ZVAL(zref
, *zres
, 1, 0);
937 zend_restore_error_handling(&zeh TSRMLS_CC
);
942 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_all_cols
, 0, 0, 0)
943 ZEND_ARG_INFO(0, col
)
945 static PHP_METHOD(pqres
, fetchAllCols
) {
946 zend_error_handling zeh
;
950 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
951 rv
= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z!", &zcol
);
952 zend_restore_error_handling(&zeh TSRMLS_CC
);
955 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
958 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
962 zend_replace_error_handling(EH_THROW
, exce(EX_RUNTIME
), &zeh TSRMLS_CC
);
963 if (SUCCESS
== column_nn(obj
, zcol
, &col TSRMLS_CC
)) {
964 int r
, rows
= PQntuples(obj
->intern
->res
);
966 array_init(return_value
);
967 for (r
= 0; r
< rows
; ++r
) {
968 add_next_index_zval(return_value
, php_pqres_get_col(obj
->intern
, r
, col
.num TSRMLS_CC
));
971 zend_restore_error_handling(&zeh TSRMLS_CC
);
976 struct apply_to_col_arg
{
977 php_pqres_object_t
*obj
;
978 php_pqres_col_t
*cols
;
979 ZEND_RESULT_CODE status
;
982 static int apply_to_col(void *p
, void *a TSRMLS_DC
)
985 struct apply_to_col_arg
*arg
= a
;
987 if (SUCCESS
!= column_nn(arg
->obj
, *c
, arg
->cols TSRMLS_CC
)) {
988 arg
->status
= FAILURE
;
989 return ZEND_HASH_APPLY_STOP
;
991 arg
->status
= SUCCESS
;
993 return ZEND_HASH_APPLY_KEEP
;
997 static php_pqres_col_t
*php_pqres_convert_to_cols(php_pqres_object_t
*obj
, HashTable
*ht TSRMLS_DC
)
999 struct apply_to_col_arg arg
= {NULL
};
1000 php_pqres_col_t
*tmp
;
1003 arg
.cols
= ecalloc(zend_hash_num_elements(ht
), sizeof(*tmp
));
1005 zend_hash_apply_with_argument(ht
, apply_to_col
, &arg TSRMLS_CC
);
1007 if (SUCCESS
== arg
.status
) {
1015 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_map
, 0, 0, 0)
1016 ZEND_ARG_INFO(0, keys
)
1017 ZEND_ARG_INFO(0, vals
)
1018 ZEND_ARG_INFO(0, fetch_type
)
1019 ZEND_END_ARG_INFO();
1020 static PHP_METHOD(pqres
, map
) {
1021 zend_error_handling zeh
;
1022 zval
*zkeys
= 0, *zvals
= 0;
1023 long fetch_type
= -1;
1024 ZEND_RESULT_CODE rv
;
1026 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
1027 rv
= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|z/!z/!l", &zkeys
, &zvals
, &fetch_type
);
1028 zend_restore_error_handling(&zeh TSRMLS_CC
);
1030 if (SUCCESS
== rv
) {
1031 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1034 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
1037 php_pqres_col_t def
= {PQfname(obj
->intern
->res
, 0), 0}, *keys
= NULL
, *vals
= NULL
;
1040 convert_to_array(zkeys
);
1042 if ((ks
= zend_hash_num_elements(Z_ARRVAL_P(zkeys
)))) {
1043 keys
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zkeys
) TSRMLS_CC
);
1053 convert_to_array(zvals
);
1055 if ((vs
= zend_hash_num_elements(Z_ARRVAL_P(zvals
)))) {
1056 vals
= php_pqres_convert_to_cols(obj
, Z_ARRVAL_P(zvals
) TSRMLS_CC
);
1060 if (fetch_type
== -1) {
1061 fetch_type
= php_pqres_fetch_type(obj
->intern
);
1068 switch (fetch_type
) {
1069 case PHP_PQRES_FETCH_ARRAY
:
1070 case PHP_PQRES_FETCH_ASSOC
:
1071 array_init(return_value
);
1073 case PHP_PQRES_FETCH_OBJECT
:
1074 object_init(return_value
);
1077 for (r
= 0, rows
= PQntuples(obj
->intern
->res
); r
< rows
; ++r
) {
1080 cur
= &return_value
;
1081 for (k
= 0; k
< ks
; ++k
) {
1082 char *key
= PQgetvalue(obj
->intern
->res
, r
, keys
[k
].num
);
1083 int len
= PQgetlength(obj
->intern
->res
, r
, keys
[k
].num
);
1085 if (SUCCESS
!= zend_symtable_find(HASH_OF(*cur
), key
, len
+ 1, (void *) &cur
)) {
1089 switch (fetch_type
) {
1090 case PHP_PQRES_FETCH_ARRAY
:
1091 case PHP_PQRES_FETCH_ASSOC
:
1094 case PHP_PQRES_FETCH_OBJECT
:
1098 if (SUCCESS
!= zend_symtable_update(HASH_OF(*cur
), key
, len
+ 1, (void *) &tmp
, sizeof(zval
*), (void *) &cur
)) {
1099 throw_exce(EX_RUNTIME TSRMLS_CC
, "Failed to create map");
1105 for (v
= 0; v
< vs
; ++v
) {
1106 char *val
= PQgetvalue(obj
->intern
->res
, r
, vals
[v
].num
);
1107 int len
= PQgetlength(obj
->intern
->res
, r
, vals
[v
].num
);
1109 switch (fetch_type
) {
1110 case PHP_PQRES_FETCH_ARRAY
:
1111 add_index_stringl(*cur
, vals
[v
].num
, val
, len
, 1);
1113 case PHP_PQRES_FETCH_ASSOC
:
1114 add_assoc_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
1116 case PHP_PQRES_FETCH_OBJECT
:
1117 add_property_stringl(*cur
, vals
[v
].name
, val
, len
, 1);
1122 php_pqres_row_to_zval(obj
->intern
->res
, r
, fetch_type
, cur TSRMLS_CC
);
1128 if (keys
&& keys
!= &def
) {
1138 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_all
, 0, 0, 0)
1139 ZEND_ARG_INFO(0, fetch_type
)
1140 ZEND_END_ARG_INFO();
1141 static PHP_METHOD(pqres
, fetchAll
) {
1142 zend_error_handling zeh
;
1143 long fetch_type
= -1;
1144 ZEND_RESULT_CODE rv
;
1146 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
1147 rv
= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|l", &fetch_type
);
1148 zend_restore_error_handling(&zeh TSRMLS_CC
);
1150 if (SUCCESS
== rv
) {
1151 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1153 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
1155 int r
, rows
= PQntuples(obj
->intern
->res
);
1157 if (fetch_type
== -1) {
1158 fetch_type
= php_pqres_fetch_type(obj
->intern
);
1161 array_init(return_value
);
1162 for (r
= 0; r
< rows
; ++r
) {
1163 add_next_index_zval(return_value
, php_pqres_row_to_zval(obj
->intern
->res
, r
, fetch_type
, NULL TSRMLS_CC
));
1169 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_count
, 0, 0, 0)
1170 ZEND_END_ARG_INFO();
1171 static PHP_METHOD(pqres
, count
) {
1172 zend_error_handling zeh
;
1173 ZEND_RESULT_CODE rv
;
1175 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
1176 rv
= zend_parse_parameters_none();
1177 zend_restore_error_handling(&zeh TSRMLS_CC
);
1179 if (SUCCESS
== rv
) {
1182 if (SUCCESS
!= php_pqres_count_elements(getThis(), &count TSRMLS_CC
)) {
1183 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
1190 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_desc
, 0, 0, 0)
1191 ZEND_END_ARG_INFO();
1192 static PHP_METHOD(pqres
, desc
) {
1193 zend_error_handling zeh
;
1194 ZEND_RESULT_CODE rv
;
1196 zend_replace_error_handling(EH_THROW
, exce(EX_INVALID_ARGUMENT
), &zeh TSRMLS_CC
);
1197 rv
= zend_parse_parameters_none();
1198 zend_restore_error_handling(&zeh TSRMLS_CC
);
1200 if (SUCCESS
== rv
) {
1201 php_pqres_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1204 throw_exce(EX_UNINITIALIZED TSRMLS_CC
, "pq\\Result not initialized");
1208 array_init(return_value
);
1209 for (p
= 0, params
= PQnparams(obj
->intern
->res
); p
< params
; ++p
) {
1210 add_next_index_long(return_value
, PQparamtype(obj
->intern
->res
, p
));
1216 static zend_function_entry php_pqres_methods
[] = {
1217 PHP_ME(pqres
, bind
, ai_pqres_bind
, ZEND_ACC_PUBLIC
)
1218 PHP_ME(pqres
, fetchBound
, ai_pqres_fetch_bound
, ZEND_ACC_PUBLIC
)
1219 PHP_ME(pqres
, fetchRow
, ai_pqres_fetch_row
, ZEND_ACC_PUBLIC
)
1220 PHP_ME(pqres
, fetchCol
, ai_pqres_fetch_col
, ZEND_ACC_PUBLIC
)
1221 PHP_ME(pqres
, fetchAll
, ai_pqres_fetch_all
, ZEND_ACC_PUBLIC
)
1222 PHP_ME(pqres
, fetchAllCols
, ai_pqres_fetch_all_cols
, ZEND_ACC_PUBLIC
)
1223 PHP_ME(pqres
, count
, ai_pqres_count
, ZEND_ACC_PUBLIC
)
1224 PHP_ME(pqres
, map
, ai_pqres_map
, ZEND_ACC_PUBLIC
)
1225 PHP_ME(pqres
, desc
, ai_pqres_desc
, ZEND_ACC_PUBLIC
)
1229 PHP_MSHUTDOWN_FUNCTION(pqres
)
1231 zend_hash_destroy(&php_pqres_object_prophandlers
);
1235 PHP_MINIT_FUNCTION(pqres
)
1237 zend_class_entry ce
= {0};
1238 php_pq_object_prophandler_t ph
= {0};
1240 INIT_NS_CLASS_ENTRY(ce
, "pq", "Result", php_pqres_methods
);
1241 php_pqres_class_entry
= zend_register_internal_class_ex(&ce
, NULL
, NULL TSRMLS_CC
);
1242 php_pqres_class_entry
->create_object
= php_pqres_create_object
;
1243 php_pqres_class_entry
->iterator_funcs
.funcs
= &php_pqres_iterator_funcs
;
1244 php_pqres_class_entry
->get_iterator
= php_pqres_iterator_init
;
1245 zend_class_implements(php_pqres_class_entry TSRMLS_CC
, 2, zend_ce_traversable
, spl_ce_Countable
);
1247 memcpy(&php_pqres_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1248 php_pqres_object_handlers
.read_property
= php_pq_object_read_prop
;
1249 php_pqres_object_handlers
.write_property
= php_pq_object_write_prop
;
1250 php_pqres_object_handlers
.clone_obj
= NULL
;
1251 php_pqres_object_handlers
.get_property_ptr_ptr
= NULL
;
1252 php_pqres_object_handlers
.get_gc
= NULL
;
1253 php_pqres_object_handlers
.get_debug_info
= php_pq_object_debug_info
;
1254 php_pqres_object_handlers
.get_properties
= php_pq_object_properties
;
1255 php_pqres_object_handlers
.count_elements
= php_pqres_count_elements
;
1257 zend_hash_init(&php_pqres_object_prophandlers
, 8, NULL
, NULL
, 1);
1259 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1260 ph
.read
= php_pqres_object_read_status
;
1261 zend_hash_add(&php_pqres_object_prophandlers
, "status", sizeof("status"), (void *) &ph
, sizeof(ph
), NULL
);
1263 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("statusMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1264 ph
.read
= php_pqres_object_read_status_message
;
1265 zend_hash_add(&php_pqres_object_prophandlers
, "statusMessage", sizeof("statusMessage"), (void *) &ph
, sizeof(ph
), NULL
);
1267 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("errorMessage"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1268 ph
.read
= php_pqres_object_read_error_message
;
1269 zend_hash_add(&php_pqres_object_prophandlers
, "errorMessage", sizeof("errorMessage"), (void *) &ph
, sizeof(ph
), NULL
);
1271 zend_declare_property_null(php_pqres_class_entry
, ZEND_STRL("diag"), ZEND_ACC_PUBLIC TSRMLS_CC
);
1272 ph
.read
= php_pqres_object_read_diag
;
1273 zend_hash_add(&php_pqres_object_prophandlers
, "diag", sizeof("diag"), (void *) &ph
, sizeof(ph
), NULL
);
1275 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1276 ph
.read
= php_pqres_object_read_num_rows
;
1277 zend_hash_add(&php_pqres_object_prophandlers
, "numRows", sizeof("numRows"), (void *) &ph
, sizeof(ph
), NULL
);
1279 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("numCols"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1280 ph
.read
= php_pqres_object_read_num_cols
;
1281 zend_hash_add(&php_pqres_object_prophandlers
, "numCols", sizeof("numCols"), (void *) &ph
, sizeof(ph
), NULL
);
1283 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("affectedRows"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1284 ph
.read
= php_pqres_object_read_affected_rows
;
1285 zend_hash_add(&php_pqres_object_prophandlers
, "affectedRows", sizeof("affectedRows"), (void *) &ph
, sizeof(ph
), NULL
);
1287 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("fetchType"), PHP_PQRES_FETCH_ARRAY
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1288 ph
.read
= php_pqres_object_read_fetch_type
;
1289 ph
.write
= php_pqres_object_write_fetch_type
;
1290 zend_hash_add(&php_pqres_object_prophandlers
, "fetchType", sizeof("fetchType"), (void *) &ph
, sizeof(ph
), NULL
);
1293 zend_declare_property_long(php_pqres_class_entry
, ZEND_STRL("autoConvert"), PHP_PQRES_CONV_ALL
, ZEND_ACC_PUBLIC TSRMLS_CC
);
1294 ph
.read
= php_pqres_object_read_auto_conv
;
1295 ph
.write
= php_pqres_object_write_auto_conv
;
1296 zend_hash_add(&php_pqres_object_prophandlers
, "autoConvert", sizeof("autoConvert"), (void *) &ph
, sizeof(ph
), NULL
);
1299 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("EMPTY_QUERY"), PGRES_EMPTY_QUERY TSRMLS_CC
);
1300 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COMMAND_OK"), PGRES_COMMAND_OK TSRMLS_CC
);
1301 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("TUPLES_OK"), PGRES_TUPLES_OK TSRMLS_CC
);
1302 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_OUT"), PGRES_COPY_OUT TSRMLS_CC
);
1303 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_IN"), PGRES_COPY_IN TSRMLS_CC
);
1304 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC
);
1305 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC
);
1306 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC
);
1307 #ifdef HAVE_PGRES_COPY_BOTH
1308 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC
);
1310 #ifdef HAVE_PGRES_SINGLE_TUPLE
1311 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC
);
1314 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC
);
1315 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC
);
1316 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("FETCH_OBJECT"), PHP_PQRES_FETCH_OBJECT TSRMLS_CC
);
1318 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("CONV_BOOL"), PHP_PQRES_CONV_BOOL TSRMLS_CC
);
1319 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("CONV_INT"), PHP_PQRES_CONV_INT TSRMLS_CC
);
1320 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("CONV_FLOAT"), PHP_PQRES_CONV_FLOAT TSRMLS_CC
);
1321 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("CONV_SCALAR"), PHP_PQRES_CONV_SCALAR TSRMLS_CC
);
1322 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("CONV_ARRAY"), PHP_PQRES_CONV_ARRAY TSRMLS_CC
);
1323 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("CONV_DATETIME"), PHP_PQRES_CONV_DATETIME TSRMLS_CC
);
1324 #if PHP_PQ_HAVE_PHP_JSON_H
1325 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("CONV_JSON"), PHP_PQRES_CONV_JSON TSRMLS_CC
);
1327 zend_declare_class_constant_long(php_pqres_class_entry
, ZEND_STRL("CONV_ALL"), PHP_PQRES_CONV_ALL TSRMLS_CC
);
1337 * vim600: noet sw=4 ts=4 fdm=marker
1338 * vim<600: noet sw=4 ts=4