Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 9 additions & 17 deletions src/MongoDB/WriteConcernError.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,25 +92,16 @@ static zend_object* phongo_writeconcernerror_create_object(zend_class_entry* cla
return &intern->std;
}

static HashTable* phongo_writeconcernerror_get_debug_info(zend_object* object, int* is_temp)
static void phongo_writeconcernerror_update_properties(phongo_writeconcernerror_t* intern)
{
PHONGO_INTERN_FROM_Z_OBJ(writeconcernerror, object);

zval retval = ZVAL_STATIC_INIT;

*is_temp = 1;
zend_update_property_string(phongo_writeconcernerror_ce, &intern->std, ZEND_STRL("message"), intern->message ? intern->message : "");
zend_update_property_long(phongo_writeconcernerror_ce, &intern->std, ZEND_STRL("code"), intern->code);

array_init_size(&retval, 3);
ADD_ASSOC_STRING(&retval, "message", intern->message ? intern->message : "");
ADD_ASSOC_LONG_EX(&retval, "code", intern->code);
if (!Z_ISUNDEF(intern->info)) {
Z_ADDREF(intern->info);
ADD_ASSOC_ZVAL_EX(&retval, "info", &intern->info);
zend_update_property(phongo_writeconcernerror_ce, &intern->std, ZEND_STRL("info"), &intern->info);
} else {
ADD_ASSOC_NULL_EX(&retval, "info");
zend_update_property_null(phongo_writeconcernerror_ce, &intern->std, ZEND_STRL("info"));
}

return Z_ARRVAL(retval);
}

void phongo_writeconcernerror_init_ce(INIT_FUNC_ARGS)
Expand All @@ -119,9 +110,8 @@ void phongo_writeconcernerror_init_ce(INIT_FUNC_ARGS)
phongo_writeconcernerror_ce->create_object = phongo_writeconcernerror_create_object;

memcpy(&phongo_handler_writeconcernerror, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
phongo_handler_writeconcernerror.get_debug_info = phongo_writeconcernerror_get_debug_info;
phongo_handler_writeconcernerror.free_obj = phongo_writeconcernerror_free_object;
phongo_handler_writeconcernerror.offset = XtOffsetOf(phongo_writeconcernerror_t, std);
phongo_handler_writeconcernerror.free_obj = phongo_writeconcernerror_free_object;
phongo_handler_writeconcernerror.offset = XtOffsetOf(phongo_writeconcernerror_t, std);
}

/* Initializes a new WriteConcernError in return_value using the BSON document.
Expand Down Expand Up @@ -166,5 +156,7 @@ bool phongo_writeconcernerror_init(zval* return_value, const bson_t* bson)
}
}

phongo_writeconcernerror_update_properties(intern);

return true;
}
6 changes: 6 additions & 0 deletions src/MongoDB/WriteConcernError.stub.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ final class WriteConcernError
{
final private function __construct() {}

public readonly string $message;

public readonly int $code;

public readonly object|null $info;

final public function getCode(): int {}

final public function getInfo(): ?object {}
Expand Down
16 changes: 15 additions & 1 deletion src/MongoDB/WriteConcernError_arginfo.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 19 additions & 19 deletions tests/utils/tools.php
Original file line number Diff line number Diff line change
Expand Up @@ -713,21 +713,21 @@ function printWriteResult(WriteResult $result, $details = true)
{
printServer($result->getServer());

printf("insertedCount: %d\n", $result->getInsertedCount());
printf("matchedCount: %d\n", $result->getMatchedCount());
printf("modifiedCount: %d\n", $result->getModifiedCount());
printf("upsertedCount: %d\n", $result->getUpsertedCount());
printf("deletedCount: %d\n", $result->getDeletedCount());
printf("insertedCount: %d\n", $result->insertedCount);
printf("matchedCount: %d\n", $result->matchedCount);
printf("modifiedCount: %d\n", $result->modifiedCount);
printf("upsertedCount: %d\n", $result->upsertedCount);
printf("deletedCount: %d\n", $result->deletedCount);

foreach ($result->getUpsertedIds() as $index => $id) {
foreach ($result->upsertedIds as $index => $id) {
printf("upsertedId[%d]: ", $index);
var_dump($id);
}

$writeConcernError = $result->getWriteConcernError();
$writeConcernError = $result->writeConcernError;
printWriteConcernError($writeConcernError ? $writeConcernError : null, $details);

foreach ($result->getWriteErrors() as $writeError) {
foreach ($result->writeErrors as $writeError) {
printWriteError($writeError);
}
}
Expand All @@ -737,38 +737,38 @@ function printWriteConcernError(?WriteConcernError $error = null, $details = nul
if ($error) {
/* This stuff is generated by the server, no need for us to test it */
if (!$details) {
printf("writeConcernError: %s (%d)\n", $error->getMessage(), $error->getCode());
printf("writeConcernError: %s (%d)\n", $error->message, $error->code);
return;
}
var_dump($error);
printf("writeConcernError.message: %s\n", $error->getMessage());
printf("writeConcernError.code: %d\n", $error->getCode());
printf("writeConcernError.message: %s\n", $error->message);
printf("writeConcernError.code: %d\n", $error->code);
printf("writeConcernError.info: ");
var_dump($error->getInfo());
var_dump($error->info);
}
}

function printWriteError(WriteError $error)
{
var_dump($error);
printf("writeError[%d].message: %s\n", $error->getIndex(), $error->getMessage());
printf("writeError[%d].code: %d\n", $error->getIndex(), $error->getCode());
printf("writeError[%d].message: %s\n", $error->index, $error->message);
printf("writeError[%d].code: %d\n", $error->index, $error->code);
}

function getInsertCount($retval) {
return $retval->getInsertedCount();
return $retval->insertedCount;
}
function getModifiedCount($retval) {
return $retval->getModifiedCount();
return $retval->modifiedCount;
}
function getDeletedCount($retval) {
return $retval->getDeletedCount();
return $retval->deletedCount;
}
function getUpsertedCount($retval) {
return $retval->getUpsertedCount();
return $retval->upsertedCount;
}
function getWriteErrors($retval) {
return (array)$retval->getWriteErrors();
return $retval->writeErrors;
}

function def($arr) {
Expand Down
2 changes: 2 additions & 0 deletions tests/writeConcernError/writeconcernerror-getcode-001.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@ try {
$manager->executeBulkWrite(NS, $bulk, ['writeConcern' => new MongoDB\Driver\WriteConcern(12)]);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteConcernError()->getCode());
var_dump($e->getWriteResult()->getWriteConcernError()->code);
}

?>
===DONE===
<?php exit(0); ?>
--EXPECT--
int(100)
int(100)
===DONE===
12 changes: 12 additions & 0 deletions tests/writeConcernError/writeconcernerror-getinfo-001.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ try {
$server->executeBulkWrite(NS, $bulk);
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteConcernError()->getInfo());
var_dump($e->getWriteResult()->getWriteConcernError()->info);
}

?>
Expand All @@ -61,4 +62,15 @@ object(stdClass)#%d (%d) {
string(14) "clientSupplied"
}
}
object(stdClass)#%d (%d) {
["writeConcern"]=>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be a WriteConcern instance.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is essentially the details or errInfo field from the command response. We don't know what the server will return here, even if it looks like a write concern.

object(stdClass)#%d (%d) {
["w"]=>
int(2)
["wtimeout"]=>
int(0)
["provenance"]=>
string(14) "clientSupplied"
}
}
===DONE===
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@ try {
$manager->executeBulkWrite(NS, $bulk, ['writeConcern' => new MongoDB\Driver\WriteConcern(12)]);
} catch(MongoDB\Driver\Exception\BulkWriteException $e) {
var_dump($e->getWriteResult()->getWriteConcernError()->getMessage());
var_dump($e->getWriteResult()->getWriteConcernError()->message);
}

?>
===DONE===
<?php exit(0); ?>
--EXPECT--
string(29) "Not enough data-bearing nodes"
string(29) "Not enough data-bearing nodes"
===DONE===
Loading