@@ -512,9 +512,10 @@ php_phongo_writeresult_t *phongo_writeresult_init(zval *return_value, mongoc_wri
512
512
SCP (nRemoved );
513
513
SCP (nUpserted );
514
514
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 );
518
519
SCP (upsert_append_count );
519
520
#undef SCP
520
521
@@ -684,10 +685,7 @@ bool phongo_execute_write(mongoc_client_t *client, const char *namespace, mongoc
684
685
/* The Write failed */
685
686
if (!success ) {
686
687
/* 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 )) {
691
689
/* FIXME: Maybe we can look at write_result.error and not pass error at all? */
692
690
phongo_throw_exception_from_bson_error_t (& error TSRMLS_CC );
693
691
} else {
@@ -2022,25 +2020,30 @@ bool php_phongo_writeresult_get_write_errors(php_phongo_writeresult_t *writeresu
2022
2020
}
2023
2021
return false;
2024
2022
} /* }}} */
2023
+
2025
2024
bool php_phongo_writeresult_get_writeconcern_error (php_phongo_writeresult_t * writeresult , bson_error_t * error ) /* {{{ */
2026
2025
{
2027
2026
const char * err = NULL ;
2028
2027
uint32_t code = 0 ;
2028
+ bson_iter_t iter ;
2029
+ bson_iter_t citer ;
2029
2030
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
+ }
2038
2042
}
2039
2043
2040
2044
bson_set_error (error , PHONGO_ERROR_WRITECONCERN_FAILED , code , "%s" , err );
2041
2045
return true;
2042
2046
}
2043
-
2044
2047
return false;
2045
2048
} /* }}} */
2046
2049
zval * php_phongo_throw_write_errors (php_phongo_writeresult_t * wr TSRMLS_DC ) /* {{{ */
0 commit comments