X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=blobdiff_plain;f=src%2Fphp_pq_misc.c;h=af36c33d15dd1c2c6c7b06acb34c87879de0ce46;hp=d36f905e8e625dd6c9a3d9a87e637687d34f2bbb;hb=eb78fe8db7aa132c54e3b092973d6ad01210791c;hpb=7d954192543192f2ef9b0db27f22b7807de31749 diff --git a/src/php_pq_misc.c b/src/php_pq_misc.c index d36f905..af36c33 100644 --- a/src/php_pq_misc.c +++ b/src/php_pq_misc.c @@ -23,6 +23,7 @@ #include #include "php_pq.h" +#include "php_pqexc.h" #include "php_pq_misc.h" char *php_pq_rtrim(char *e) @@ -78,13 +79,36 @@ static PHP_METHOD(pqdt, __toString) } } +ZEND_BEGIN_ARG_INFO_EX(ai_pqdt_create_from_format, 0, 0, 2) + ZEND_ARG_INFO(0, format) + ZEND_ARG_INFO(0, datetime) + ZEND_ARG_INFO(0, timezone) +ZEND_END_ARG_INFO(); +static PHP_METHOD(pqdt, createFromFormat) +{ + zend_error_handling zeh; + char *fmt_str, *dt_str; + int fmt_len, dt_len; + zval *ztz = NULL; + ZEND_RESULT_CODE rv; + + zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC); + rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|O", &fmt_str, &fmt_len, &dt_str, &dt_len, &ztz, php_date_get_timezone_ce()); + zend_restore_error_handling(&zeh TSRMLS_CC); + + if (SUCCESS == rv) { + php_pqdt_from_string(return_value, fmt_str, dt_str, dt_len, "Y-m-d H:i:s.uO", ztz TSRMLS_CC); + } +} + 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) {0} }; -zval *php_pqdt_from_string(char *dt_str, size_t dt_len, char *fmt, zval *zv TSRMLS_DC) +zval *php_pqdt_from_string(zval *zv, char *input_fmt, char *dt_str, size_t dt_len, char *output_fmt, zval *ztimezone TSRMLS_DC) { php_date_obj *dobj; @@ -94,11 +118,11 @@ zval *php_pqdt_from_string(char *dt_str, size_t dt_len, char *fmt, zval *zv TSRM php_date_instantiate(php_pqdt_class_entry, zv TSRMLS_CC); dobj = zend_object_store_get_object(zv TSRMLS_CC); - if (!php_date_initialize(dobj, dt_str, dt_len, NULL, NULL, 1 TSRMLS_CC)) { + if (!php_date_initialize(dobj, dt_str, dt_len, input_fmt, ztimezone, 1 TSRMLS_CC)) { zval_dtor(zv); ZVAL_NULL(zv); - } else if (fmt) { - zend_update_property_string(php_pqdt_class_entry, zv, ZEND_STRL("format"), fmt TSRMLS_CC); + } else if (output_fmt) { + zend_update_property_string(php_pqdt_class_entry, zv, ZEND_STRL("format"), output_fmt TSRMLS_CC); } return zv; @@ -211,7 +235,7 @@ static char caa(ArrayParserState *a, const char *any, unsigned advance) return 0; } -static STATUS add_element(ArrayParserState *a, const char *start) +static ZEND_RESULT_CODE add_element(ArrayParserState *a, const char *start) { zval *zelem; size_t el_len = a->ptr - start; @@ -241,9 +265,9 @@ static STATUS add_element(ArrayParserState *a, const char *start) return zend_hash_next_index_insert(&a->list->ht, &zelem, sizeof(zval *), NULL); } -static STATUS parse_array(ArrayParserState *a); +static ZEND_RESULT_CODE parse_array(ArrayParserState *a); -static STATUS parse_element(ArrayParserState *a) +static ZEND_RESULT_CODE parse_element(ArrayParserState *a) { const char *el; TSRMLS_FETCH_FROM_CTX(a->ts); @@ -297,7 +321,7 @@ static STATUS parse_element(ArrayParserState *a) return FAILURE; } -static STATUS parse_elements(ArrayParserState *a) +static ZEND_RESULT_CODE parse_elements(ArrayParserState *a) { TSRMLS_FETCH_FROM_CTX(a->ts); @@ -321,7 +345,7 @@ static STATUS parse_elements(ArrayParserState *a) return FAILURE; } -static STATUS parse_array(ArrayParserState *a) +static ZEND_RESULT_CODE parse_array(ArrayParserState *a) { HashTableList *list;