|
@@ -29,7 +29,6 @@
|
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
#include <php.h>
|
|
|
-#include <ext/date/php_date.h>
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
#include "protobuf.h"
|
|
@@ -1124,17 +1123,41 @@ PHP_METHOD(Timestamp, fromDateTime) {
|
|
|
zval* datetime;
|
|
|
zval member;
|
|
|
|
|
|
+ PHP_PROTO_CE_DECLARE date_interface_ce;
|
|
|
+ if (php_proto_zend_lookup_class("\\DatetimeInterface", 18,
|
|
|
+ &date_interface_ce) == FAILURE) {
|
|
|
+ zend_error(E_ERROR, "Make sure date extension is enabled.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime,
|
|
|
- php_date_get_date_ce()) == FAILURE) {
|
|
|
+ PHP_PROTO_CE_UNREF(date_interface_ce)) == FAILURE) {
|
|
|
+ zend_error(E_USER_ERROR, "Expect DatetimeInterface.");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- php_date_obj* dateobj = UNBOX(php_date_obj, datetime);
|
|
|
- if (!dateobj->time->sse_uptodate) {
|
|
|
- timelib_update_ts(dateobj->time, NULL);
|
|
|
+ // Get timestamp from Datetime object.
|
|
|
+ zval retval;
|
|
|
+ zval function_name;
|
|
|
+ int64_t timestamp;
|
|
|
+
|
|
|
+#if PHP_MAJOR_VERSION < 7
|
|
|
+ INIT_ZVAL(retval);
|
|
|
+ INIT_ZVAL(function_name);
|
|
|
+#endif
|
|
|
+
|
|
|
+ PHP_PROTO_ZVAL_STRING(&function_name, "date_timestamp_get", 1);
|
|
|
+
|
|
|
+ if (call_user_function(EG(function_table), NULL, &function_name, &retval, 1,
|
|
|
+ ZVAL_PTR_TO_CACHED_PTR(datetime) TSRMLS_CC) == FAILURE) {
|
|
|
+ zend_error(E_ERROR, "Cannot get timestamp from DateTime.");
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- int64_t timestamp = dateobj->time->sse;
|
|
|
+ protobuf_convert_to_int64(&retval, ×tamp);
|
|
|
+
|
|
|
+ zval_dtor(&retval);
|
|
|
+ zval_dtor(&function_name);
|
|
|
|
|
|
// Set seconds
|
|
|
MessageHeader* self = UNBOX(MessageHeader, getThis());
|
|
@@ -1142,20 +1165,18 @@ PHP_METHOD(Timestamp, fromDateTime) {
|
|
|
upb_msgdef_ntofz(self->descriptor->msgdef, "seconds");
|
|
|
void* storage = message_data(self);
|
|
|
void* memory = slot_memory(self->descriptor->layout, storage, field);
|
|
|
- *(int64_t*)memory = dateobj->time->sse;
|
|
|
+ *(int64_t*)memory = timestamp;
|
|
|
|
|
|
// Set nanos
|
|
|
field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos");
|
|
|
storage = message_data(self);
|
|
|
memory = slot_memory(self->descriptor->layout, storage, field);
|
|
|
*(int32_t*)memory = 0;
|
|
|
+
|
|
|
+ RETURN_NULL();
|
|
|
}
|
|
|
|
|
|
PHP_METHOD(Timestamp, toDateTime) {
|
|
|
- zval datetime;
|
|
|
- php_date_instantiate(php_date_get_date_ce(), &datetime TSRMLS_CC);
|
|
|
- php_date_obj* dateobj = UNBOX(php_date_obj, &datetime);
|
|
|
-
|
|
|
// Get seconds
|
|
|
MessageHeader* self = UNBOX(MessageHeader, getThis());
|
|
|
const upb_fielddef* field =
|
|
@@ -1176,14 +1197,38 @@ PHP_METHOD(Timestamp, toDateTime) {
|
|
|
strftime(formated_time, sizeof(formated_time), "%Y-%m-%dT%H:%M:%SUTC",
|
|
|
utc_time);
|
|
|
|
|
|
- if (!php_date_initialize(dateobj, formated_time, strlen(formated_time), NULL,
|
|
|
- NULL, 0 TSRMLS_CC)) {
|
|
|
- zval_dtor(&datetime);
|
|
|
- RETURN_NULL();
|
|
|
+ // Create Datetime object.
|
|
|
+ zval datetime;
|
|
|
+ zval formated_time_php;
|
|
|
+ zval function_name;
|
|
|
+ int64_t timestamp = 0;
|
|
|
+
|
|
|
+#if PHP_MAJOR_VERSION < 7
|
|
|
+ INIT_ZVAL(function_name);
|
|
|
+ INIT_ZVAL(formated_time_php);
|
|
|
+#endif
|
|
|
+
|
|
|
+ PHP_PROTO_ZVAL_STRING(&function_name, "date_create", 1);
|
|
|
+ PHP_PROTO_ZVAL_STRING(&formated_time_php, formated_time, 1);
|
|
|
+
|
|
|
+ CACHED_VALUE params[1] = {ZVAL_TO_CACHED_VALUE(formated_time_php)};
|
|
|
+
|
|
|
+ if (call_user_function(EG(function_table), NULL,
|
|
|
+ &function_name, &datetime, 1,
|
|
|
+ params TSRMLS_CC) == FAILURE) {
|
|
|
+ zend_error(E_ERROR, "Cannot create DateTime.");
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
+ zval_dtor(&formated_time_php);
|
|
|
+ zval_dtor(&function_name);
|
|
|
+
|
|
|
+#if PHP_MAJOR_VERSION < 7
|
|
|
zval* datetime_ptr = &datetime;
|
|
|
PHP_PROTO_RETVAL_ZVAL(datetime_ptr);
|
|
|
+#else
|
|
|
+ ZVAL_OBJ(return_value, Z_OBJ(datetime));
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|