From: Michael Wallner Date: Wed, 24 Apr 2013 15:45:52 +0000 (+0200) Subject: better datetime handling X-Git-Tag: v0.2.0~1 X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-pq;a=commitdiff_plain;h=17e6dcce1f6176f0c428e14964bf8320f1de2779 better datetime handling --- diff --git a/src/php_pq_misc.c b/src/php_pq_misc.c index 943aa57..8c7ec6b 100644 --- a/src/php_pq_misc.c +++ b/src/php_pq_misc.c @@ -16,6 +16,12 @@ #include #include +#if defined(HAVE_JSON) && !defined(COMPILE_DL_JSON) +# include +#endif + +#include + #include #include "php_pq.h" @@ -174,7 +180,26 @@ Oid *php_pq_ntypes_to_array(zend_bool fill, int argc, ...) } */ -zval *php_pq_date_from_string(char *datetime_str, size_t datetime_len, zval *zv TSRMLS_DC) +zend_class_entry *php_pqdt_class_entry; + +ZEND_BEGIN_ARG_INFO_EX(ai_pqdt_to_string, 0, 0, 0) +ZEND_END_ARG_INFO(); +static PHP_METHOD(pqdt, __toString) +{ + zval *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 TSRMLS_CC)); + RETVAL_ZVAL(rv, 1, 1); +} + +static zend_function_entry php_pqdt_methods[] = { + 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) { php_date_obj *dobj; @@ -182,16 +207,35 @@ zval *php_pq_date_from_string(char *datetime_str, size_t datetime_len, zval *zv MAKE_STD_ZVAL(zv); } - php_date_instantiate(php_date_get_date_ce(), zv TSRMLS_CC); + php_date_instantiate(php_pqdt_class_entry, zv TSRMLS_CC); dobj = zend_object_store_get_object(zv TSRMLS_CC); - if (!php_date_initialize(dobj, datetime_str, datetime_len, NULL, NULL, 1 TSRMLS_CC)) { + if (!php_date_initialize(dobj, dt_str, dt_len, NULL, NULL, 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); } return zv; } +PHP_MINIT_FUNCTION(pq_misc) +{ + zend_class_entry **json, ce = {0}; + + INIT_NS_CLASS_ENTRY(ce ,"pq", "DateTime", php_pqdt_methods); + php_pqdt_class_entry = zend_register_internal_class_ex(&ce, php_date_get_date_ce(), "DateTime" TSRMLS_CC); + + zend_declare_property_stringl(php_pqdt_class_entry, ZEND_STRL("format"), ZEND_STRL("Y-m-d H:i:s.u"), ZEND_ACC_PUBLIC TSRMLS_CC); + + /* stop reading this file right here! */ + if (SUCCESS == zend_hash_find(CG(class_table), ZEND_STRS("jsonserializable"), (void *) &json)) { + zend_class_implements(php_pqdt_class_entry TSRMLS_CC, 1, *json); + } + + return SUCCESS; +} + /* * Local variables: * tab-width: 4 diff --git a/src/php_pq_misc.h b/src/php_pq_misc.h index 3ce172d..3bb1702 100644 --- a/src/php_pq_misc.h +++ b/src/php_pq_misc.h @@ -33,7 +33,10 @@ int compare_index(const void *lptr, const void *rptr TSRMLS_DC); int php_pq_types_to_array(HashTable *ht, Oid **types TSRMLS_DC); int php_pq_params_to_array(HashTable *ht, char ***params, HashTable *zdtor TSRMLS_DC); -zval *php_pq_date_from_string(char *datetime_str, size_t datetime_len, zval *zv TSRMLS_DC); +zend_class_entry *php_pqdt_class_entry; +zval *php_pqdt_from_string(char *datetime_str, size_t datetime_len, char *fmt, zval *zv TSRMLS_DC); + +PHP_MINIT_FUNCTION(pq_misc); #endif diff --git a/src/php_pq_module.c b/src/php_pq_module.c index 12a6e4b..02cd6db 100644 --- a/src/php_pq_module.c +++ b/src/php_pq_module.c @@ -52,6 +52,7 @@ static PHP_MINIT_FUNCTION(pq) { + PHP_MINIT_CALL(pq_misc); PHP_MINIT_CALL(pqexc); PHP_MINIT_CALL(pqconn); diff --git a/src/php_pqres.c b/src/php_pqres.c index 7535515..0331711 100644 --- a/src/php_pqres.c +++ b/src/php_pqres.c @@ -155,11 +155,20 @@ zval *php_pqres_row_to_zval(PGresult *res, unsigned row, php_pqres_fetch_t fetch ZVAL_DOUBLE(zv, zend_strtod(val, NULL)); break; - case PHP_PQ_OID_ABSTIME: case PHP_PQ_OID_DATE: + php_pqdt_from_string(val, len, "Y-m-d", zv TSRMLS_CC); + break; + + case PHP_PQ_OID_ABSTIME: + php_pqdt_from_string(val, len, "Y-m-d H:i:s", zv TSRMLS_CC); + break; + case PHP_PQ_OID_TIMESTAMP: + php_pqdt_from_string(val, len, "Y-m-d H:i:s.u", zv TSRMLS_CC); + break; + case PHP_PQ_OID_TIMESTAMPTZ: - php_pq_date_from_string(val, len, zv TSRMLS_CC); + php_pqdt_from_string(val, len, "Y-m-d H:i:s.uO", zv TSRMLS_CC); break;