Skip to content
This repository has been archived by the owner on Nov 11, 2020. It is now read-only.

Convert timeout options for driver >= 1.5.0 #175

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
65 changes: 65 additions & 0 deletions lib/Doctrine/MongoDB/Collection.php
Expand Up @@ -281,6 +281,9 @@ public function drop()
public function ensureIndex(array $keys, array $options = array())
{
$options = isset($options['safe']) ? $this->convertWriteConcern($options) : $options;
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;
Copy link
Member

Choose a reason for hiding this comment

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

This actually needs wtimeout handling as well. On MongoDB 2.4, ensureIndex() will perform and insert operation on system.indexes. In 2.6+, the createIndexes command is used. I've updated the driver documentation to clarify this in http://svn.php.net/viewvc?view=revision&revision=333382

$options = isset($options['wtimeout']) ? $this->convertWriteTimeout($options) : $options;

return $this->mongoCollection->ensureIndex($keys, $options);
}

Expand Down Expand Up @@ -868,6 +871,8 @@ protected function doAggregate(array $pipeline)
protected function doBatchInsert(array &$a, array $options = array())
{
$options = isset($options['safe']) ? $this->convertWriteConcern($options) : $options;
$options = isset($options['wtimeout']) ? $this->convertWriteTimeout($options) : $options;
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;
return $this->mongoCollection->batchInsert($a, $options);
}

Expand All @@ -883,6 +888,8 @@ protected function doBatchInsert(array &$a, array $options = array())
*/
protected function doDistinct($field, array $query, array $options)
{
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;

$command = array();
$command['distinct'] = $this->mongoCollection->getName();
$command['key'] = $field;
Expand Down Expand Up @@ -943,6 +950,8 @@ protected function doFind(array $query, array $fields)
*/
protected function doFindAndRemove(array $query, array $options = array())
{
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;

$command = array();
$command['findandmodify'] = $this->mongoCollection->getName();
$command['query'] = (object) $query;
Expand Down Expand Up @@ -970,6 +979,8 @@ protected function doFindAndRemove(array $query, array $options = array())
*/
protected function doFindAndUpdate(array $query, array $newObj, array $options)
{
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;

$command = array();
$command['findandmodify'] = $this->mongoCollection->getName();
$command['query'] = (object) $query;
Expand Down Expand Up @@ -1029,6 +1040,8 @@ protected function doGetDBRef(array $reference)
*/
protected function doGroup($keys, array $initial, $reduce, array $options)
{
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;

$command = array();
$command['ns'] = $this->mongoCollection->getName();
$command['initial'] = (object) $initial;
Expand Down Expand Up @@ -1079,6 +1092,8 @@ protected function doInsert(array &$a, array $options)
{
$document = $a;
$options = isset($options['safe']) ? $this->convertWriteConcern($options) : $options;
$options = isset($options['wtimeout']) ? $this->convertWriteTimeout($options) : $options;
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;
$result = $this->mongoCollection->insert($document, $options);
if (isset($document['_id'])) {
$a['_id'] = $document['_id'];
Expand All @@ -1100,6 +1115,8 @@ protected function doInsert(array &$a, array $options)
*/
protected function doMapReduce($map, $reduce, $out, array $query, array $options)
{
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;

$command = array();
$command['mapreduce'] = $this->mongoCollection->getName();
$command['map'] = $map;
Expand Down Expand Up @@ -1149,6 +1166,8 @@ protected function doMapReduce($map, $reduce, $out, array $query, array $options
*/
protected function doNear($near, array $query, array $options)
{
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;

if ($near instanceof Point) {
$near = $near->jsonSerialize();
}
Expand Down Expand Up @@ -1186,6 +1205,8 @@ protected function doNear($near, array $query, array $options)
protected function doRemove(array $query, array $options)
{
$options = isset($options['safe']) ? $this->convertWriteConcern($options) : $options;
$options = isset($options['wtimeout']) ? $this->convertWriteTimeout($options) : $options;
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;
return $this->mongoCollection->remove($query, $options);
}

Expand All @@ -1200,6 +1221,8 @@ protected function doRemove(array $query, array $options)
protected function doSave(array &$a, array $options)
{
$options = isset($options['safe']) ? $this->convertWriteConcern($options) : $options;
$options = isset($options['wtimeout']) ? $this->convertWriteTimeout($options) : $options;
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;
return $this->mongoCollection->save($a, $options);
}

Expand All @@ -1215,6 +1238,8 @@ protected function doSave(array &$a, array $options)
protected function doUpdate(array $query, array $newObj, array $options)
{
$options = isset($options['safe']) ? $this->convertWriteConcern($options) : $options;
$options = isset($options['wtimeout']) ? $this->convertWriteTimeout($options) : $options;
$options = isset($options['timeout']) ? $this->convertSocketTimeout($options) : $options;
return $this->mongoCollection->update($query, $newObj, $options);
}

Expand Down Expand Up @@ -1283,4 +1308,44 @@ protected function convertWriteConcern(array $options)

return $options;
}

/**
* Convert "wtimeout" write option to "wTimeoutMS" for driver version 1.5.0+.
*
* @param array $options
* @return array
*/
protected function convertWriteTimeout(array $options)
{
if (version_compare(phpversion('mongo'), '1.5.0', '<')) {
return $options;
}

if (isset($options['wtimeout'])) {
$options['wTimeoutMS'] = isset($options['wTimeoutMS']) ? $options['wTimeoutMS'] : $options['wtimeout'];
unset($options['wtimeout']);
}

return $options;
}

/**
* Convert "timeout" write option to "socketTimeoutMS" for driver version 1.5.0+.
*
* @param array $options
* @return array
*/
protected function convertSocketTimeout(array $options)
{
if (version_compare(phpversion('mongo'), '1.5.0', '<')) {
return $options;
}

if (isset($options['timeout'])) {
$options['socketTimeoutMS'] = isset($options['socketTimeoutMS']) ? $options['socketTimeoutMS'] : $options['timeout'];
unset($options['timeout']);
}

return $options;
}
}
68 changes: 68 additions & 0 deletions tests/Doctrine/MongoDB/Tests/CollectionTest.php
Expand Up @@ -845,6 +845,74 @@ public function testWriteConcernOptionIsNotConvertedForOlderDrivers()
$coll->insert($document, array('safe' => true));
}

public function testSocketTimeoutOptionIsConverted()
{
if (version_compare(phpversion('mongo'), '1.5.0', '<')) {
$this->markTestSkipped('This test is not applicable to driver versions < 1.5.0');
}

$mongoCollection = $this->getMockMongoCollection();
$mongoCollection->expects($this->once())
->method('insert')
->with(array('x' => 1), array('socketTimeoutMS' => 1000));

$coll = $this->getTestCollection($this->getMockDatabase(), $mongoCollection);

$document = array('x' => 1);
$coll->insert($document, array('timeout' => 1000));
}

public function testSocketTimeoutOptionIsNotConvertedForOlderDrivers()
{
if (version_compare(phpversion('mongo'), '1.5.0', '>=')) {
$this->markTestSkipped('This test is not applicable to driver versions >= 1.5.0');
}

$mongoCollection = $this->getMockMongoCollection();
$mongoCollection->expects($this->once())
->method('insert')
->with(array('x' => 1), array('timeout' => 1000));

$coll = $this->getTestCollection($this->getMockDatabase(), $mongoCollection);

$document = array('x' => 1);
$coll->insert($document, array('timeout' => 1000));
}

public function testWriteTimeoutOptionIsConverted()
{
if (version_compare(phpversion('mongo'), '1.5.0', '<')) {
$this->markTestSkipped('This test is not applicable to driver versions < 1.5.0');
}

$mongoCollection = $this->getMockMongoCollection();
$mongoCollection->expects($this->once())
->method('insert')
->with(array('x' => 1), array('wTimeoutMS' => 1000));

$coll = $this->getTestCollection($this->getMockDatabase(), $mongoCollection);

$document = array('x' => 1);
$coll->insert($document, array('wtimeout' => 1000));
}

public function testWriteTimeoutOptionIsNotConvertedForOlderDrivers()
{
if (version_compare(phpversion('mongo'), '1.5.0', '>=')) {
$this->markTestSkipped('This test is not applicable to driver versions >= 1.5.0');
}

$mongoCollection = $this->getMockMongoCollection();
$mongoCollection->expects($this->once())
->method('insert')
->with(array('x' => 1), array('wtimeout' => 1000));

$coll = $this->getTestCollection($this->getMockDatabase(), $mongoCollection);

$document = array('x' => 1);
$coll->insert($document, array('wtimeout' => 1000));
}

private function getMockCollection()
{
return $this->getMockBuilder('Doctrine\MongoDB\Collection')
Expand Down