Skip to content

Commit 5732362

Browse files
committed
PHPC-436: Handle new writeConcernErrors array in mongoc_write_result_t
1 parent 356ced1 commit 5732362

File tree

2 files changed

+46
-20
lines changed

2 files changed

+46
-20
lines changed

php_phongo.c

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
20252024
bool 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
} /* }}} */
20462049
zval* php_phongo_throw_write_errors(php_phongo_writeresult_t *wr TSRMLS_DC) /* {{{ */

src/MongoDB/WriteResult.c

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,33 @@ PHP_METHOD(WriteResult, getWriteConcernError)
250250
}
251251

252252

253-
if (!bson_empty0(&intern->write_result.writeConcernError)) {
254-
object_init_ex(return_value, php_phongo_writeconcernerror_ce);
255-
if (!phongo_writeconcernerror_init(return_value, &intern->write_result.writeConcernError TSRMLS_CC)) {
256-
zval_ptr_dtor(&return_value);
253+
if (!bson_empty0(&intern->write_result.writeConcernErrors)) {
254+
bson_iter_t iter;
255+
256+
bson_iter_init(&iter, &intern->write_result.writeConcernErrors);
257+
258+
while (bson_iter_next(&iter)) {
259+
bson_t cbson;
260+
uint32_t len;
261+
const uint8_t *data;
262+
263+
if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) {
264+
continue;
265+
}
266+
267+
bson_iter_document(&iter, &len, &data);
268+
269+
if (!bson_init_static(&cbson, data, len)) {
270+
continue;
271+
}
272+
273+
object_init_ex(return_value, php_phongo_writeconcernerror_ce);
274+
275+
if (!phongo_writeconcernerror_init(return_value, &cbson TSRMLS_CC)) {
276+
zval_ptr_dtor(&return_value);
277+
}
278+
279+
return;
257280
}
258281
}
259282
}

0 commit comments

Comments
 (0)