@@ -512,9 +512,10 @@ php_phongo_writeresult_t *phongo_writeresult_init(zval *return_value, mongoc_wri
512512 SCP (nRemoved );
513513 SCP (nUpserted );
514514
515- bson_copy_to (& write_result -> upserted , & writeresult -> write_result .upserted );
516- bson_copy_to (& write_result -> writeConcernError , & writeresult -> write_result .writeConcernError );
517- bson_copy_to (& write_result -> writeErrors , & writeresult -> write_result .writeErrors );
515+ bson_copy_to (& write_result -> upserted , & writeresult -> write_result .upserted );
516+ SCP (n_writeConcernErrors );
517+ bson_copy_to (& write_result -> writeConcernErrors , & writeresult -> write_result .writeConcernErrors );
518+ bson_copy_to (& write_result -> writeErrors , & writeresult -> write_result .writeErrors );
518519 SCP (upsert_append_count );
519520#undef SCP
520521
@@ -684,10 +685,7 @@ bool phongo_execute_write(mongoc_client_t *client, const char *namespace, mongoc
684685 /* The Write failed */
685686 if (!success ) {
686687 /* The Command itself failed */
687- if (
688- bson_empty0 (& writeresult -> write_result .writeErrors )
689- && bson_empty0 (& writeresult -> write_result .writeConcernError )
690- ) {
688+ if (bson_empty0 (& writeresult -> write_result .writeErrors ) && bson_empty0 (& writeresult -> write_result .writeConcernErrors )) {
691689 /* FIXME: Maybe we can look at write_result.error and not pass error at all? */
692690 phongo_throw_exception_from_bson_error_t (& error TSRMLS_CC );
693691 } else {
@@ -2022,25 +2020,30 @@ bool php_phongo_writeresult_get_write_errors(php_phongo_writeresult_t *writeresu
20222020 }
20232021 return false;
20242022} /* }}} */
2023+
20252024bool php_phongo_writeresult_get_writeconcern_error (php_phongo_writeresult_t * writeresult , bson_error_t * error ) /* {{{ */
20262025{
20272026 const char * err = NULL ;
20282027 uint32_t code = 0 ;
2028+ bson_iter_t iter ;
2029+ bson_iter_t citer ;
20292030
2030- if (!bson_empty0 (& writeresult -> write_result .writeConcernError )) {
2031- bson_iter_t iter ;
2032-
2033- if (bson_iter_init_find (& iter , & writeresult -> write_result .writeConcernError , "code" ) && BSON_ITER_HOLDS_INT32 (& iter )) {
2034- code = bson_iter_int32 (& iter );
2035- }
2036- if (bson_iter_init_find (& iter , & writeresult -> write_result .writeConcernError , "errmsg" ) && BSON_ITER_HOLDS_UTF8 (& iter )) {
2037- err = bson_iter_utf8 (& iter , NULL );
2031+ if (!bson_empty0 (& writeresult -> write_result .writeConcernErrors ) &&
2032+ bson_iter_init (& iter , & writeresult -> write_result .writeConcernErrors ) &&
2033+ bson_iter_next (& iter ) &&
2034+ BSON_ITER_HOLDS_DOCUMENT (& iter ) &&
2035+ bson_iter_recurse (& iter , & citer )) {
2036+ while (bson_iter_next (& citer )) {
2037+ if (BSON_ITER_IS_KEY (& citer , "errmsg" )) {
2038+ err = bson_iter_utf8 (& citer , NULL );
2039+ } else if (BSON_ITER_IS_KEY (& citer , "code" )) {
2040+ code = bson_iter_int32 (& citer );
2041+ }
20382042 }
20392043
20402044 bson_set_error (error , PHONGO_ERROR_WRITECONCERN_FAILED , code , "%s" , err );
20412045 return true;
20422046 }
2043-
20442047 return false;
20452048} /* }}} */
20462049zval * php_phongo_throw_write_errors (php_phongo_writeresult_t * wr TSRMLS_DC ) /* {{{ */
0 commit comments