aboutsummaryrefslogtreecommitdiffhomepage
path: root/php/ext/google/protobuf/message.c
diff options
context:
space:
mode:
authorGravatar Paul Yang <TeBoring@users.noreply.github.com>2017-03-01 10:39:48 -0800
committerGravatar GitHub <noreply@github.com>2017-03-01 10:39:48 -0800
commitbcbaabe53a8d661f5a473d2a157a4278ad8bf579 (patch)
tree173e7e07319f10451e2ec290c00cba89a34b647e /php/ext/google/protobuf/message.c
parent7339fc04c49a055ec0688cd0cb24cf7ea64f7783 (diff)
Add mergeFrom method on Message (#2766)
This method merges the contents of the specified message into the current message. Singular fields that are set in the specified message overwrite the corresponding fields in the current message. Repeated fields are appended. Map fields key-value pairs are overritten. Singular/Oneof sub-messages are recursively merged. All overritten sub-messages are deep-copied.
Diffstat (limited to 'php/ext/google/protobuf/message.c')
-rw-r--r--php/ext/google/protobuf/message.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
index 46da9024..b35df311 100644
--- a/php/ext/google/protobuf/message.c
+++ b/php/ext/google/protobuf/message.c
@@ -43,6 +43,7 @@ static zend_function_entry message_methods[] = {
PHP_ME(Message, decode, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Message, jsonEncode, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Message, jsonDecode, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(Message, mergeFrom, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Message, readOneof, NULL, ZEND_ACC_PROTECTED)
PHP_ME(Message, writeOneof, NULL, ZEND_ACC_PROTECTED)
PHP_ME(Message, whichOneof, NULL, ZEND_ACC_PROTECTED)
@@ -209,6 +210,13 @@ static zend_object_value message_create(zend_class_entry* ce TSRMLS_DC) {
return return_value;
}
+void message_create_with_type(zend_class_entry* ce, zval** message TSRMLS_DC) {
+ MAKE_STD_ZVAL(*message);
+ Z_TYPE_PP(message) = IS_OBJECT;
+ Z_OBJVAL_PP(message) = ce->create_object(ce TSRMLS_CC);
+ Z_DELREF_PP(message);
+}
+
void build_class_from_descriptor(zval* php_descriptor TSRMLS_DC) {
Descriptor* desc = UNBOX(Descriptor, php_descriptor);
@@ -260,6 +268,26 @@ PHP_METHOD(Message, clear) {
msg->std.properties_table TSRMLS_CC);
}
+PHP_METHOD(Message, mergeFrom) {
+ zval* value;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &value,
+ message_type) == FAILURE) {
+ return;
+ }
+
+ MessageHeader* from =
+ (MessageHeader*)zend_object_store_get_object(value TSRMLS_CC);
+ MessageHeader* to =
+ (MessageHeader*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ if(from->descriptor != to->descriptor) {
+ zend_error(E_USER_ERROR, "Cannot merge messages with different class.");
+ return;
+ }
+
+ layout_merge(from->descriptor->layout, from, to TSRMLS_CC);
+}
+
PHP_METHOD(Message, readOneof) {
long index;