Commit 535eb750 authored by Jeremy Mikola's avatar Jeremy Mikola

Merge pull request #246

parents 71a3b88f 88ce8510
...@@ -191,7 +191,7 @@ class FindAndModify implements Executable ...@@ -191,7 +191,7 @@ class FindAndModify implements Executable
} }
if (isset($this->options['writeConcern']) && \MongoDB\server_supports_feature($server, self::$wireVersionForWriteConcern)) { if (isset($this->options['writeConcern']) && \MongoDB\server_supports_feature($server, self::$wireVersionForWriteConcern)) {
$cmd['writeConcern'] = $this->options['writeConcern']; $cmd['writeConcern'] = \MongoDB\write_concern_as_document($this->options['writeConcern']);
} }
return new Command($cmd); return new Command($cmd);
......
...@@ -5,6 +5,7 @@ namespace MongoDB; ...@@ -5,6 +5,7 @@ namespace MongoDB;
use MongoDB\BSON\Serializable; use MongoDB\BSON\Serializable;
use MongoDB\Driver\ReadConcern; use MongoDB\Driver\ReadConcern;
use MongoDB\Driver\Server; use MongoDB\Driver\Server;
use MongoDB\Driver\WriteConcern;
use MongoDB\Exception\InvalidArgumentException; use MongoDB\Exception\InvalidArgumentException;
use stdClass; use stdClass;
...@@ -140,3 +141,30 @@ function server_supports_feature(Server $server, $feature) ...@@ -140,3 +141,30 @@ function server_supports_feature(Server $server, $feature)
return ($minWireVersion <= $feature && $maxWireVersion >= $feature); return ($minWireVersion <= $feature && $maxWireVersion >= $feature);
} }
/**
* Converts a WriteConcern instance to a stdClass for use in a BSON document.
*
* @internal
* @see https://jira.mongodb.org/browse/PHPC-498
* @param WriteConcern $writeConcern Write concern
* @return stdClass
*/
function write_concern_as_document(WriteConcern $writeConcern)
{
$document = [];
if ($writeConcern->getW() !== null) {
$document['w'] = $writeConcern->getW();
}
if ($writeConcern->getJournal() !== null) {
$document['j'] = $writeConcern->getJournal();
}
if ($writeConcern->getWtimeout() !== 0) {
$document['wtimeout'] = $writeConcern->getWtimeout();
}
return (object) $document;
}
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace MongoDB\Tests; namespace MongoDB\Tests;
use MongoDB\Driver\ReadConcern; use MongoDB\Driver\ReadConcern;
use MongoDB\Driver\WriteConcern;
/** /**
* Unit tests for utility functions. * Unit tests for utility functions.
...@@ -25,4 +26,32 @@ class FunctionsTest extends \PHPUnit_Framework_TestCase ...@@ -25,4 +26,32 @@ class FunctionsTest extends \PHPUnit_Framework_TestCase
[ new ReadConcern(ReadConcern::MAJORITY), (object) ['level' => ReadConcern::MAJORITY] ], [ new ReadConcern(ReadConcern::MAJORITY), (object) ['level' => ReadConcern::MAJORITY] ],
]; ];
} }
/**
* @dataProvider provideWriteConcernsAndDocuments
*/
public function testWriteConcernAsDocument(WriteConcern $writeConcern, $expectedDocument)
{
$this->assertEquals($expectedDocument, \MongoDB\write_concern_as_document($writeConcern));
}
public function provideWriteConcernsAndDocuments()
{
return [
[ new WriteConcern(-3), (object) ['w' => 'majority'] ], // MONGOC_WRITE_CONCERN_W_MAJORITY
[ new WriteConcern(-2), (object) [] ], // MONGOC_WRITE_CONCERN_W_DEFAULT
[ new WriteConcern(-1), (object) ['w' => -1] ],
[ new WriteConcern(0), (object) ['w' => 0] ],
[ new WriteConcern(1), (object) ['w' => 1] ],
[ new WriteConcern('majority'), (object) ['w' => 'majority'] ],
[ new WriteConcern('tag'), (object) ['w' => 'tag'] ],
[ new WriteConcern(1, 0), (object) ['w' => 1] ],
[ new WriteConcern(1, 0, false), (object) ['w' => 1, 'j' => false] ],
[ new WriteConcern(1, 1000), (object) ['w' => 1, 'wtimeout' => 1000] ],
[ new WriteConcern(1, 1000, true), (object) ['w' => 1, 'wtimeout' => 1000, 'j' => true] ],
[ new WriteConcern(-2, 0, true), (object) ['j' => true] ],
// Note: wtimeout is only applicable applies for w > 1
[ new WriteConcern(-2, 1000), (object) ['wtimeout' => 1000] ],
];
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment