|
|
|
@ -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 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|