Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
b70e0fdf
Commit
b70e0fdf
authored
Aug 31, 2017
by
Paul Yang
Committed by
GitHub
Aug 31, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add php support for Timestamp. (#3575)
* Add php support for Timestamp. * Fix comments
parent
c7457ef6
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
443 additions
and
102 deletions
+443
-102
Makefile.am
Makefile.am
+2
-0
message.c
php/ext/google/protobuf/message.c
+185
-97
protobuf.c
php/ext/google/protobuf/protobuf.c
+1
-0
protobuf.h
php/ext/google/protobuf/protobuf.h
+14
-0
storage.c
php/ext/google/protobuf/storage.c
+5
-5
Timestamp.php
php/src/GPBMetadata/Google/Protobuf/Timestamp.php
+31
-0
Timestamp.php
php/src/Google/Protobuf/Timestamp.php
+184
-0
well_known_test.php
php/tests/well_known_test.php
+21
-0
No files found.
Makefile.am
View file @
b70e0fdf
...
...
@@ -607,6 +607,7 @@ php_EXTRA_DIST= \
php/src/Google/Protobuf/EnumValueDescriptor.php
\
php/src/Google/Protobuf/FieldDescriptor.php
\
php/src/Google/Protobuf/OneofDescriptor.php
\
php/src/Google/Protobuf/Timestamp.php
\
php/src/Google/Protobuf/Internal/CodedInputStream.php
\
php/src/Google/Protobuf/Internal/CodedOutputStream.php
\
php/src/Google/Protobuf/Internal/DescriptorPool.php
\
...
...
@@ -666,6 +667,7 @@ php_EXTRA_DIST= \
php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php
\
php/src/Google/Protobuf/Internal/UninterpretedOption.php
\
php/src/GPBMetadata/Google/Protobuf/Any.php
\
php/src/GPBMetadata/Google/Protobuf/Timestamp.php
\
php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
\
php/tests/array_test.php
\
php/tests/autoload.php
\
...
...
php/ext/google/protobuf/message.c
View file @
b70e0fdf
...
...
@@ -29,6 +29,7 @@
// 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"
...
...
@@ -105,6 +106,20 @@ PHP_PROTO_INIT_CLASS_START("Google\\Protobuf\\Internal\\Message",
message_handlers
->
get_gc
=
message_get_gc
;
PHP_PROTO_INIT_CLASS_END
static
void
message_set_property_internal
(
zval
*
object
,
zval
*
member
,
zval
*
value
TSRMLS_DC
)
{
const
upb_fielddef
*
field
;
MessageHeader
*
self
=
UNBOX
(
MessageHeader
,
object
);
field
=
upb_msgdef_ntofz
(
self
->
descriptor
->
msgdef
,
Z_STRVAL_P
(
member
));
if
(
field
==
NULL
)
{
zend_error
(
E_USER_ERROR
,
"Unknown field: %s"
,
Z_STRVAL_P
(
member
));
}
layout_set
(
self
->
descriptor
->
layout
,
self
,
field
,
value
TSRMLS_CC
);
}
#if PHP_MAJOR_VERSION < 7
static
void
message_set_property
(
zval
*
object
,
zval
*
member
,
zval
*
value
,
php_proto_zend_literal
key
TSRMLS_DC
)
{
...
...
@@ -127,16 +142,32 @@ static void message_set_property(zval* object, zval* member, zval* value,
return
;
}
const
upb_fielddef
*
field
;
message_set_property_internal
(
object
,
member
,
value
TSRMLS_CC
);
}
static
zval
*
message_get_property_internal
(
zval
*
object
,
zval
*
member
TSRMLS_DC
)
{
MessageHeader
*
self
=
UNBOX
(
MessageHeader
,
object
);
const
upb_fielddef
*
field
;
field
=
upb_msgdef_ntofz
(
self
->
descriptor
->
msgdef
,
Z_STRVAL_P
(
member
));
if
(
field
==
NULL
)
{
zend_error
(
E_USER_ERROR
,
"Unknown field: %s"
,
Z_STRVAL_P
(
member
))
;
return
PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL
;
}
layout_set
(
self
->
descriptor
->
layout
,
self
,
field
,
value
TSRMLS_CC
);
zend_property_info
*
property_info
;
#if PHP_MAJOR_VERSION < 7
property_info
=
zend_get_property_info
(
Z_OBJCE_P
(
object
),
member
,
true
TSRMLS_CC
);
return
layout_get
(
self
->
descriptor
->
layout
,
message_data
(
self
),
field
,
OBJ_PROP
(
Z_OBJ_P
(
object
),
property_info
->
offset
)
TSRMLS_CC
);
#else
property_info
=
zend_get_property_info
(
Z_OBJCE_P
(
object
),
Z_STR_P
(
member
),
true
);
return
layout_get
(
self
->
descriptor
->
layout
,
message_data
(
self
),
field
,
OBJ_PROP
(
Z_OBJ_P
(
object
),
property_info
->
offset
)
TSRMLS_CC
);
#endif
}
#if PHP_MAJOR_VERSION < 7
...
...
@@ -161,27 +192,7 @@ static zval* message_get_property(zval* object, zval* member, int type,
return
PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL
;
}
MessageHeader
*
self
=
UNBOX
(
MessageHeader
,
object
);
const
upb_fielddef
*
field
;
field
=
upb_msgdef_ntofz
(
self
->
descriptor
->
msgdef
,
Z_STRVAL_P
(
member
));
if
(
field
==
NULL
)
{
return
PHP_PROTO_GLOBAL_UNINITIALIZED_ZVAL
;
}
zend_property_info
*
property_info
;
#if PHP_MAJOR_VERSION < 7
property_info
=
zend_get_property_info
(
Z_OBJCE_P
(
object
),
member
,
true
TSRMLS_CC
);
return
layout_get
(
self
->
descriptor
->
layout
,
message_data
(
self
),
field
,
OBJ_PROP
(
Z_OBJ_P
(
object
),
property_info
->
offset
)
TSRMLS_CC
);
#else
property_info
=
zend_get_property_info
(
Z_OBJCE_P
(
object
),
Z_STR_P
(
member
),
true
);
return
layout_get
(
self
->
descriptor
->
layout
,
message_data
(
self
),
field
,
OBJ_PROP
(
Z_OBJ_P
(
object
),
property_info
->
offset
)
TSRMLS_CC
);
#endif
return
message_get_property_internal
(
object
,
member
TSRMLS_CC
);
}
#if PHP_MAJOR_VERSION < 7
...
...
@@ -345,6 +356,32 @@ PHP_METHOD(Message, whichOneof) {
PHP_PROTO_RETURN_STRING
(
oneof_case_name
,
1
);
}
// -----------------------------------------------------------------------------
// Well Known Types Support
// -----------------------------------------------------------------------------
#define PHP_PROTO_FIELD_ACCESSORS(UPPER_CLASS, LOWER_CLASS, UPPER_FIELD, \
LOWER_FIELD) \
PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
zval member; \
PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
zval* value = message_get_property_internal(getThis(), &member TSRMLS_CC); \
PHP_PROTO_FAKE_SCOPE_END; \
PHP_PROTO_RETVAL_ZVAL(value); \
} \
PHP_METHOD(UPPER_CLASS, set##UPPER_FIELD) { \
zval* value = NULL; \
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == \
FAILURE) { \
return; \
} \
zval member; \
PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
message_set_property_internal(getThis(), &member, value TSRMLS_CC); \
PHP_PROTO_RETVAL_ZVAL(getThis()); \
}
// -----------------------------------------------------------------------------
// Any
// -----------------------------------------------------------------------------
...
...
@@ -417,78 +454,8 @@ PHP_METHOD(Any, __construct) {
custom_data_init
(
any_type
,
intern
PHP_PROTO_TSRMLS_CC
);
}
PHP_METHOD
(
Any
,
getTypeUrl
)
{
zval
member
;
PHP_PROTO_ZVAL_STRING
(
&
member
,
"type_url"
,
1
);
PHP_PROTO_FAKE_SCOPE_BEGIN
(
any_type
);
#if PHP_MAJOR_VERSION < 7
zval
*
value
=
message_handlers
->
read_property
(
getThis
(),
&
member
,
BP_VAR_R
,
NULL
PHP_PROTO_TSRMLS_CC
);
#else
zval
*
value
=
message_handlers
->
read_property
(
getThis
(),
&
member
,
BP_VAR_R
,
NULL
,
NULL
PHP_PROTO_TSRMLS_CC
);
#endif
PHP_PROTO_FAKE_SCOPE_END
;
PHP_PROTO_RETVAL_ZVAL
(
value
);
}
PHP_METHOD
(
Any
,
setTypeUrl
)
{
char
*
type_url
=
NULL
;
PHP_PROTO_SIZE
type_url_len
;
if
(
zend_parse_parameters
(
ZEND_NUM_ARGS
()
TSRMLS_CC
,
"s"
,
&
type_url
,
&
type_url_len
)
==
FAILURE
)
{
return
;
}
zval
member
;
zval
value
;
PHP_PROTO_ZVAL_STRING
(
&
member
,
"type_url"
,
1
);
PHP_PROTO_ZVAL_STRINGL
(
&
value
,
type_url
,
type_url_len
,
1
);
PHP_PROTO_FAKE_SCOPE_BEGIN
(
any_type
);
message_handlers
->
write_property
(
getThis
(),
&
member
,
&
value
,
NULL
PHP_PROTO_TSRMLS_CC
);
PHP_PROTO_FAKE_SCOPE_END
;
PHP_PROTO_RETVAL_ZVAL
(
getThis
());
}
PHP_METHOD
(
Any
,
getValue
)
{
zval
member
;
PHP_PROTO_ZVAL_STRING
(
&
member
,
"value"
,
1
);
PHP_PROTO_FAKE_SCOPE_BEGIN
(
any_type
);
zval
*
value
=
php_proto_message_read_property
(
getThis
(),
&
member
PHP_PROTO_TSRMLS_CC
);
PHP_PROTO_FAKE_SCOPE_END
;
PHP_PROTO_RETVAL_ZVAL
(
value
);
}
PHP_METHOD
(
Any
,
setValue
)
{
char
*
value
=
NULL
;
PHP_PROTO_SIZE
value_len
;
if
(
zend_parse_parameters
(
ZEND_NUM_ARGS
()
TSRMLS_CC
,
"s"
,
&
value
,
&
value_len
)
==
FAILURE
)
{
return
;
}
zval
member
;
zval
value_to_set
;
PHP_PROTO_ZVAL_STRING
(
&
member
,
"value"
,
1
);
PHP_PROTO_ZVAL_STRINGL
(
&
value_to_set
,
value
,
value_len
,
1
);
PHP_PROTO_FAKE_SCOPE_BEGIN
(
any_type
);
message_handlers
->
write_property
(
getThis
(),
&
member
,
&
value_to_set
,
NULL
PHP_PROTO_TSRMLS_CC
);
PHP_PROTO_FAKE_SCOPE_END
;
PHP_PROTO_RETVAL_ZVAL
(
getThis
());
}
PHP_PROTO_FIELD_ACCESSORS
(
Any
,
any
,
TypeUrl
,
"type_url"
)
PHP_PROTO_FIELD_ACCESSORS
(
Any
,
any
,
Value
,
"value"
)
PHP_METHOD
(
Any
,
unpack
)
{
// Get type url.
...
...
@@ -617,3 +584,124 @@ PHP_METHOD(Any, is) {
RETURN_BOOL
(
is
);
}
// -----------------------------------------------------------------------------
// Timestamp
// -----------------------------------------------------------------------------
static
zend_function_entry
timestamp_methods
[]
=
{
PHP_ME
(
Timestamp
,
__construct
,
NULL
,
ZEND_ACC_PUBLIC
)
PHP_ME
(
Timestamp
,
fromDateTime
,
NULL
,
ZEND_ACC_PUBLIC
)
PHP_ME
(
Timestamp
,
toDateTime
,
NULL
,
ZEND_ACC_PUBLIC
)
PHP_ME
(
Timestamp
,
getSeconds
,
NULL
,
ZEND_ACC_PUBLIC
)
PHP_ME
(
Timestamp
,
setSeconds
,
NULL
,
ZEND_ACC_PUBLIC
)
PHP_ME
(
Timestamp
,
getNanos
,
NULL
,
ZEND_ACC_PUBLIC
)
PHP_ME
(
Timestamp
,
setNanos
,
NULL
,
ZEND_ACC_PUBLIC
)
{
NULL
,
NULL
,
NULL
}
};
zend_class_entry
*
timestamp_type
;
// Init class entry.
PHP_PROTO_INIT_SUBMSGCLASS_START
(
"Google
\\
Protobuf
\\
Timestamp"
,
Timestamp
,
timestamp
)
zend_class_implements
(
timestamp_type
TSRMLS_CC
,
1
,
message_type
);
zend_declare_property_long
(
timestamp_type
,
"seconds"
,
strlen
(
"seconds"
),
0
,
ZEND_ACC_PRIVATE
TSRMLS_CC
);
zend_declare_property_long
(
timestamp_type
,
"nanos"
,
strlen
(
"nanos"
),
0
,
ZEND_ACC_PRIVATE
TSRMLS_CC
);
PHP_PROTO_INIT_SUBMSGCLASS_END
PHP_METHOD
(
Timestamp
,
__construct
)
{
PHP_PROTO_HASHTABLE_VALUE
desc_php
=
get_ce_obj
(
timestamp_type
);
if
(
desc_php
==
NULL
)
{
init_generated_pool_once
(
TSRMLS_C
);
const
char
*
generated_file
=
"0ae7010a1f676f6f676c652f70726f746f6275662f74696d657374616d70"
"2e70726f746f120f676f6f676c652e70726f746f627566222b0a0954696d"
"657374616d70120f0a077365636f6e6473180120012803120d0a056e616e"
"6f73180220012805427e0a13636f6d2e676f6f676c652e70726f746f6275"
"66420e54696d657374616d7050726f746f50015a2b6769746875622e636f"
"6d2f676f6c616e672f70726f746f6275662f7074797065732f74696d6573"
"74616d70f80101a20203475042aa021e476f6f676c652e50726f746f6275"
"662e57656c6c4b6e6f776e5479706573620670726f746f33"
;
char
*
binary
;
int
binary_len
;
hex_to_binary
(
generated_file
,
&
binary
,
&
binary_len
);
internal_add_generated_file
(
binary
,
binary_len
,
generated_pool
TSRMLS_CC
);
FREE
(
binary
);
}
MessageHeader
*
intern
=
UNBOX
(
MessageHeader
,
getThis
());
custom_data_init
(
timestamp_type
,
intern
PHP_PROTO_TSRMLS_CC
);
}
PHP_PROTO_FIELD_ACCESSORS
(
Timestamp
,
timestamp
,
Seconds
,
"seconds"
)
PHP_PROTO_FIELD_ACCESSORS
(
Timestamp
,
timestamp
,
Nanos
,
"nanos"
)
PHP_METHOD
(
Timestamp
,
fromDateTime
)
{
zval
*
datetime
;
zval
member
;
if
(
zend_parse_parameters
(
ZEND_NUM_ARGS
()
TSRMLS_CC
,
"O"
,
&
datetime
,
php_date_get_date_ce
())
==
FAILURE
)
{
return
;
}
php_date_obj
*
dateobj
=
UNBOX
(
php_date_obj
,
datetime
);
if
(
!
dateobj
->
time
->
sse_uptodate
)
{
timelib_update_ts
(
dateobj
->
time
,
NULL
);
}
int64_t
timestamp
=
dateobj
->
time
->
sse
;
// Set seconds
MessageHeader
*
self
=
UNBOX
(
MessageHeader
,
getThis
());
const
upb_fielddef
*
field
=
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
;
// 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
;
}
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
=
upb_msgdef_ntofz
(
self
->
descriptor
->
msgdef
,
"seconds"
);
void
*
storage
=
message_data
(
self
);
void
*
memory
=
slot_memory
(
self
->
descriptor
->
layout
,
storage
,
field
);
int64_t
seconds
=
*
(
int64_t
*
)
memory
;
// Get nanos
field
=
upb_msgdef_ntofz
(
self
->
descriptor
->
msgdef
,
"nanos"
);
memory
=
slot_memory
(
self
->
descriptor
->
layout
,
storage
,
field
);
int32_t
nanos
=
*
(
int32_t
*
)
memory
;
// Get formated time string.
char
formated_time
[
50
];
time_t
raw_time
=
seconds
;
struct
tm
*
utc_time
=
gmtime
(
&
raw_time
);
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
();
}
zval
*
datetime_ptr
=
&
datetime
;
PHP_PROTO_RETVAL_ZVAL
(
datetime_ptr
);
}
php/ext/google/protobuf/protobuf.c
View file @
b70e0fdf
...
...
@@ -257,6 +257,7 @@ static PHP_MINIT_FUNCTION(protobuf) {
repeated_field_iter_init
(
TSRMLS_C
);
util_init
(
TSRMLS_C
);
any_init
(
TSRMLS_C
);
timestamp_init
(
TSRMLS_C
);
return
0
;
}
...
...
php/ext/google/protobuf/protobuf.h
View file @
b70e0fdf
...
...
@@ -531,6 +531,7 @@ struct RepeatedFieldIter;
struct
Map
;
struct
MapIter
;
struct
Oneof
;
struct
Timestamp
;
typedef
struct
Any
Any
;
typedef
struct
DescriptorPool
DescriptorPool
;
...
...
@@ -547,6 +548,7 @@ typedef struct RepeatedFieldIter RepeatedFieldIter;
typedef
struct
Map
Map
;
typedef
struct
MapIter
MapIter
;
typedef
struct
Oneof
Oneof
;
typedef
struct
Timestamp
Timestamp
;
// -----------------------------------------------------------------------------
// Globals.
...
...
@@ -569,6 +571,7 @@ void message_init(TSRMLS_D);
void
oneof_descriptor_init
(
TSRMLS_D
);
void
repeated_field_init
(
TSRMLS_D
);
void
repeated_field_iter_init
(
TSRMLS_D
);
void
timestamp_init
(
TSRMLS_D
);
void
util_init
(
TSRMLS_D
);
// Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor
...
...
@@ -787,6 +790,8 @@ void layout_merge(MessageLayout* layout, MessageHeader* from,
const
char
*
layout_get_oneof_case
(
MessageLayout
*
layout
,
const
void
*
storage
,
const
upb_oneofdef
*
oneof
TSRMLS_DC
);
void
free_layout
(
MessageLayout
*
layout
);
void
*
slot_memory
(
MessageLayout
*
layout
,
const
void
*
storage
,
const
upb_fielddef
*
field
);
PHP_METHOD
(
Message
,
clear
);
PHP_METHOD
(
Message
,
mergeFrom
);
...
...
@@ -1029,7 +1034,16 @@ PHP_METHOD(Any, unpack);
PHP_METHOD
(
Any
,
pack
);
PHP_METHOD
(
Any
,
is
);
PHP_METHOD
(
Timestamp
,
__construct
);
PHP_METHOD
(
Timestamp
,
fromDateTime
);
PHP_METHOD
(
Timestamp
,
toDateTime
);
PHP_METHOD
(
Timestamp
,
getSeconds
);
PHP_METHOD
(
Timestamp
,
setSeconds
);
PHP_METHOD
(
Timestamp
,
getNanos
);
PHP_METHOD
(
Timestamp
,
setNanos
);
extern
zend_class_entry
*
any_type
;
extern
zend_class_entry
*
timestamp_type
;
// -----------------------------------------------------------------------------
// Upb.
...
...
php/ext/google/protobuf/storage.c
View file @
b70e0fdf
...
...
@@ -560,11 +560,6 @@ static size_t align_up_to(size_t offset, size_t granularity) {
return
(
offset
+
granularity
-
1
)
&
~
(
granularity
-
1
);
}
static
void
*
slot_memory
(
MessageLayout
*
layout
,
const
void
*
storage
,
const
upb_fielddef
*
field
)
{
return
((
uint8_t
*
)
storage
)
+
layout
->
fields
[
upb_fielddef_index
(
field
)].
offset
;
}
static
uint32_t
*
slot_oneof_case
(
MessageLayout
*
layout
,
const
void
*
storage
,
const
upb_fielddef
*
field
)
{
return
(
uint32_t
*
)(((
uint8_t
*
)
storage
)
+
...
...
@@ -576,6 +571,11 @@ static int slot_property_cache(MessageLayout* layout, const void* storage,
return
layout
->
fields
[
upb_fielddef_index
(
field
)].
cache_index
;
}
void
*
slot_memory
(
MessageLayout
*
layout
,
const
void
*
storage
,
const
upb_fielddef
*
field
)
{
return
((
uint8_t
*
)
storage
)
+
layout
->
fields
[
upb_fielddef_index
(
field
)].
offset
;
}
MessageLayout
*
create_layout
(
const
upb_msgdef
*
msgdef
)
{
MessageLayout
*
layout
=
ALLOC
(
MessageLayout
);
int
nfields
=
upb_msgdef_numfields
(
msgdef
);
...
...
php/src/GPBMetadata/Google/Protobuf/Timestamp.php
0 → 100644
View file @
b70e0fdf
<?php
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: google/protobuf/timestamp.proto
namespace
GPBMetadata\Google\Protobuf
;
class
Timestamp
{
public
static
$is_initialized
=
false
;
public
static
function
initOnce
()
{
$pool
=
\Google\Protobuf\Internal\DescriptorPool
::
getGeneratedPool
();
if
(
static
::
$is_initialized
==
true
)
{
return
;
}
$pool
->
internalAddGeneratedFile
(
hex2bin
(
"0ae7010a1f676f6f676c652f70726f746f6275662f74696d657374616d70"
.
"2e70726f746f120f676f6f676c652e70726f746f627566222b0a0954696d"
.
"657374616d70120f0a077365636f6e6473180120012803120d0a056e616e"
.
"6f73180220012805427e0a13636f6d2e676f6f676c652e70726f746f6275"
.
"66420e54696d657374616d7050726f746f50015a2b6769746875622e636f"
.
"6d2f676f6c616e672f70726f746f6275662f7074797065732f74696d6573"
.
"74616d70f80101a20203475042aa021e476f6f676c652e50726f746f6275"
.
"662e57656c6c4b6e6f776e5479706573620670726f746f33"
));
static
::
$is_initialized
=
true
;
}
}
php/src/Google/Protobuf/Timestamp.php
0 → 100644
View file @
b70e0fdf
<?php
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: google/protobuf/timestamp.proto
namespace
Google\Protobuf
;
use
Google\Protobuf\Internal\GPBType
;
use
Google\Protobuf\Internal\RepeatedField
;
use
Google\Protobuf\Internal\GPBUtil
;
/**
* A Timestamp represents a point in time independent of any time zone
* or calendar, represented as seconds and fractions of seconds at
* nanosecond resolution in UTC Epoch time. It is encoded using the
* Proleptic Gregorian Calendar which extends the Gregorian calendar
* backwards to year one. It is encoded assuming all minutes are 60
* seconds long, i.e. leap seconds are "smeared" so that no leap second
* table is needed for interpretation. Range is from
* 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
* By restricting to that range, we ensure that we can convert to
* and from RFC 3339 date strings.
* See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
* # Examples
* Example 1: Compute Timestamp from POSIX `time()`.
* Timestamp timestamp;
* timestamp.set_seconds(time(NULL));
* timestamp.set_nanos(0);
* Example 2: Compute Timestamp from POSIX `gettimeofday()`.
* struct timeval tv;
* gettimeofday(&tv, NULL);
* Timestamp timestamp;
* timestamp.set_seconds(tv.tv_sec);
* timestamp.set_nanos(tv.tv_usec * 1000);
* Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
* FILETIME ft;
* GetSystemTimeAsFileTime(&ft);
* UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
* // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
* // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
* Timestamp timestamp;
* timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
* timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
* Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
* long millis = System.currentTimeMillis();
* Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
* .setNanos((int) ((millis % 1000) * 1000000)).build();
* Example 5: Compute Timestamp from current time in Python.
* timestamp = Timestamp()
* timestamp.GetCurrentTime()
* # JSON Mapping
* In JSON format, the Timestamp type is encoded as a string in the
* [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
* format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
* where {year} is always expressed using four digits while {month}, {day},
* {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
* seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
* are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
* is required, though only UTC (as indicated by "Z") is presently supported.
* For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
* 01:30 UTC on January 15, 2017.
* In JavaScript, one can convert a Date object to this format using the
* standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString]
* method. In Python, a standard `datetime.datetime` object can be converted
* to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime)
* with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one
* can use the Joda Time's [`ISODateTimeFormat.dateTime()`](
* http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime())
* to obtain a formatter capable of generating timestamps in this format.
*
* Generated from protobuf message <code>google.protobuf.Timestamp</code>
*/
class
Timestamp
extends
\Google\Protobuf\Internal\Message
{
/**
* Represents seconds of UTC time since Unix epoch
* 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
* 9999-12-31T23:59:59Z inclusive.
*
* Generated from protobuf field <code>int64 seconds = 1;</code>
*/
private
$seconds
=
0
;
/**
* Non-negative fractions of a second at nanosecond resolution. Negative
* second values with fractions must still have non-negative nanos values
* that count forward in time. Must be from 0 to 999,999,999
* inclusive.
*
* Generated from protobuf field <code>int32 nanos = 2;</code>
*/
private
$nanos
=
0
;
public
function
__construct
()
{
\GPBMetadata\Google\Protobuf\Timestamp
::
initOnce
();
parent
::
__construct
();
}
/**
* Represents seconds of UTC time since Unix epoch
* 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
* 9999-12-31T23:59:59Z inclusive.
*
* Generated from protobuf field <code>int64 seconds = 1;</code>
* @return int|string
*/
public
function
getSeconds
()
{
return
$this
->
seconds
;
}
/**
* Represents seconds of UTC time since Unix epoch
* 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
* 9999-12-31T23:59:59Z inclusive.
*
* Generated from protobuf field <code>int64 seconds = 1;</code>
* @param int|string $var
* @return $this
*/
public
function
setSeconds
(
$var
)
{
GPBUtil
::
checkInt64
(
$var
);
$this
->
seconds
=
$var
;
return
$this
;
}
/**
* Non-negative fractions of a second at nanosecond resolution. Negative
* second values with fractions must still have non-negative nanos values
* that count forward in time. Must be from 0 to 999,999,999
* inclusive.
*
* Generated from protobuf field <code>int32 nanos = 2;</code>
* @return int
*/
public
function
getNanos
()
{
return
$this
->
nanos
;
}
/**
* Non-negative fractions of a second at nanosecond resolution. Negative
* second values with fractions must still have non-negative nanos values
* that count forward in time. Must be from 0 to 999,999,999
* inclusive.
*
* Generated from protobuf field <code>int32 nanos = 2;</code>
* @param int $var
* @return $this
*/
public
function
setNanos
(
$var
)
{
GPBUtil
::
checkInt32
(
$var
);
$this
->
nanos
=
$var
;
return
$this
;
}
/**
* Converts PHP DateTime to Timestamp.
*
* @param DateTime $datetime
*/
public
function
fromDateTime
(
$datetime
)
{
if
(
get_class
(
$datetime
)
!==
\DateTime
::
class
)
{
trigger_error
(
"Given parameter is not a DateTime."
,
E_USER_ERROR
);
}
$this
->
seconds
=
$datetime
->
format
(
'U'
);
$this
->
nanos
=
0
;
}
/**
* Converts Timestamp to PHP DateTime. Nano second is ignored.
*
* @return DateTime $datetime
*/
public
function
toDateTime
()
{
return
\DateTime
::
createFromFormat
(
'U'
,
$this
->
seconds
);
}
}
php/tests/well_known_test.php
View file @
b70e0fdf
...
...
@@ -5,6 +5,7 @@ require_once('test_util.php');
use
Google\Protobuf\GPBEmpty
;
use
Google\Protobuf\Any
;
use
Google\Protobuf\Timestamp
;
use
Foo\TestMessage
;
...
...
@@ -86,4 +87,24 @@ class WellKnownTest extends TestBase {
$any
->
setValue
(
"abc"
);
$any
->
unpack
();
}
public
function
testTimestamp
()
{
$timestamp
=
new
Timestamp
();
$timestamp
->
setSeconds
(
1
);
$timestamp
->
setNanos
(
2
);
$this
->
assertEquals
(
1
,
$timestamp
->
getSeconds
());
$this
->
assertSame
(
2
,
$timestamp
->
getNanos
());
date_default_timezone_set
(
'UTC'
);
$from
=
new
DateTime
(
'2011-01-01T15:03:01.012345UTC'
);
$timestamp
->
fromDateTime
(
$from
);
$this
->
assertEquals
(
$from
->
format
(
'U'
),
$timestamp
->
getSeconds
());
$this
->
assertSame
(
0
,
$timestamp
->
getNanos
());
$to
=
$timestamp
->
toDateTime
();
$this
->
assertSame
(
\DateTime
::
class
,
get_class
(
$to
));
$this
->
assertSame
(
$from
->
format
(
'U'
),
$to
->
format
(
'U'
));
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment