Skip to content

Commit 5c366ee

Browse files
committed
Fixed PHPC-506: Use more descriptive messages in WriteExceptions
1 parent 3f9be21 commit 5c366ee

8 files changed

+63
-9
lines changed

php_phongo.c

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,56 @@ mongoc_bulk_operation_t *phongo_bulkwrite_init(zend_bool ordered) { /* {{{ */
522522
return mongoc_bulk_operation_new(ordered);
523523
} /* }}} */
524524

525+
static void phongo_bulk_write_error_add_message(char **tmp_msg, bson_t *errors)
526+
{
527+
bson_iter_t iter;
528+
529+
bson_iter_init(&iter, errors);
530+
531+
while (bson_iter_next(&iter)) {
532+
bson_t cbson;
533+
uint32_t len;
534+
const uint8_t *data;
535+
bson_iter_t inner_iter;
536+
537+
if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) {
538+
continue;
539+
}
540+
541+
bson_iter_document(&iter, &len, &data);
542+
543+
if (!bson_init_static(&cbson, data, len)) {
544+
continue;
545+
}
546+
547+
if (bson_iter_init_find(&inner_iter, &cbson, "errmsg") && BSON_ITER_HOLDS_UTF8(&inner_iter)) {
548+
char *tmp_errmsg = bson_iter_dup_utf8(&inner_iter, NULL);
549+
550+
*tmp_msg = erealloc(*tmp_msg, strlen(*tmp_msg) + strlen(tmp_errmsg) + 5);
551+
strncpy(*tmp_msg + strlen(*tmp_msg), " :: ", 5);
552+
strncpy(*tmp_msg + strlen(*tmp_msg), tmp_errmsg, strlen(tmp_errmsg) + 1);
553+
efree(tmp_errmsg);
554+
}
555+
}
556+
}
557+
558+
static char* phongo_assemble_bulk_write_error(mongoc_write_result_t *write_result)
559+
{
560+
char *tmp_msg = emalloc(sizeof("BulkWrite error"));
561+
562+
strncpy(tmp_msg, "BulkWrite error", sizeof("BulkWrite error"));
563+
564+
if (!bson_empty0(&write_result->writeErrors)) {
565+
phongo_bulk_write_error_add_message(&tmp_msg, &write_result->writeErrors);
566+
}
567+
568+
if (!bson_empty0(&write_result->writeConcernErrors)) {
569+
phongo_bulk_write_error_add_message(&tmp_msg, &write_result->writeConcernErrors);
570+
}
571+
572+
return tmp_msg;
573+
}
574+
525575
bool phongo_execute_write(mongoc_client_t *client, const char *namespace, mongoc_bulk_operation_t *bulk, const mongoc_write_concern_t *write_concern, int server_id, zval *return_value, int return_value_used TSRMLS_DC) /* {{{ */
526576
{
527577
bson_error_t error;
@@ -576,7 +626,11 @@ bool phongo_execute_write(mongoc_client_t *client, const char *namespace, mongoc
576626
/* FIXME: Maybe we can look at write_result.error and not pass error at all? */
577627
phongo_throw_exception_from_bson_error_t(&error TSRMLS_CC);
578628
} else {
579-
phongo_throw_exception(PHONGO_ERROR_WRITE_FAILED TSRMLS_CC, "BulkWrite error");
629+
char *bulk_error_msg;
630+
631+
bulk_error_msg = phongo_assemble_bulk_write_error(&writeresult->write_result);
632+
phongo_throw_exception(PHONGO_ERROR_WRITE_FAILED TSRMLS_CC, "%s", bulk_error_msg);
633+
efree(bulk_error_msg);
580634
phongo_add_exception_prop(ZEND_STRL("writeResult"), return_value TSRMLS_CC);
581635
}
582636
return false;

tests/manager/manager-executeBulkWrite-011.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ var_dump(iterator_to_array($cursor));
5353
<?php exit(0); ?>
5454
--EXPECTF--
5555
OK: Got MongoDB\Driver\Exception\BulkWriteException
56-
BulkWrite error
56+
BulkWrite error :: Document failed validation
5757
OK: Got MongoDB\Driver\Exception\BulkWriteException
58-
BulkWrite error
58+
BulkWrite error :: Document failed validation
5959
array(3) {
6060
[0]=>
6161
object(stdClass)#%d (2) {

tests/manager/manager-executeBulkWrite_error-001.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var_dump(iterator_to_array($cursor));
3232
===DONE===
3333
<?php exit(0); ?>
3434
--EXPECTF--
35-
BulkWriteException: BulkWrite error
35+
BulkWriteException: BulkWrite error :: E11000 duplicate key error %s: phongo.manager_manager_executeBulkWrite_error_001%sdup key: { : 1 }
3636

3737
===> WriteResult
3838
server: %s:%d

tests/manager/manager-executeBulkWrite_error-002.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var_dump(iterator_to_array($cursor));
3232
===DONE===
3333
<?php exit(0); ?>
3434
--EXPECTF--
35-
BulkWriteException: BulkWrite error
35+
BulkWriteException: BulkWrite error :: E11000 duplicate key error %s: phongo.manager_manager_executeBulkWrite_error_002%sdup key: { : 1 } :: E11000 duplicate key error %s: phongo.manager_manager_executeBulkWrite_error_002%sdup key: { : 2 }
3636

3737
===> WriteResult
3838
server: %s:%d

tests/manager/manager-executeBulkWrite_error-003.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ var_dump(iterator_to_array($cursor));
2929
===DONE===
3030
<?php exit(0); ?>
3131
--EXPECTF--
32-
BulkWriteException: BulkWrite error
32+
BulkWriteException: BulkWrite error :: Not enough data-bearing nodes
3333

3434
===> WriteResult
3535
server: %s:%d

tests/manager/manager-executeBulkWrite_error-004.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ var_dump(iterator_to_array($cursor));
3333
===DONE===
3434
<?php exit(0); ?>
3535
--EXPECTF--
36-
BulkWriteException: BulkWrite error
36+
BulkWriteException: BulkWrite error :: unknown top level operator: $foo
3737

3838
===> WriteResult
3939
server: %s:%d

tests/manager/manager-executeBulkWrite_error-005.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ try {
2424
===DONE===
2525
<?php exit(0); ?>
2626
--EXPECTF--
27-
BulkWriteException: BulkWrite error
27+
BulkWriteException: BulkWrite error :: Document can't have $ prefixed field names: $foo
2828

2929
===> WriteResult
3030
server: %s:%d

tests/manager/manager-executeBulkWrite_error-006.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ try {
2828
===DONE===
2929
<?php exit(0); ?>
3030
--EXPECTF--
31-
BulkWriteException: BulkWrite error
31+
BulkWriteException: BulkWrite error :: Unknown modifier: $foo
3232

3333
===> WriteResult
3434
server: %s:%d

0 commit comments

Comments
 (0)