Skip to content

Commit 5f3503c

Browse files
authored
PHPC-2165: Expose server error replies in BulkWriteResult (#1385)
1 parent a0b5fc1 commit 5f3503c

13 files changed

+121
-4
lines changed

src/MongoDB/WriteResult.c

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,32 @@ static bool php_phongo_writeresult_get_writeerrors(php_phongo_writeresult_t* int
117117
return true;
118118
}
119119

120+
static bool php_phongo_writeresult_get_error_replies(php_phongo_writeresult_t* intern, zval* return_value)
121+
{
122+
bson_iter_t iter, child;
123+
124+
array_init(return_value);
125+
126+
if (bson_iter_init_find(&iter, intern->reply, "errorReplies") && BSON_ITER_HOLDS_ARRAY(&iter) && bson_iter_recurse(&iter, &child)) {
127+
while (bson_iter_next(&child)) {
128+
uint32_t len;
129+
const uint8_t* data;
130+
zval error_reply;
131+
132+
if (!BSON_ITER_HOLDS_DOCUMENT(&child)) {
133+
continue;
134+
}
135+
136+
bson_iter_document(&child, &len, &data);
137+
php_phongo_bson_data_to_zval(data, len, &error_reply);
138+
139+
add_next_index_zval(return_value, &error_reply);
140+
}
141+
}
142+
143+
return true;
144+
}
145+
120146
PHONGO_DISABLED_CONSTRUCTOR(MongoDB_Driver_WriteResult)
121147
PHONGO_DISABLED_WAKEUP(MongoDB_Driver_WriteResult)
122148

@@ -273,6 +299,17 @@ static PHP_METHOD(MongoDB_Driver_WriteResult, getWriteErrors)
273299
php_phongo_writeresult_get_writeerrors(intern, return_value);
274300
}
275301

302+
static PHP_METHOD(MongoDB_Driver_WriteResult, getErrorReplies)
303+
{
304+
php_phongo_writeresult_t* intern;
305+
306+
intern = Z_WRITERESULT_OBJ_P(getThis());
307+
308+
PHONGO_PARSE_PARAMETERS_NONE();
309+
310+
php_phongo_writeresult_get_error_replies(intern, return_value);
311+
}
312+
276313
/* Returns whether the write operation was acknowledged (based on the write
277314
concern). */
278315
static PHP_METHOD(MongoDB_Driver_WriteResult, isAcknowledged)
@@ -328,7 +365,7 @@ static HashTable* php_phongo_writeresult_get_debug_info(phongo_compat_object_han
328365

329366
intern = Z_OBJ_WRITERESULT(PHONGO_COMPAT_GET_OBJ(object));
330367
*is_temp = 1;
331-
array_init_size(&retval, 9);
368+
array_init_size(&retval, 10);
332369

333370
#define PHONGO_WRITERESULT_SCP(field) \
334371
if (bson_iter_init_find(&iter, intern->reply, (field)) && BSON_ITER_HOLDS_INT32(&iter)) { \
@@ -386,6 +423,13 @@ static HashTable* php_phongo_writeresult_get_debug_info(phongo_compat_object_han
386423
ADD_ASSOC_NULL_EX(&retval, "writeConcern");
387424
}
388425

426+
{
427+
zval error_replies;
428+
429+
php_phongo_writeresult_get_error_replies(intern, &error_replies);
430+
ADD_ASSOC_ZVAL_EX(&retval, "errorReplies", &error_replies);
431+
}
432+
389433
done:
390434
return Z_ARRVAL(retval);
391435
}

src/MongoDB/WriteResult.stub.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ final public function getWriteConcernError(): ?WriteConcernError {}
2929

3030
final public function getWriteErrors(): array {}
3131

32+
final public function getErrorReplies(): array {}
33+
3234
final public function isAcknowledged(): bool {}
3335

3436
final public function __wakeup(): void {}

src/MongoDB/WriteResult_arginfo.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: eae27215b994b4941296f69331abd6d1a3173df7 */
2+
* Stub hash: 279a9a00d54bf67c310f7b8802a5868bf1d507eb */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_MongoDB_Driver_WriteResult___construct, 0, 0, 0)
55
ZEND_END_ARG_INFO()
@@ -26,6 +26,8 @@ ZEND_END_ARG_INFO()
2626

2727
#define arginfo_class_MongoDB_Driver_WriteResult_getWriteErrors arginfo_class_MongoDB_Driver_WriteResult_getUpsertedIds
2828

29+
#define arginfo_class_MongoDB_Driver_WriteResult_getErrorReplies arginfo_class_MongoDB_Driver_WriteResult_getUpsertedIds
30+
2931
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_MongoDB_Driver_WriteResult_isAcknowledged, 0, 0, _IS_BOOL, 0)
3032
ZEND_END_ARG_INFO()
3133

@@ -43,6 +45,7 @@ static ZEND_METHOD(MongoDB_Driver_WriteResult, getServer);
4345
static ZEND_METHOD(MongoDB_Driver_WriteResult, getUpsertedIds);
4446
static ZEND_METHOD(MongoDB_Driver_WriteResult, getWriteConcernError);
4547
static ZEND_METHOD(MongoDB_Driver_WriteResult, getWriteErrors);
48+
static ZEND_METHOD(MongoDB_Driver_WriteResult, getErrorReplies);
4649
static ZEND_METHOD(MongoDB_Driver_WriteResult, isAcknowledged);
4750
static ZEND_METHOD(MongoDB_Driver_WriteResult, __wakeup);
4851

@@ -58,6 +61,7 @@ static const zend_function_entry class_MongoDB_Driver_WriteResult_methods[] = {
5861
ZEND_ME(MongoDB_Driver_WriteResult, getUpsertedIds, arginfo_class_MongoDB_Driver_WriteResult_getUpsertedIds, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
5962
ZEND_ME(MongoDB_Driver_WriteResult, getWriteConcernError, arginfo_class_MongoDB_Driver_WriteResult_getWriteConcernError, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
6063
ZEND_ME(MongoDB_Driver_WriteResult, getWriteErrors, arginfo_class_MongoDB_Driver_WriteResult_getWriteErrors, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
64+
ZEND_ME(MongoDB_Driver_WriteResult, getErrorReplies, arginfo_class_MongoDB_Driver_WriteResult_getErrorReplies, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
6165
ZEND_ME(MongoDB_Driver_WriteResult, isAcknowledged, arginfo_class_MongoDB_Driver_WriteResult_isAcknowledged, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
6266
ZEND_ME(MongoDB_Driver_WriteResult, __wakeup, arginfo_class_MongoDB_Driver_WriteResult___wakeup, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
6367
ZEND_FE_END

tests/exception/bulkwriteexception-getwriteresult-001.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,8 @@ object(MongoDB\Driver\WriteResult)#%d (%d) {
5656
["writeConcern"]=>
5757
object(MongoDB\Driver\WriteConcern)#%d (%d) {
5858
}
59+
["errorReplies"]=>
60+
array(0) {
61+
}
5962
}
6063
===DONE===

tests/manager/manager-executeBulkWrite_error-005.phpt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ try {
3939
--EXPECTF--
4040
MongoDB\Driver\Exception\BulkWriteException(0): Bulk write failed due to previous MongoDB\Driver\Exception\ConnectionTimeoutException: Failed to send "delete" command with database "%s": Failed to read 4 bytes: socket error or timeout
4141
MongoDB\Driver\Exception\ConnectionTimeoutException(%d): Failed to send "delete" command with database "%s": Failed to read 4 bytes: socket error or timeout
42-
object(MongoDB\Driver\WriteResult)#%d (9) {
42+
object(MongoDB\Driver\WriteResult)#%d (%d) {
4343
["nInserted"]=>
4444
int(1)
4545
["nMatched"]=>
@@ -59,7 +59,10 @@ object(MongoDB\Driver\WriteResult)#%d (9) {
5959
["writeConcernError"]=>
6060
NULL
6161
["writeConcern"]=>
62-
object(MongoDB\Driver\WriteConcern)#%d (0) {
62+
object(MongoDB\Driver\WriteConcern)#%d (%d) {
63+
}
64+
["errorReplies"]=>
65+
array(0) {
6366
}
6467
}
6568
===DONE===

tests/replicaset/writeresult-getserver-002.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ object(MongoDB\Driver\WriteResult)#%d (%d) {
8383
["w"]=>
8484
int(1)
8585
}
86+
["errorReplies"]=>
87+
array(0) {
88+
}
8689
}
8790
string(%d) "%s"
8891
int(%d)

tests/server/server-executeBulkWrite-001.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ object(MongoDB\Driver\WriteResult)#%d (%d) {
7373
["writeConcern"]=>
7474
object(MongoDB\Driver\WriteConcern)#%d (%d) {
7575
}
76+
["errorReplies"]=>
77+
array(0) {
78+
}
7679
}
7780

7881
===> Collection

tests/standalone/writeresult-isacknowledged-001.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,8 @@ object(MongoDB\Driver\WriteResult)#%d (%d) {
4444
["writeConcern"]=>
4545
object(MongoDB\Driver\WriteConcern)#%d (%d) {
4646
}
47+
["errorReplies"]=>
48+
array(0) {
49+
}
4750
}
4851
===DONE===

tests/standalone/writeresult-isacknowledged-002.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,8 @@ object(MongoDB\Driver\WriteResult)#%d (%d) {
4949
["w"]=>
5050
int(0)
5151
}
52+
["errorReplies"]=>
53+
array(0) {
54+
}
5255
}
5356
===DONE===

tests/standalone/writeresult-isacknowledged-003.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,8 @@ object(MongoDB\Driver\WriteResult)#%d (%d) {
4646
["w"]=>
4747
int(0)
4848
}
49+
["errorReplies"]=>
50+
array(0) {
51+
}
4952
}
5053
===DONE===

tests/writeResult/writeresult-debug-001.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,8 @@ object(MongoDB\Driver\WriteResult)#%d (%d) {
6767
["writeConcern"]=>
6868
object(MongoDB\Driver\WriteConcern)#%d (%d) {
6969
}
70+
["errorReplies"]=>
71+
array(0) {
72+
}
7073
}
7174
===DONE===

tests/writeResult/writeresult-debug-002.phpt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,8 @@ object(MongoDB\Driver\WriteResult)#%d (%d) {
115115
["w"]=>
116116
int(30)
117117
}
118+
["errorReplies"]=>
119+
array(0) {
120+
}
118121
}
119122
===DONE===
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
--TEST--
2+
MongoDB\Driver\WriteResult::getErrorReplies()
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php skip_if_not_live(); ?>
6+
<?php skip_if_not_clean(); ?>
7+
<?php skip_if_no_failcommand_failpoint(); ?>
8+
--FILE--
9+
<?php
10+
require_once __DIR__ . "/../utils/basic.inc";
11+
12+
$manager = create_test_manager();
13+
$server = $manager->selectServer();
14+
15+
configureTargetedFailPoint(
16+
$server,
17+
'failCommand',
18+
['times' => 1] ,
19+
['errorCode' => 8, 'failCommands' => ['insert']]
20+
);
21+
22+
$errors = [];
23+
try {
24+
$bulk = new MongoDB\Driver\BulkWrite;
25+
$bulk->insert(['_id' => 1, 'x' => 'bar']);
26+
$server->executeBulkWrite(NS, $bulk);
27+
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
28+
$errors = $e->getWriteResult()->getErrorReplies();
29+
}
30+
31+
var_dump(count($errors));
32+
var_dump($errors[0]->code);
33+
34+
?>
35+
===DONE===
36+
<?php exit(0); ?>
37+
--EXPECT--
38+
int(1)
39+
int(8)
40+
===DONE===

0 commit comments

Comments
 (0)