@@ -202,17 +202,105 @@ static PHP_METHOD(ReadPreference, getTagSets)
202202 }
203203} /* }}} */
204204
205+ static HashTable * php_phongo_readpreference_get_properties_hash (zval * object , bool is_debug TSRMLS_DC ) /* {{{ */
206+ {
207+ php_phongo_readpreference_t * intern ;
208+ HashTable * props ;
209+ const char * modeString = NULL ;
210+ const bson_t * tags ;
211+ mongoc_read_mode_t mode ;
212+
213+ intern = Z_READPREFERENCE_OBJ_P (object );
214+
215+ PHONGO_GET_PROPERTY_HASH_INIT_PROPS (is_debug , intern , props , 3 );
216+
217+ if (!intern -> read_preference ) {
218+ return props ;
219+ }
220+
221+ tags = mongoc_read_prefs_get_tags (intern -> read_preference );
222+ mode = mongoc_read_prefs_get_mode (intern -> read_preference );
223+
224+ switch (mode ) {
225+ case MONGOC_READ_PRIMARY :
226+ modeString = "primary" ;
227+ break ;
228+ case MONGOC_READ_PRIMARY_PREFERRED :
229+ modeString = "primaryPreferred" ;
230+ break ;
231+ case MONGOC_READ_SECONDARY :
232+ modeString = "secondary" ;
233+ break ;
234+ case MONGOC_READ_SECONDARY_PREFERRED :
235+ modeString = "secondaryPreferred" ;
236+ break ;
237+ case MONGOC_READ_NEAREST :
238+ modeString = "nearest" ;
239+ break ;
240+ default : /* Do nothing */
241+ break ;
242+ }
243+
244+ if (modeString ) {
245+ #if PHP_VERSION_ID >= 70000
246+ zval z_mode ;
247+
248+ ZVAL_STRING (& z_mode , modeString );
249+ zend_hash_str_update (props , "mode" , sizeof ("mode" ) - 1 , & z_mode );
250+ #else
251+ zval * z_mode ;
252+
253+ MAKE_STD_ZVAL (z_mode );
254+ ZVAL_STRING (z_mode , modeString , 1 );
255+ zend_hash_update (props , "mode" , sizeof ("mode" ), & z_mode , sizeof (z_mode ), NULL );
256+ #endif
257+ }
258+
259+ if (!bson_empty0 (tags )) {
260+ /* Use PHONGO_TYPEMAP_NATIVE_ARRAY for the root type since tags is an
261+ * array; however, inner documents and arrays can use the default. */
262+ php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER ;
263+ state .map .root_type = PHONGO_TYPEMAP_NATIVE_ARRAY ;
264+
265+ php_phongo_bson_to_zval_ex (bson_get_data (tags ), tags -> len , & state );
266+ #if PHP_VERSION_ID >= 70000
267+ Z_ADDREF (state .zchild );
268+ zend_hash_str_update (props , "tags" , sizeof ("tags" ) - 1 , & state .zchild );
269+ #else
270+ Z_ADDREF_P (state .zchild );
271+ zend_hash_update (props , "tags" , sizeof ("tags" ), & state .zchild , sizeof (state .zchild ), NULL );
272+ #endif
273+ zval_ptr_dtor (& state .zchild );
274+ }
275+
276+ if (mongoc_read_prefs_get_max_staleness_seconds (intern -> read_preference ) != MONGOC_NO_MAX_STALENESS ) {
277+ long maxStalenessSeconds = mongoc_read_prefs_get_max_staleness_seconds (intern -> read_preference );
278+ #if PHP_VERSION_ID >= 70000
279+ zval z_max_ss ;
280+
281+ ZVAL_LONG (& z_max_ss , maxStalenessSeconds );
282+ zend_hash_str_update (props , "maxStalenessSeconds" , sizeof ("maxStalenessSeconds" ) - 1 , & z_max_ss );
283+ #else
284+ zval * z_max_ss ;
285+
286+ MAKE_STD_ZVAL (z_max_ss );
287+ ZVAL_LONG (z_max_ss , maxStalenessSeconds );
288+ zend_hash_update (props , "maxStalenessSeconds" , sizeof ("maxStalenessSeconds" ), & z_max_ss , sizeof (z_max_ss ), NULL );
289+ #endif
290+ }
291+
292+ return props ;
293+ } /* }}} */
294+
205295/* {{{ proto array MongoDB\Driver\ReadPreference::bsonSerialize()
206296*/
207297static PHP_METHOD (ReadPreference , bsonSerialize )
208298{
209- const mongoc_read_prefs_t * read_preference = phongo_read_preference_from_zval (getThis () TSRMLS_CC );
210-
211299 if (zend_parse_parameters_none () == FAILURE ) {
212300 return ;
213301 }
214302
215- php_phongo_read_preference_to_zval (return_value , read_preference );
303+ ZVAL_ARR (return_value , php_phongo_readpreference_get_properties_hash ( getThis (), true TSRMLS_CC ) );
216304 convert_to_object (return_value );
217305} /* }}} */
218306
@@ -247,6 +335,11 @@ static void php_phongo_readpreference_free_object(phongo_free_object_arg* object
247335
248336 zend_object_std_dtor (& intern -> std TSRMLS_CC );
249337
338+ if (intern -> properties ) {
339+ zend_hash_destroy (intern -> properties );
340+ FREE_HASHTABLE (intern -> properties );
341+ }
342+
250343 if (intern -> read_preference ) {
251344 mongoc_read_prefs_destroy (intern -> read_preference );
252345 }
@@ -282,14 +375,13 @@ static phongo_create_object_retval php_phongo_readpreference_create_object(zend_
282375
283376static HashTable * php_phongo_readpreference_get_debug_info (zval * object , int * is_temp TSRMLS_DC ) /* {{{ */
284377{
285- zval retval = ZVAL_STATIC_INIT ;
286- const mongoc_read_prefs_t * read_prefs = phongo_read_preference_from_zval (object TSRMLS_CC );
287-
288378 * is_temp = 1 ;
379+ return php_phongo_readpreference_get_properties_hash (object , true TSRMLS_CC );
380+ } /* }}} */
289381
290- php_phongo_read_preference_to_zval ( & retval , read_prefs );
291-
292- return Z_ARRVAL ( retval );
382+ static HashTable * php_phongo_readpreference_get_properties ( zval * object TSRMLS_DC ) /* {{{ */
383+ {
384+ return php_phongo_readpreference_get_properties_hash ( object , false TSRMLS_CC );
293385} /* }}} */
294386/* }}} */
295387
@@ -307,6 +399,7 @@ void php_phongo_readpreference_init_ce(INIT_FUNC_ARGS) /* {{{ */
307399
308400 memcpy (& php_phongo_handler_readpreference , phongo_get_std_object_handlers (), sizeof (zend_object_handlers ));
309401 php_phongo_handler_readpreference .get_debug_info = php_phongo_readpreference_get_debug_info ;
402+ php_phongo_handler_readpreference .get_properties = php_phongo_readpreference_get_properties ;
310403#if PHP_VERSION_ID >= 70000
311404 php_phongo_handler_readpreference .free_obj = php_phongo_readpreference_free_object ;
312405 php_phongo_handler_readpreference .offset = XtOffsetOf (php_phongo_readpreference_t , std );
0 commit comments