X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pq_misc.c;h=3e334c6e5e6fcbbe47c1804bf9aac6275131e968;hp=9eccae98df41b70315dba75362932001b5851fcd;hb=HEAD;hpb=8d0dbf7286d9132be18de64625837afa55409f84 diff --git a/src/php_pq_misc.c b/src/php_pq_misc.c index 9eccae9..4d251d2 100644 --- a/src/php_pq_misc.c +++ b/src/php_pq_misc.c @@ -24,14 +24,22 @@ #include "php_pq.h" #include "php_pqexc.h" -#include "php_pqconn_event.h" #include "php_pq_misc.h" +#include "php_pqconn_event.h" #undef PHP_PQ_TYPE #include "php_pq_type.h" +/* convert version to string */ +extern void php_pq_version_to_string(int version, char *buffer, int len) { + if (version < 100000) { + slprintf(buffer, len, "%d.%d.%d", version/10000, version/100%100, version%100); + } else { /* since version 10 */ + slprintf(buffer, len, "%d.%d", version/10000, version%100); + } +} /* clear result object associated with a result handle */ -void php_pq_clear_res(PGresult *r) { +void php_pqres_clear(PGresult *r) { php_pq_object_t *o = PQresultInstanceData(r, php_pqconn_event); if (o) { @@ -42,12 +50,12 @@ void php_pq_clear_res(PGresult *r) { } /* clear any asynchronous results */ -void php_pq_clear_conn(PGconn *conn) { +void php_pqconn_clear(PGconn *conn) { PGresult *r; php_pqconn_event_data_t *evdata = PQinstanceData(conn, php_pqconn_event); while ((r = PQgetResult(conn))) { - php_pq_clear_res(r); + php_pqres_clear(r); } if (evdata && evdata->obj) { @@ -63,19 +71,19 @@ void php_pq_clear_conn(PGconn *conn) { /* safe wrappers to clear any asynchronous wrappers before querying synchronously */ PGresult *php_pq_exec(PGconn *conn, const char *query) { - php_pq_clear_conn(conn); + php_pqconn_clear(conn); return PQexec(conn, query); } PGresult *php_pq_exec_params(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char *const * paramValues, const int *paramLengths, const int *paramFormats, int resultFormat) { - php_pq_clear_conn(conn); + php_pqconn_clear(conn); return PQexecParams(conn, command, nParams, paramTypes, paramValues, paramLengths, paramFormats, resultFormat); } PGresult *php_pq_prepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes) { - php_pq_clear_conn(conn); + php_pqconn_clear(conn); return PQprepare(conn, stmtName, query, nParams, paramTypes); } PGresult *php_pq_exec_prepared(PGconn *conn, const char *stmtName, int nParams, const char *const * paramValues, const int *paramLengths, const int *paramFormats, int resultFormat) { - php_pq_clear_conn(conn); + php_pqconn_clear(conn); return PQexecPrepared(conn, stmtName, nParams, paramValues, paramLengths, paramFormats, resultFormat); } @@ -103,11 +111,8 @@ const char *php_pq_strmode(long mode) } } -int php_pq_compare_index(const void *lptr, const void *rptr) +static inline int compare_index(zend_ulong l, zend_ulong r) { - zend_ulong l = ((const Bucket *) lptr)->h; - zend_ulong r = ((const Bucket *) rptr)->h; - if (l < r) { return -1; } @@ -116,6 +121,16 @@ int php_pq_compare_index(const void *lptr, const void *rptr) } return 0; } +#if PHP_VERSION_ID >= 80000 +int php_pq_compare_index(Bucket *lptr, Bucket *rptr) +{ + return compare_index(lptr->h, rptr->h); +} +#else +int php_pq_compare_index(const void *lptr, const void *rptr) { + return compare_index(((const Bucket *) lptr)->h, ((const Bucket *) rptr)->h); +} +#endif void php_pq_hash_ptr_dtor(zval *p) { @@ -124,22 +139,40 @@ void php_pq_hash_ptr_dtor(zval *p) zend_class_entry *php_pqdt_class_entry; +#if PHP_VERSION_ID >= 80100 +ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(ai_pqdt_jsonserialize, 0, 0, IS_MIXED, 0) +ZEND_END_ARG_INFO() +#else +#define ai_pqdt_jsonserialize ai_pqdt_to_string +#endif + +#if PHP_VERSION_ID >= 80200 +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(ai_pqdt_to_string, 0, 0, IS_STRING, 0) +#else ZEND_BEGIN_ARG_INFO_EX(ai_pqdt_to_string, 0, 0, 0) +#endif ZEND_END_ARG_INFO(); static PHP_METHOD(pqdt, __toString) { zval rv, tmp; ZVAL_NULL(&rv); - zend_call_method_with_1_params(getThis(), php_pqdt_class_entry, NULL, "format", &rv, - zend_read_property(php_pqdt_class_entry, getThis(), ZEND_STRL("format"), 0, &tmp)); + php_pq_call_method(getThis(), "format", 1, &rv, php_pq_read_property(getThis(), "format", &tmp)); RETVAL_ZVAL(&rv, 1, 1); } +#if PHP_VERSION_ID >= 80100 +ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_TYPE_MASK_EX(ai_pqdt_create_from_format, 0, 2, DateTime, MAY_BE_FALSE) +#else ZEND_BEGIN_ARG_INFO_EX(ai_pqdt_create_from_format, 0, 0, 2) +#endif ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, datetime) +#if PHP_VERSION_ID >= 70200 + ZEND_ARG_OBJ_INFO(0, object, DateTimeZone, 1) +#else ZEND_ARG_INFO(0, timezone) +#endif ZEND_END_ARG_INFO(); static PHP_METHOD(pqdt, createFromFormat) { @@ -161,11 +194,11 @@ static PHP_METHOD(pqdt, createFromFormat) static zend_function_entry php_pqdt_methods[] = { PHP_ME(pqdt, createFromFormat, ai_pqdt_create_from_format, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME(pqdt, __toString, ai_pqdt_to_string, ZEND_ACC_PUBLIC) - PHP_MALIAS(pqdt, jsonSerialize, __toString, ai_pqdt_to_string, ZEND_ACC_PUBLIC) + PHP_MALIAS(pqdt, jsonSerialize, __toString, ai_pqdt_jsonserialize, ZEND_ACC_PUBLIC) {0} }; -zval *php_pqdt_from_string(zval *zv, char *input_fmt, char *dt_str, size_t dt_len, char *output_fmt, zval *ztimezone) +zval *php_pqdt_from_string(zval *zv, char *input_fmt, char *dt_str, size_t dt_len, const char *output_fmt, zval *ztimezone) { php_date_obj *dobj; @@ -175,7 +208,10 @@ zval *php_pqdt_from_string(zval *zv, char *input_fmt, char *dt_str, size_t dt_le zval_dtor(zv); ZVAL_NULL(zv); } else if (output_fmt) { - zend_update_property_string(php_pqdt_class_entry, zv, ZEND_STRL("format"), output_fmt); + zval fmt; + ZVAL_STRING(&fmt, output_fmt); + php_pq_update_property(zv, "format", &fmt); + zval_ptr_dtor(&fmt); } return zv; @@ -187,16 +223,14 @@ zend_string *php_pqdt_to_string(zval *zdt, const char *format) ZVAL_NULL(&rv); - if (Z_OBJ_HT_P(zdt)->cast_object - && SUCCESS == Z_OBJ_HT_P(zdt)->cast_object(zdt, &rv, IS_STRING) - ) { + if (php_pq_cast_object(zdt, IS_STRING, &rv)) { return Z_STR(rv); } else if (instanceof_function(Z_OBJCE_P(zdt), php_date_get_date_ce())) { zval rv, zfmt; ZVAL_NULL(&rv); ZVAL_STRING(&zfmt, format); - zend_call_method_with_1_params(zdt, Z_OBJCE_P(zdt), NULL, "format", &rv, &zfmt); + php_pq_call_method(zdt, "format", 1, &rv, &zfmt); zval_ptr_dtor(&zfmt); if (Z_TYPE(rv) == IS_STRING) { @@ -314,6 +348,9 @@ static ZEND_RESULT_CODE parse_element(ArrayParserState *a, char delim) case '{': return parse_array(a); + case '}': + return SUCCESS; + case '"': a->quotes = 1; ++a->ptr; @@ -363,7 +400,7 @@ static ZEND_RESULT_CODE parse_element(ArrayParserState *a, char delim) static ZEND_RESULT_CODE parse_elements(ArrayParserState *a) { - char delims[] = {'}', PHP_PQ_DELIM_OF_ARRAY(a->typ), 0}; + char delims[] = {'}', (char) PHP_PQ_DELIM_OF_ARRAY(a->typ), 0}; while (SUCCESS == parse_element(a, delims[1])) { switch (caa(a, delims, 0)) {