Skip to content

Commit 95fa6cc

Browse files
committed
PHPC-2494: Handle null error fields in BulkWriteCommandResult
Always return arrays for writeErrors and writeConcernErrors
1 parent d21dadd commit 95fa6cc

File tree

3 files changed

+30
-24
lines changed

3 files changed

+30
-24
lines changed

src/MongoDB/BulkWriteCommandResult.c

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ static bool php_phongo_bulkwritecommandresult_get_writeconcernerrors(php_phongo_
4545

4646
array_init(return_value);
4747

48+
if (!intern->write_concern_errors) {
49+
return true;
50+
}
51+
4852
for (bson_iter_init(&iter, intern->write_concern_errors); bson_iter_next(&iter);) {
4953
bson_t bson;
5054
uint32_t len;
@@ -78,6 +82,10 @@ static bool php_phongo_bulkwritecommandresult_get_writeerrors(php_phongo_bulkwri
7882

7983
array_init(return_value);
8084

85+
if (!intern->write_errors) {
86+
return true;
87+
}
88+
8189
for (bson_iter_init(&iter, intern->write_errors); bson_iter_next(&iter);) {
8290
bson_t bson;
8391
uint32_t len;
@@ -246,7 +254,6 @@ static PHP_METHOD(MongoDB_Driver_BulkWriteCommandResult, getWriteConcernErrors)
246254

247255
PHONGO_PARSE_PARAMETERS_NONE();
248256

249-
// TODO: null handling
250257
php_phongo_bulkwritecommandresult_get_writeconcernerrors(intern, return_value);
251258
}
252259

@@ -259,7 +266,6 @@ static PHP_METHOD(MongoDB_Driver_BulkWriteCommandResult, getWriteErrors)
259266

260267
PHONGO_PARSE_PARAMETERS_NONE();
261268

262-
// TODO: null handling
263269
php_phongo_bulkwritecommandresult_get_writeerrors(intern, return_value);
264270
}
265271

@@ -271,8 +277,9 @@ static PHP_METHOD(MongoDB_Driver_BulkWriteCommandResult, getErrorReply)
271277

272278
PHONGO_PARSE_PARAMETERS_NONE();
273279

274-
// TODO: null handling
275-
phongo_document_new(return_value, intern->error_reply, true);
280+
if (intern->error_reply) {
281+
phongo_document_new(return_value, intern->error_reply, true);
282+
}
276283
}
277284

278285
/* Returns whether the write operation was acknowledged (based on the write
@@ -364,22 +371,18 @@ static HashTable* php_phongo_bulkwritecommandresult_get_debug_info(zend_object*
364371
ADD_ASSOC_NULL_EX(&retval, "deleteResults");
365372
}
366373

367-
if (intern->write_errors) {
374+
{
368375
zval writeerrors;
369376

370377
php_phongo_bulkwritecommandresult_get_writeerrors(intern, &writeerrors);
371378
ADD_ASSOC_ZVAL_EX(&retval, "writeErrors", &writeerrors);
372-
} else {
373-
ADD_ASSOC_NULL_EX(&retval, "writeErrors");
374379
}
375380

376-
if (intern->write_concern_errors) {
381+
{
377382
zval writeconcernerrors;
378383

379384
php_phongo_bulkwritecommandresult_get_writeconcernerrors(intern, &writeconcernerrors);
380385
ADD_ASSOC_ZVAL_EX(&retval, "writeConcernErrors", &writeconcernerrors);
381-
} else {
382-
ADD_ASSOC_NULL_EX(&retval, "writeConcernErrors");
383386
}
384387

385388
if (intern->error_reply) {
@@ -416,6 +419,11 @@ void php_phongo_bulkwritecommandresult_init_ce(INIT_FUNC_ARGS)
416419
php_phongo_handler_bulkwritecommandresult.offset = XtOffsetOf(php_phongo_bulkwritecommandresult_t, std);
417420
}
418421

422+
static inline bson_t* _bson_copy_or_null (const bson_t* bson)
423+
{
424+
return bson_empty0(bson) ? NULL : bson_copy(bson);
425+
}
426+
419427
php_phongo_bulkwritecommandresult_t* phongo_bulkwritecommandresult_init(zval* return_value, mongoc_bulkwritereturn_t* bw_ret, zval* manager)
420428
{
421429
php_phongo_bulkwritecommandresult_t* bwcr;
@@ -433,20 +441,18 @@ php_phongo_bulkwritecommandresult_t* phongo_bulkwritecommandresult_init(zval* re
433441
bwcr->modified_count = mongoc_bulkwriteresult_modifiedcount(bw_ret->res);
434442
bwcr->deleted_count = mongoc_bulkwriteresult_deletedcount(bw_ret->res);
435443

436-
#define BSON_COPY_OR_NULL(bson) ((bson) ? bson_copy(bson) : NULL)
437-
bwcr->insert_results = BSON_COPY_OR_NULL(mongoc_bulkwriteresult_insertresults(bw_ret->res));
438-
bwcr->update_results = BSON_COPY_OR_NULL(mongoc_bulkwriteresult_updateresults(bw_ret->res));
439-
bwcr->delete_results = BSON_COPY_OR_NULL(mongoc_bulkwriteresult_deleteresults(bw_ret->res));
440-
#undef BSON_COPY_OR_NULL
444+
bwcr->insert_results = _bson_copy_or_null(mongoc_bulkwriteresult_insertresults(bw_ret->res));
445+
bwcr->update_results = _bson_copy_or_null(mongoc_bulkwriteresult_updateresults(bw_ret->res));
446+
bwcr->delete_results = _bson_copy_or_null(mongoc_bulkwriteresult_deleteresults(bw_ret->res));
441447

442448
bwcr->server_id = mongoc_bulkwriteresult_serverid(bw_ret->res);
443449
}
444450

445451
// Copy mongoc_bulkwriteexception_t fields
446452
if (bw_ret->exc) {
447-
bwcr->error_reply = bson_copy(mongoc_bulkwriteexception_errorreply(bw_ret->exc));
448-
bwcr->write_errors = bson_copy(mongoc_bulkwriteexception_writeerrors(bw_ret->exc));
449-
bwcr->write_concern_errors = bson_copy(mongoc_bulkwriteexception_writeconcernerrors(bw_ret->exc));
453+
bwcr->error_reply = _bson_copy_or_null(mongoc_bulkwriteexception_errorreply(bw_ret->exc));
454+
bwcr->write_errors = _bson_copy_or_null(mongoc_bulkwriteexception_writeerrors(bw_ret->exc));
455+
bwcr->write_concern_errors = _bson_copy_or_null(mongoc_bulkwriteexception_writeconcernerrors(bw_ret->exc));
450456
}
451457

452458
ZVAL_ZVAL(&bwcr->manager, manager, 1, 0);

src/MongoDB/BulkWriteCommandResult.stub.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ final public function getUpdateResults(): ?\MongoDB\BSON\Document {}
3030

3131
final public function getDeleteResults(): ?\MongoDB\BSON\Document {}
3232

33-
final public function getWriteErrors(): ?\MongoDB\BSON\Document {}
33+
final public function getWriteErrors(): array {}
3434

35-
final public function getWriteConcernErrors(): ?\MongoDB\BSON\PackedArray {}
35+
final public function getWriteConcernErrors(): array {}
3636

3737
final public function getErrorReply(): ?\MongoDB\BSON\Document {}
3838

src/MongoDB/BulkWriteCommandResult_arginfo.h

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)