Skip to content

Commit f167da9

Browse files
committed
PHPC-1499: Add functions to convert zval to bson_value_t and back
1 parent 3847154 commit f167da9

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

php_bson.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ bool php_phongo_bson_to_zval(const unsigned char* data, int data_len, zval* out)
101101
#else
102102
bool php_phongo_bson_to_zval(const unsigned char* data, int data_len, zval** out);
103103
#endif
104+
bool php_phongo_bson_value_to_zval(const bson_value_t* value, zval* zv);
105+
void php_phongo_zval_to_bson_value(zval* data, php_phongo_bson_flags_t flags, bson_value_t* value TSRMLS_DC);
104106
bool php_phongo_bson_typemap_to_state(zval* typemap, php_phongo_bson_typemap* map TSRMLS_DC);
105107
void php_phongo_bson_state_ctor(php_phongo_bson_state* state);
106108
void php_phongo_bson_state_dtor(php_phongo_bson_state* state);

src/bson-encode.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,44 @@ void php_phongo_zval_to_bson(zval* data, php_phongo_bson_flags_t flags, bson_t*
648648
php_phongo_field_path_free(field_path);
649649
} /* }}} */
650650

651+
/* Converts the argument to a bson_value_t. If the object is an instance of
652+
* MongoDB\BSON\Serializable, the return value of bsonSerialize() will be
653+
* used. */
654+
void php_phongo_zval_to_bson_value(zval* data, php_phongo_bson_flags_t flags, bson_value_t* value TSRMLS_DC) /* {{{ */
655+
{
656+
bson_iter_t iter;
657+
bson_t bson = BSON_INITIALIZER;
658+
659+
#if PHP_VERSION_ID >= 70000
660+
zval* data_object = ecalloc(sizeof(zval), 1);
661+
#else
662+
zval* data_object = NULL;
663+
ALLOC_INIT_ZVAL(data_object);
664+
#endif
665+
666+
array_init_size(data_object, 1);
667+
add_assoc_zval(data_object, "data", data);
668+
669+
#if PHP_VERSION_ID >= 70000
670+
Z_TRY_ADDREF_P(data);
671+
#else
672+
Z_ADDREF_P(data);
673+
#endif
674+
675+
php_phongo_zval_to_bson(data_object, flags, &bson, NULL TSRMLS_CC);
676+
677+
if (bson_iter_init_find(&iter, &bson, "data")) {
678+
bson_value_copy(bson_iter_value(&iter), value);
679+
}
680+
681+
#if PHP_VERSION_ID >= 70000
682+
zval_ptr_dtor(data_object);
683+
efree(data_object);
684+
#else
685+
zval_ptr_dtor(&data_object);
686+
#endif
687+
} /* }}} */
688+
651689
/*
652690
* Local variables:
653691
* tab-width: 4

src/bson.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,6 +1221,40 @@ bool php_phongo_bson_to_zval(const unsigned char* data, int data_len, zval** zv)
12211221
return retval;
12221222
} /* }}} */
12231223

1224+
/* Converts a BSON value to a ZVAL. */
1225+
bool php_phongo_bson_value_to_zval(const bson_value_t* value, zval* zv) /* {{{ */
1226+
{
1227+
bson_t bson = BSON_INITIALIZER;
1228+
php_phongo_bson_state state;
1229+
zval* return_value;
1230+
bool retval = false;
1231+
1232+
PHONGO_BSON_INIT_STATE(state);
1233+
state.map.root_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
1234+
1235+
bson_append_value(&bson, "data", 4, value);
1236+
if (!php_phongo_bson_to_zval_ex(bson_get_data(&bson), bson.len, &state)) {
1237+
/* Exception already thrown */
1238+
goto cleanup;
1239+
}
1240+
1241+
retval = true;
1242+
1243+
#if PHP_VERSION_ID >= 70000
1244+
return_value = php_array_fetchc(&state.zchild, "data");
1245+
#else
1246+
return_value = php_array_fetchc(state.zchild, "data");
1247+
#endif
1248+
1249+
if (return_value) {
1250+
ZVAL_ZVAL(zv, return_value, 1, 0);
1251+
}
1252+
1253+
cleanup:
1254+
zval_ptr_dtor(&state.zchild);
1255+
return retval;
1256+
} /* }}} */
1257+
12241258
/* Converts a BSON document to a PHP value according to the typemap specified in
12251259
* the state argument.
12261260
*

0 commit comments

Comments
 (0)