@@ -1400,13 +1400,14 @@ PHP_METHOD(MongoCollection, findOne)
1400
1400
Atomically update and return a document */
1401
1401
PHP_METHOD (MongoCollection , findAndModify )
1402
1402
{
1403
- zval * query , * update = 0 , * fields = 0 , * options = 0 ;
1403
+ HashTable * query = NULL , * update = NULL , * fields = NULL ;
1404
+ zval * zquery = NULL , * zupdate = NULL , * zfields = NULL , * options = NULL ;
1404
1405
zval * cmd , * retval , * * values ;
1405
1406
mongo_connection * used_connection ;
1406
1407
mongo_collection * c ;
1407
1408
mongo_db * db ;
1408
1409
1409
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "a!|a!a !a!" , & query , & update , & fields , & options ) == FAILURE ) {
1410
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "H!|H!H !a!" , & query , & update , & fields , & options ) == FAILURE ) {
1410
1411
return ;
1411
1412
}
1412
1413
@@ -1421,18 +1422,27 @@ PHP_METHOD(MongoCollection, findAndModify)
1421
1422
add_assoc_zval (cmd , "findandmodify" , c -> name );
1422
1423
zval_add_ref (& c -> name );
1423
1424
1424
- if (query && zend_hash_num_elements (Z_ARRVAL_P (query )) > 0 ) {
1425
- add_assoc_zval (cmd , "query" , query );
1426
- zval_add_ref (& query );
1425
+ if (query && zend_hash_num_elements (query ) > 0 ) {
1426
+ MAKE_STD_ZVAL (zquery );
1427
+ array_init (zquery );
1428
+ zend_hash_copy (HASH_P (zquery ), query , (copy_ctor_func_t ) zval_add_ref , NULL , sizeof (zval * ));
1429
+ add_assoc_zval (cmd , "query" , zquery );
1427
1430
}
1428
- if (update && zend_hash_num_elements (Z_ARRVAL_P (update )) > 0 ) {
1429
- add_assoc_zval (cmd , "update" , update );
1430
- zval_add_ref (& update );
1431
+
1432
+ if (update && zend_hash_num_elements (update ) > 0 ) {
1433
+ MAKE_STD_ZVAL (zupdate );
1434
+ array_init (zupdate );
1435
+ zend_hash_copy (HASH_P (zupdate ), update , (copy_ctor_func_t ) zval_add_ref , NULL , sizeof (zval * ));
1436
+ add_assoc_zval (cmd , "update" , zupdate );
1431
1437
}
1432
- if (fields && zend_hash_num_elements (Z_ARRVAL_P (fields )) > 0 ) {
1433
- add_assoc_zval (cmd , "fields" , fields );
1434
- zval_add_ref (& fields );
1438
+
1439
+ if (fields && zend_hash_num_elements (fields ) > 0 ) {
1440
+ MAKE_STD_ZVAL (zfields );
1441
+ array_init (zfields );
1442
+ zend_hash_copy (HASH_P (zfields ), fields , (copy_ctor_func_t ) zval_add_ref , NULL , sizeof (zval * ));
1443
+ add_assoc_zval (cmd , "fields" , zfields );
1435
1444
}
1445
+
1436
1446
if (options && zend_hash_num_elements (Z_ARRVAL_P (options )) > 0 ) {
1437
1447
zval * temp ;
1438
1448
zend_hash_merge (HASH_P (cmd ), HASH_P (options ), (void (* )(void * ))zval_add_ref , & temp , sizeof (zval * ), 1 );
@@ -3064,9 +3074,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_find_one, 0, ZEND_RETURN_VALUE, 0)
3064
3074
ZEND_END_ARG_INFO ()
3065
3075
3066
3076
ZEND_BEGIN_ARG_INFO_EX (arginfo_findandmodify , 0 , ZEND_RETURN_VALUE , 1 )
3067
- ZEND_ARG_ARRAY_INFO (0 , query , 1 )
3068
- ZEND_ARG_ARRAY_INFO (0 , update , 1 )
3069
- ZEND_ARG_ARRAY_INFO (0 , fields , 1 )
3077
+ ZEND_ARG_INFO (0 , query )
3078
+ ZEND_ARG_INFO (0 , update )
3079
+ ZEND_ARG_INFO (0 , fields )
3070
3080
ZEND_ARG_ARRAY_INFO (0 , options , 1 )
3071
3081
ZEND_END_ARG_INFO ()
3072
3082
0 commit comments