Skip to content

Commit dd046cc

Browse files
committed
Merge pull request #1022
2 parents 0fb7e6d + 7a98fb6 commit dd046cc

11 files changed

+874
-29
lines changed

src/BSON/ObjectId.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,11 +198,11 @@ static PHP_METHOD(ObjectId, serialize)
198198
}
199199

200200
#if PHP_VERSION_ID >= 70000
201-
array_init_size(&retval, 2);
201+
array_init_size(&retval, 1);
202202
ADD_ASSOC_STRINGL(&retval, "oid", intern->oid, 24);
203203
#else
204204
ALLOC_INIT_ZVAL(retval);
205-
array_init_size(retval, 2);
205+
array_init_size(retval, 1);
206206
ADD_ASSOC_STRINGL(retval, "oid", intern->oid, 24);
207207
#endif
208208

src/MongoDB/ReadConcern.c

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616

1717
#include <php.h>
1818
#include <Zend/zend_interfaces.h>
19+
#include <ext/standard/php_var.h>
20+
#if PHP_VERSION_ID >= 70000
21+
#include <zend_smart_str.h>
22+
#else
23+
#include <ext/standard/php_smart_str.h>
24+
#endif
1925

2026
#ifdef HAVE_CONFIG_H
2127
#include "config.h"
@@ -197,6 +203,102 @@ static PHP_METHOD(ReadConcern, bsonSerialize)
197203
convert_to_object(return_value);
198204
} /* }}} */
199205

206+
/* {{{ proto string MongoDB\Driver\ReadConcern::serialize()
207+
*/
208+
static PHP_METHOD(ReadConcern, serialize)
209+
{
210+
php_phongo_readconcern_t* intern;
211+
ZVAL_RETVAL_TYPE retval;
212+
php_serialize_data_t var_hash;
213+
smart_str buf = { 0 };
214+
const char* level;
215+
216+
intern = Z_READCONCERN_OBJ_P(getThis());
217+
218+
if (zend_parse_parameters_none() == FAILURE) {
219+
return;
220+
}
221+
222+
if (!intern->read_concern) {
223+
return;
224+
}
225+
226+
level = mongoc_read_concern_get_level(intern->read_concern);
227+
228+
if (!level) {
229+
PHONGO_RETURN_STRING("");
230+
}
231+
232+
#if PHP_VERSION_ID >= 70000
233+
array_init_size(&retval, 1);
234+
ADD_ASSOC_STRING(&retval, "level", level);
235+
#else
236+
ALLOC_INIT_ZVAL(retval);
237+
array_init_size(retval, 1);
238+
ADD_ASSOC_STRING(retval, "level", level);
239+
#endif
240+
241+
PHP_VAR_SERIALIZE_INIT(var_hash);
242+
php_var_serialize(&buf, &retval, &var_hash TSRMLS_CC);
243+
smart_str_0(&buf);
244+
PHP_VAR_SERIALIZE_DESTROY(var_hash);
245+
246+
PHONGO_RETVAL_SMART_STR(buf);
247+
248+
smart_str_free(&buf);
249+
zval_ptr_dtor(&retval);
250+
} /* }}} */
251+
252+
/* {{{ proto void MongoDB\Driver\ReadConcern::unserialize(string $serialized)
253+
*/
254+
static PHP_METHOD(ReadConcern, unserialize)
255+
{
256+
php_phongo_readconcern_t* intern;
257+
zend_error_handling error_handling;
258+
char* serialized;
259+
phongo_zpp_char_len serialized_len;
260+
#if PHP_VERSION_ID >= 70000
261+
zval props;
262+
#else
263+
zval* props;
264+
#endif
265+
php_unserialize_data_t var_hash;
266+
267+
intern = Z_READCONCERN_OBJ_P(getThis());
268+
269+
zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC);
270+
271+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &serialized, &serialized_len) == FAILURE) {
272+
zend_restore_error_handling(&error_handling TSRMLS_CC);
273+
return;
274+
}
275+
zend_restore_error_handling(&error_handling TSRMLS_CC);
276+
277+
if (!serialized_len) {
278+
return;
279+
}
280+
281+
#if PHP_VERSION_ID < 70000
282+
ALLOC_INIT_ZVAL(props);
283+
#endif
284+
PHP_VAR_UNSERIALIZE_INIT(var_hash);
285+
if (!php_var_unserialize(&props, (const unsigned char**) &serialized, (unsigned char*) serialized + serialized_len, &var_hash TSRMLS_CC)) {
286+
zval_ptr_dtor(&props);
287+
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "%s unserialization failed", ZSTR_VAL(php_phongo_readconcern_ce->name));
288+
289+
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
290+
return;
291+
}
292+
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
293+
294+
#if PHP_VERSION_ID >= 70000
295+
php_phongo_readconcern_init_from_hash(intern, HASH_OF(&props) TSRMLS_CC);
296+
#else
297+
php_phongo_readconcern_init_from_hash(intern, HASH_OF(props) TSRMLS_CC);
298+
#endif
299+
zval_ptr_dtor(&props);
300+
} /* }}} */
301+
200302
/* {{{ MongoDB\Driver\ReadConcern function entries */
201303
ZEND_BEGIN_ARG_INFO_EX(ai_ReadConcern___construct, 0, 0, 0)
202304
ZEND_ARG_INFO(0, level)
@@ -206,6 +308,10 @@ ZEND_BEGIN_ARG_INFO_EX(ai_ReadConcern___set_state, 0, 0, 1)
206308
ZEND_ARG_ARRAY_INFO(0, properties, 0)
207309
ZEND_END_ARG_INFO()
208310

311+
ZEND_BEGIN_ARG_INFO_EX(ai_ReadConcern_unserialize, 0, 0, 1)
312+
ZEND_ARG_INFO(0, serialized)
313+
ZEND_END_ARG_INFO()
314+
209315
ZEND_BEGIN_ARG_INFO_EX(ai_ReadConcern_void, 0, 0, 0)
210316
ZEND_END_ARG_INFO()
211317

@@ -216,6 +322,8 @@ static zend_function_entry php_phongo_readconcern_me[] = {
216322
PHP_ME(ReadConcern, getLevel, ai_ReadConcern_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
217323
PHP_ME(ReadConcern, isDefault, ai_ReadConcern_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
218324
PHP_ME(ReadConcern, bsonSerialize, ai_ReadConcern_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
325+
PHP_ME(ReadConcern, serialize, ai_ReadConcern_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
326+
PHP_ME(ReadConcern, unserialize, ai_ReadConcern_unserialize, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
219327
PHP_FE_END
220328
/* clang-format on */
221329
};
@@ -287,9 +395,9 @@ void php_phongo_readconcern_init_ce(INIT_FUNC_ARGS) /* {{{ */
287395
php_phongo_readconcern_ce = zend_register_internal_class(&ce TSRMLS_CC);
288396
php_phongo_readconcern_ce->create_object = php_phongo_readconcern_create_object;
289397
PHONGO_CE_FINAL(php_phongo_readconcern_ce);
290-
PHONGO_CE_DISABLE_SERIALIZATION(php_phongo_readconcern_ce);
291398

292399
zend_class_implements(php_phongo_readconcern_ce TSRMLS_CC, 1, php_phongo_serializable_ce);
400+
zend_class_implements(php_phongo_readconcern_ce TSRMLS_CC, 1, zend_ce_serializable);
293401

294402
memcpy(&php_phongo_handler_readconcern, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
295403
php_phongo_handler_readconcern.get_debug_info = php_phongo_readconcern_get_debug_info;

src/MongoDB/ReadPreference.c

Lines changed: 160 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616

1717
#include <php.h>
1818
#include <Zend/zend_interfaces.h>
19+
#include <ext/standard/php_var.h>
20+
#if PHP_VERSION_ID >= 70000
21+
#include <zend_smart_str.h>
22+
#else
23+
#include <ext/standard/php_smart_str.h>
24+
#endif
1925

2026
#ifdef HAVE_CONFIG_H
2127
#include "config.h"
@@ -369,6 +375,26 @@ static PHP_METHOD(ReadPreference, getTagSets)
369375
}
370376
} /* }}} */
371377

378+
static const char* php_phongo_readpreference_get_mode_string(mongoc_read_mode_t mode) /* {{{ */
379+
{
380+
switch (mode) {
381+
case MONGOC_READ_PRIMARY:
382+
return "primary";
383+
case MONGOC_READ_PRIMARY_PREFERRED:
384+
return "primaryPreferred";
385+
case MONGOC_READ_SECONDARY:
386+
return "secondary";
387+
case MONGOC_READ_SECONDARY_PREFERRED:
388+
return "secondaryPreferred";
389+
case MONGOC_READ_NEAREST:
390+
return "nearest";
391+
default: /* Do nothing */
392+
break;
393+
}
394+
395+
return NULL;
396+
} /* }}} */
397+
372398
static HashTable* php_phongo_readpreference_get_properties_hash(zval* object, bool is_debug TSRMLS_DC) /* {{{ */
373399
{
374400
php_phongo_readpreference_t* intern;
@@ -387,26 +413,7 @@ static HashTable* php_phongo_readpreference_get_properties_hash(zval* object, bo
387413

388414
tags = mongoc_read_prefs_get_tags(intern->read_preference);
389415
mode = mongoc_read_prefs_get_mode(intern->read_preference);
390-
391-
switch (mode) {
392-
case MONGOC_READ_PRIMARY:
393-
modeString = "primary";
394-
break;
395-
case MONGOC_READ_PRIMARY_PREFERRED:
396-
modeString = "primaryPreferred";
397-
break;
398-
case MONGOC_READ_SECONDARY:
399-
modeString = "secondary";
400-
break;
401-
case MONGOC_READ_SECONDARY_PREFERRED:
402-
modeString = "secondaryPreferred";
403-
break;
404-
case MONGOC_READ_NEAREST:
405-
modeString = "nearest";
406-
break;
407-
default: /* Do nothing */
408-
break;
409-
}
416+
modeString = php_phongo_readpreference_get_mode_string(mode);
410417

411418
if (modeString) {
412419
#if PHP_VERSION_ID >= 70000
@@ -471,6 +478,132 @@ static PHP_METHOD(ReadPreference, bsonSerialize)
471478
convert_to_object(return_value);
472479
} /* }}} */
473480

481+
/* {{{ proto string MongoDB\Driver\ReadPreference::serialize()
482+
*/
483+
static PHP_METHOD(ReadPreference, serialize)
484+
{
485+
php_phongo_readpreference_t* intern;
486+
ZVAL_RETVAL_TYPE retval;
487+
php_serialize_data_t var_hash;
488+
smart_str buf = { 0 };
489+
const char* modeString = NULL;
490+
const bson_t* tags;
491+
int64_t maxStalenessSeconds;
492+
mongoc_read_mode_t mode;
493+
494+
intern = Z_READPREFERENCE_OBJ_P(getThis());
495+
496+
if (zend_parse_parameters_none() == FAILURE) {
497+
return;
498+
}
499+
500+
if (!intern->read_preference) {
501+
return;
502+
}
503+
504+
tags = mongoc_read_prefs_get_tags(intern->read_preference);
505+
mode = mongoc_read_prefs_get_mode(intern->read_preference);
506+
modeString = php_phongo_readpreference_get_mode_string(mode);
507+
maxStalenessSeconds = mongoc_read_prefs_get_max_staleness_seconds(intern->read_preference);
508+
509+
#if PHP_VERSION_ID >= 70000
510+
array_init_size(&retval, 3);
511+
#else
512+
ALLOC_INIT_ZVAL(retval);
513+
array_init_size(retval, 3);
514+
#endif
515+
516+
if (modeString) {
517+
#if PHP_VERSION_ID >= 70000
518+
ADD_ASSOC_STRING(&retval, "mode", modeString);
519+
#else
520+
ADD_ASSOC_STRING(retval, "mode", modeString);
521+
#endif
522+
}
523+
524+
if (!bson_empty0(tags)) {
525+
php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER;
526+
/* Use native arrays for debugging output */
527+
state.map.root_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
528+
state.map.document_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
529+
530+
php_phongo_bson_to_zval_ex(bson_get_data(tags), tags->len, &state);
531+
#if PHP_VERSION_ID >= 70000
532+
ADD_ASSOC_ZVAL_EX(&retval, "tags", &state.zchild);
533+
#else
534+
ADD_ASSOC_ZVAL_EX(retval, "tags", state.zchild);
535+
#endif
536+
}
537+
538+
if (maxStalenessSeconds != MONGOC_NO_MAX_STALENESS) {
539+
#if PHP_VERSION_ID >= 70000
540+
ADD_ASSOC_LONG_EX(&retval, "maxStalenessSeconds", maxStalenessSeconds);
541+
#else
542+
ADD_ASSOC_LONG_EX(retval, "maxStalenessSeconds", maxStalenessSeconds);
543+
#endif
544+
}
545+
546+
PHP_VAR_SERIALIZE_INIT(var_hash);
547+
php_var_serialize(&buf, &retval, &var_hash TSRMLS_CC);
548+
smart_str_0(&buf);
549+
PHP_VAR_SERIALIZE_DESTROY(var_hash);
550+
551+
PHONGO_RETVAL_SMART_STR(buf);
552+
553+
smart_str_free(&buf);
554+
zval_ptr_dtor(&retval);
555+
} /* }}} */
556+
557+
/* {{{ proto void MongoDB\Driver\ReadPreference::unserialize(string $serialized)
558+
*/
559+
static PHP_METHOD(ReadPreference, unserialize)
560+
{
561+
php_phongo_readpreference_t* intern;
562+
zend_error_handling error_handling;
563+
char* serialized;
564+
phongo_zpp_char_len serialized_len;
565+
#if PHP_VERSION_ID >= 70000
566+
zval props;
567+
#else
568+
zval* props;
569+
#endif
570+
php_unserialize_data_t var_hash;
571+
572+
intern = Z_READPREFERENCE_OBJ_P(getThis());
573+
574+
zend_replace_error_handling(EH_THROW, phongo_exception_from_phongo_domain(PHONGO_ERROR_INVALID_ARGUMENT), &error_handling TSRMLS_CC);
575+
576+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &serialized, &serialized_len) == FAILURE) {
577+
zend_restore_error_handling(&error_handling TSRMLS_CC);
578+
return;
579+
}
580+
zend_restore_error_handling(&error_handling TSRMLS_CC);
581+
582+
if (!serialized_len) {
583+
return;
584+
}
585+
586+
#if PHP_VERSION_ID < 70000
587+
ALLOC_INIT_ZVAL(props);
588+
#endif
589+
PHP_VAR_UNSERIALIZE_INIT(var_hash);
590+
if (!php_var_unserialize(&props, (const unsigned char**) &serialized, (unsigned char*) serialized + serialized_len, &var_hash TSRMLS_CC)) {
591+
zval_ptr_dtor(&props);
592+
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "%s unserialization failed", ZSTR_VAL(php_phongo_readpreference_ce->name));
593+
594+
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
595+
return;
596+
}
597+
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
598+
599+
#if PHP_VERSION_ID >= 70000
600+
php_phongo_readpreference_init_from_hash(intern, HASH_OF(&props) TSRMLS_CC);
601+
#else
602+
php_phongo_readpreference_init_from_hash(intern, HASH_OF(props) TSRMLS_CC);
603+
#endif
604+
zval_ptr_dtor(&props);
605+
} /* }}} */
606+
474607
/* {{{ MongoDB\Driver\ReadPreference function entries */
475608
ZEND_BEGIN_ARG_INFO_EX(ai_ReadPreference___construct, 0, 0, 1)
476609
ZEND_ARG_INFO(0, mode)
@@ -482,6 +615,10 @@ ZEND_BEGIN_ARG_INFO_EX(ai_ReadPreference___set_state, 0, 0, 1)
482615
ZEND_ARG_ARRAY_INFO(0, properties, 0)
483616
ZEND_END_ARG_INFO()
484617

618+
ZEND_BEGIN_ARG_INFO_EX(ai_ReadPreference_unserialize, 0, 0, 1)
619+
ZEND_ARG_INFO(0, serialized)
620+
ZEND_END_ARG_INFO()
621+
485622
ZEND_BEGIN_ARG_INFO_EX(ai_ReadPreference_void, 0, 0, 0)
486623
ZEND_END_ARG_INFO()
487624

@@ -493,6 +630,8 @@ static zend_function_entry php_phongo_readpreference_me[] = {
493630
PHP_ME(ReadPreference, getMode, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
494631
PHP_ME(ReadPreference, getTagSets, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
495632
PHP_ME(ReadPreference, bsonSerialize, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
633+
PHP_ME(ReadPreference, serialize, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
634+
PHP_ME(ReadPreference, unserialize, ai_ReadPreference_unserialize, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
496635
PHP_FE_END
497636
/* clang-format on */
498637
};
@@ -565,9 +704,9 @@ void php_phongo_readpreference_init_ce(INIT_FUNC_ARGS) /* {{{ */
565704
php_phongo_readpreference_ce = zend_register_internal_class(&ce TSRMLS_CC);
566705
php_phongo_readpreference_ce->create_object = php_phongo_readpreference_create_object;
567706
PHONGO_CE_FINAL(php_phongo_readpreference_ce);
568-
PHONGO_CE_DISABLE_SERIALIZATION(php_phongo_readpreference_ce);
569707

570708
zend_class_implements(php_phongo_readpreference_ce TSRMLS_CC, 1, php_phongo_serializable_ce);
709+
zend_class_implements(php_phongo_readpreference_ce TSRMLS_CC, 1, zend_ce_serializable);
571710

572711
memcpy(&php_phongo_handler_readpreference, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
573712
php_phongo_handler_readpreference.get_debug_info = php_phongo_readpreference_get_debug_info;

0 commit comments

Comments
 (0)