Skip to content

Commit 5a6ff7f

Browse files
committed
Use wire protocol version constants for feature detection
This removes some copypasta from existing Database and Collection code.
1 parent bca7df7 commit 5a6ff7f

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

src/Collection.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -309,10 +309,7 @@ public function createIndexes(array $indexes)
309309
$readPreference = new ReadPreference(ReadPreference::RP_PRIMARY);
310310
$server = $this->manager->selectServer($readPreference);
311311

312-
$serverInfo = $server->getInfo();
313-
$maxWireVersion = isset($serverInfo['maxWireVersion']) ? $serverInfo['maxWireVersion'] : 0;
314-
315-
return ($maxWireVersion >= 2)
312+
return (FeatureDetection::isSupported($server, FeatureDetection::API_CREATEINDEXES_CMD))
316313
? $this->createIndexesCommand($server, $indexes)
317314
: $this->createIndexesLegacy($server, $indexes);
318315
}
@@ -1019,10 +1016,7 @@ public function listIndexes()
10191016
$readPreference = new ReadPreference(ReadPreference::RP_PRIMARY);
10201017
$server = $this->manager->selectServer($readPreference);
10211018

1022-
$serverInfo = $server->getInfo();
1023-
$maxWireVersion = isset($serverInfo['maxWireVersion']) ? $serverInfo['maxWireVersion'] : 0;
1024-
1025-
return ($maxWireVersion >= 3)
1019+
return (FeatureDetection::isSupported($server, FeatureDetection::API_LISTINDEXES_CMD))
10261020
? $this->listIndexesCommand($server)
10271021
: $this->listIndexesLegacy($server);
10281022
}

src/Database.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,7 @@ public function listCollections(array $options = array())
101101
$readPreference = new ReadPreference(ReadPreference::RP_PRIMARY);
102102
$server = $this->manager->selectServer($readPreference);
103103

104-
$serverInfo = $server->getInfo();
105-
$maxWireVersion = isset($serverInfo['maxWireVersion']) ? $serverInfo['maxWireVersion'] : 0;
106-
107-
return ($maxWireVersion >= 3)
104+
return (FeatureDetection::isSupported($server, FeatureDetection::API_LISTCOLLECTIONS_CMD))
108105
? $this->listCollectionsCommand($server, $options)
109106
: $this->listCollectionsLegacy($server, $options);
110107
}

src/FeatureDetection.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace MongoDB;
4+
5+
use MongoDB\Driver\Server;
6+
7+
/**
8+
* Utility class for detecting features based on wire protocol versions.
9+
*
10+
* @internal
11+
*/
12+
class FeatureDetection
13+
{
14+
const API_LISTCOLLECTIONS_CMD = 3;
15+
const API_LISTINDEXES_CMD = 3;
16+
const API_CREATEINDEXES_CMD = 2;
17+
18+
/**
19+
* Return whether the server supports a particular feature.
20+
*
21+
* @param Server $server Server to check
22+
* @param integer $feature Feature constant (i.e. wire protocol version)
23+
* @return boolean
24+
*/
25+
static public function isSupported(Server $server, $feature)
26+
{
27+
$info = $server->getInfo();
28+
$maxWireVersion = isset($info['maxWireVersion']) ? (integer) $info['maxWireVersion'] : 0;
29+
$minWireVersion = isset($info['minWireVersion']) ? (integer) $info['minWireVersion'] : 0;
30+
31+
return ($minWireVersion <= $feature && $maxWireVersion >= $feature);
32+
}
33+
}

0 commit comments

Comments
 (0)