Skip to content

Commit 848acb0

Browse files
committed
PHPC-194: Implement Manager::selectServer() method to wrap SDAM server selection
1 parent b3b3322 commit 848acb0

File tree

3 files changed

+170
-1
lines changed

3 files changed

+170
-1
lines changed

src/MongoDB/Manager.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ PHP_METHOD(Manager, executeDelete)
249249
bson_clear(&bson);
250250
}
251251
/* }}} */
252-
/* {{{ proto Server[] Manager::getServers()
252+
/* {{{ proto MongoDB\Driver\Server[] Manager::getServers()
253253
Returns the Servers associated with this Manager */
254254
PHP_METHOD(Manager, getServers)
255255
{
@@ -277,6 +277,28 @@ PHP_METHOD(Manager, getServers)
277277
}
278278
}
279279
/* }}} */
280+
/* {{{ proto MongoDB\Driver\Server Manager::selectServers(MongoDB\Driver\ReadPreference $readPreference)
281+
Returns a suitable Server for the given $readPreference */
282+
PHP_METHOD(Manager, selectServer)
283+
{
284+
php_phongo_manager_t *intern;
285+
zval *zreadPreference = NULL;
286+
const mongoc_read_prefs_t *readPreference;
287+
uint32_t server_id;
288+
(void)return_value_ptr; (void)return_value_used;
289+
290+
291+
intern = (php_phongo_manager_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
292+
293+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &zreadPreference, php_phongo_readpreference_ce) == FAILURE) {
294+
return;
295+
}
296+
297+
readPreference = phongo_read_preference_from_zval(zreadPreference);
298+
server_id = mongoc_cluster_preselect(&intern->client->cluster, MONGOC_OPCODE_QUERY, readPreference, NULL);
299+
phongo_server_init(return_value, intern->client, server_id TSRMLS_CC);
300+
}
301+
/* }}} */
280302
/* {{{ proto void MongoDB\Driver\Manager::__wakeUp()
281303
* Throws MongoDB\Driver\RuntimeException as it cannot be serialized */
282304
PHP_METHOD(Manager, __wakeUp)
@@ -353,6 +375,9 @@ ZEND_END_ARG_INFO();
353375
ZEND_BEGIN_ARG_INFO_EX(ai_Manager_getServers, 0, 0, 0)
354376
ZEND_END_ARG_INFO();
355377

378+
ZEND_BEGIN_ARG_INFO_EX(ai_Manager_selectServer, 0, 0, 1)
379+
ZEND_ARG_OBJ_INFO(0, readPreference, MongoDB\\Driver\\ReadPreference, 1)
380+
ZEND_END_ARG_INFO();
356381

357382
static zend_function_entry php_phongo_manager_me[] = {
358383
PHP_ME(Manager, __construct, ai_Manager___construct, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
@@ -363,6 +388,7 @@ static zend_function_entry php_phongo_manager_me[] = {
363388
PHP_ME(Manager, executeUpdate, ai_Manager_executeUpdate, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
364389
PHP_ME(Manager, executeDelete, ai_Manager_executeDelete, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
365390
PHP_ME(Manager, getServers, ai_Manager_getServers, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
391+
PHP_ME(Manager, selectServer, ai_Manager_selectServer, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
366392
PHP_ME(Manager, __wakeUp, NULL, ZEND_ACC_PUBLIC)
367393
PHP_FE_END
368394
};
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
--TEST--
2+
MongoDB\Driver\Manager::selectServer() select a server from SDAM based on ReadPreference
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; CLEANUP(REPLICASET); CLEANUP(REPLICASET, "local", "example"); ?>
5+
--FILE--
6+
<?php
7+
require_once __DIR__ . "/../utils/basic.inc";
8+
9+
$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
10+
$manager = new MongoDB\Driver\Manager(REPLICASET);
11+
$server = $manager->selectServer($rp);
12+
$rp2 = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
13+
$server2 = $manager->selectServer($rp2);
14+
15+
// load fixtures for test
16+
$bulk = new \MongoDB\Driver\BulkWrite();
17+
$bulk->insert(array('_id' => 1, 'x' => 2, 'y' => 3));
18+
$bulk->insert(array('_id' => 2, 'x' => 3, 'y' => 4));
19+
$bulk->insert(array('_id' => 3, 'x' => 4, 'y' => 5));
20+
$server->executeBulkWrite(NS, $bulk);
21+
22+
$query = new MongoDB\Driver\Query(array('x' => 3), array('projection' => array('y' => 1)));
23+
$cursor = $server->executeQuery(NS, $query);
24+
25+
var_dump($cursor instanceof MongoDB\Driver\Result);
26+
var_dump($server == $cursor->getServer());
27+
var_dump(iterator_to_array($cursor));
28+
29+
$query = new MongoDB\Driver\Query(array('x' => 3), array('projection' => array('y' => 1)));
30+
$cursor = $server2->executeQuery(NS, $query);
31+
32+
var_dump($cursor instanceof MongoDB\Driver\Result);
33+
var_dump($server2 == $cursor->getServer());
34+
var_dump(iterator_to_array($cursor));
35+
36+
$bulk = new \MongoDB\Driver\BulkWrite();
37+
$bulk->insert(array('_id' => 1, 'x' => 2, 'y' => 3));
38+
$bulk->insert(array('_id' => 2, 'x' => 3, 'y' => 4));
39+
$bulk->insert(array('_id' => 3, 'x' => 4, 'y' => 5));
40+
throws(function() use($server2, $bulk) {
41+
$server2->executeBulkWrite(NS, $bulk);
42+
}, "MongoDB\Driver\BulkWriteException");
43+
$result = $server2->executeBulkWrite("local.example", $bulk);
44+
var_dump($result->getInsertedCount());
45+
?>
46+
===DONE===
47+
<?php exit(0); ?>
48+
--EXPECT--
49+
bool(true)
50+
bool(true)
51+
array(1) {
52+
[0]=>
53+
array(2) {
54+
["_id"]=>
55+
int(2)
56+
["y"]=>
57+
int(4)
58+
}
59+
}
60+
bool(true)
61+
bool(true)
62+
array(1) {
63+
[0]=>
64+
array(2) {
65+
["_id"]=>
66+
int(2)
67+
["y"]=>
68+
int(4)
69+
}
70+
}
71+
OK: Got MongoDB\Driver\BulkWriteException
72+
int(3)
73+
===DONE===
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
--TEST--
2+
MongoDB\Driver\Manager::selectServer() select a server from SDAM based on ReadPreference
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; CLEANUP(STANDALONE); ?>
5+
--FILE--
6+
<?php
7+
require_once __DIR__ . "/../utils/basic.inc";
8+
9+
$rp = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
10+
$manager = new MongoDB\Driver\Manager(STANDALONE);
11+
$server = $manager->selectServer($rp);
12+
$rp2 = new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY);
13+
$server2 = $manager->selectServer($rp2);
14+
15+
// load fixtures for test
16+
$bulk = new \MongoDB\Driver\BulkWrite();
17+
$bulk->insert(array('_id' => 1, 'x' => 2, 'y' => 3));
18+
$bulk->insert(array('_id' => 2, 'x' => 3, 'y' => 4));
19+
$bulk->insert(array('_id' => 3, 'x' => 4, 'y' => 5));
20+
$server->executeBulkWrite(NS, $bulk);
21+
22+
$query = new MongoDB\Driver\Query(array('x' => 3), array('projection' => array('y' => 1)));
23+
$cursor = $server->executeQuery(NS, $query);
24+
25+
var_dump($cursor instanceof MongoDB\Driver\Result);
26+
var_dump($server == $cursor->getServer());
27+
var_dump(iterator_to_array($cursor));
28+
29+
$query = new MongoDB\Driver\Query(array('x' => 3), array('projection' => array('y' => 1)));
30+
$cursor = $server2->executeQuery(NS, $query);
31+
32+
var_dump($cursor instanceof MongoDB\Driver\Result);
33+
var_dump($server2 == $cursor->getServer());
34+
var_dump(iterator_to_array($cursor));
35+
36+
$bulk = new \MongoDB\Driver\BulkWrite();
37+
$bulk->insert(array('_id' => 1, 'x' => 2, 'y' => 3));
38+
$bulk->insert(array('_id' => 2, 'x' => 3, 'y' => 4));
39+
$bulk->insert(array('_id' => 3, 'x' => 4, 'y' => 5));
40+
throws(function() use($server2, $bulk) {
41+
$server2->executeBulkWrite(NS, $bulk);
42+
}, "MongoDB\Driver\BulkWriteException");
43+
?>
44+
===DONE===
45+
<?php exit(0); ?>
46+
--EXPECT--
47+
bool(true)
48+
bool(true)
49+
array(1) {
50+
[0]=>
51+
array(2) {
52+
["_id"]=>
53+
int(2)
54+
["y"]=>
55+
int(4)
56+
}
57+
}
58+
bool(true)
59+
bool(true)
60+
array(1) {
61+
[0]=>
62+
array(2) {
63+
["_id"]=>
64+
int(2)
65+
["y"]=>
66+
int(4)
67+
}
68+
}
69+
OK: Got MongoDB\Driver\BulkWriteException
70+
===DONE===

0 commit comments

Comments
 (0)