Skip to content

Commit 4da65af

Browse files
committed
PHPC-188: Populate MongoDB\Driver\Server
1 parent 5f8d990 commit 4da65af

File tree

4 files changed

+303
-29
lines changed

4 files changed

+303
-29
lines changed

src/MongoDB/Server.c

Lines changed: 166 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -132,26 +132,56 @@ PHP_METHOD(Server, executeBulkWrite)
132132
PHP_METHOD(Server, getHost)
133133
{
134134
php_phongo_server_t *intern;
135-
const mongoc_host_list_t *hosts;
136-
(void)return_value_ptr;
135+
mongoc_server_description_t *sd;
136+
(void)return_value_ptr; (void)return_value_used;
137+
138+
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
139+
140+
if (zend_parse_parameters_none() == FAILURE) {
141+
return;
142+
}
143+
144+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
145+
RETURN_STRING(sd->host.host, 1);
146+
}
147+
148+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
149+
}
150+
/* }}} */
151+
/* {{{ proto array Server::getTags()
152+
Returns the currently configured tags for this node */
153+
PHP_METHOD(Server, getTags)
154+
{
155+
php_phongo_server_t *intern;
156+
mongoc_server_description_t *sd;
157+
(void)return_value_ptr; (void)return_value_used;
158+
137159

138160
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
139161

140162
if (zend_parse_parameters_none() == FAILURE) {
141163
return;
142164
}
143165

144-
hosts = mongoc_uri_get_hosts(mongoc_client_get_uri(intern->client));
145-
if (hosts) {
146-
RETURN_STRING(hosts->host, 1);
166+
167+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
168+
php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER;
169+
170+
MAKE_STD_ZVAL(state.zchild);
171+
bson_to_zval(bson_get_data(&sd->tags), sd->tags.len, &state);
172+
RETURN_ZVAL(state.zchild, 0, 1);
147173
}
174+
175+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
148176
}
149177
/* }}} */
150178
/* {{{ proto array Server::getInfo()
151179
Returns the last isMaster() result document */
152180
PHP_METHOD(Server, getInfo)
153181
{
154182
php_phongo_server_t *intern;
183+
mongoc_server_description_t *sd;
184+
(void)return_value_ptr; (void)return_value_used;
155185

156186

157187
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -160,13 +190,25 @@ PHP_METHOD(Server, getInfo)
160190
return;
161191
}
162192

193+
194+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
195+
php_phongo_bson_state state = PHONGO_BSON_STATE_INITIALIZER;
196+
197+
MAKE_STD_ZVAL(state.zchild);
198+
bson_to_zval(bson_get_data(&sd->last_is_master), sd->last_is_master.len, &state);
199+
RETURN_ZVAL(state.zchild, 0, 1);
200+
}
201+
202+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
163203
}
164204
/* }}} */
165205
/* {{{ proto integer Server::getLatency()
166206
Returns the last messured latency */
167207
PHP_METHOD(Server, getLatency)
168208
{
169209
php_phongo_server_t *intern;
210+
mongoc_server_description_t *sd;
211+
(void)return_value_ptr; (void)return_value_used;
170212

171213

172214
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -175,6 +217,11 @@ PHP_METHOD(Server, getLatency)
175217
return;
176218
}
177219

220+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
221+
RETURN_LONG(sd->round_trip_time);
222+
}
223+
224+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
178225
}
179226
/* }}} */
180227
/* {{{ proto integer Server::getPort()
@@ -183,6 +230,7 @@ PHP_METHOD(Server, getPort)
183230
{
184231
php_phongo_server_t *intern;
185232
mongoc_server_description_t *sd;
233+
(void)return_value_ptr; (void)return_value_used;
186234

187235

188236
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -198,11 +246,13 @@ PHP_METHOD(Server, getPort)
198246
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
199247
}
200248
/* }}} */
201-
/* {{{ proto integer Server::getState()
202-
Returns the current state of the node (maintenece/startup/...) */
203-
PHP_METHOD(Server, getState)
249+
/* {{{ proto integer Server::getType()
250+
Returns the node type of this Server */
251+
PHP_METHOD(Server, getType)
204252
{
205253
php_phongo_server_t *intern;
254+
mongoc_server_description_t *sd;
255+
(void)return_value_ptr; (void)return_value_used;
206256

207257

208258
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -211,13 +261,20 @@ PHP_METHOD(Server, getState)
211261
return;
212262
}
213263

264+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
265+
RETURN_LONG(sd->type);
266+
}
267+
268+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
214269
}
215270
/* }}} */
216-
/* {{{ proto integer Server::getType()
217-
Returns the node type of this Server */
218-
PHP_METHOD(Server, getType)
271+
/* {{{ proto bool Server::isPrimary()
272+
Checks if this is a special "Primary" member of a RepilcaSet */
273+
PHP_METHOD(Server, isPrimary)
219274
{
220275
php_phongo_server_t *intern;
276+
mongoc_server_description_t *sd;
277+
(void)return_value_ptr; (void)return_value_used;
221278

222279

223280
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -226,13 +283,20 @@ PHP_METHOD(Server, getType)
226283
return;
227284
}
228285

286+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
287+
RETURN_BOOL(sd->type == MONGOC_SERVER_RS_PRIMARY);
288+
}
289+
290+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
229291
}
230292
/* }}} */
231-
/* {{{ proto bool Server::isDelayed()
232-
Checks if this is a special "delayed" member of a RepilcaSet */
233-
PHP_METHOD(Server, isDelayed)
293+
/* {{{ proto bool Server::isSecondary()
294+
Checks if this is a special "Secondary" member of a RepilcaSet */
295+
PHP_METHOD(Server, isSecondary)
234296
{
235297
php_phongo_server_t *intern;
298+
mongoc_server_description_t *sd;
299+
(void)return_value_ptr; (void)return_value_used;
236300

237301

238302
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -241,13 +305,66 @@ PHP_METHOD(Server, isDelayed)
241305
return;
242306
}
243307

308+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
309+
RETURN_BOOL(sd->type == MONGOC_SERVER_RS_SECONDARY);
310+
}
311+
312+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
313+
}
314+
/* }}} */
315+
/* {{{ proto bool Server::isArbiter()
316+
Checks if this is a special "Arbiter" member of a RepilcaSet */
317+
PHP_METHOD(Server, isArbiter)
318+
{
319+
php_phongo_server_t *intern;
320+
mongoc_server_description_t *sd;
321+
(void)return_value_ptr; (void)return_value_used;
322+
323+
324+
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
325+
326+
if (zend_parse_parameters_none() == FAILURE) {
327+
return;
328+
}
329+
330+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
331+
RETURN_BOOL(sd->type == MONGOC_SERVER_RS_ARBITER);
332+
}
333+
334+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
335+
}
336+
/* }}} */
337+
/* {{{ proto bool Server::isHidden()
338+
Checks if this is a special "hidden" member of a RepilcaSet */
339+
PHP_METHOD(Server, isHidden)
340+
{
341+
php_phongo_server_t *intern;
342+
mongoc_server_description_t *sd;
343+
(void)return_value_ptr; (void)return_value_used;
344+
345+
346+
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
347+
348+
if (zend_parse_parameters_none() == FAILURE) {
349+
return;
350+
}
351+
352+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
353+
bson_iter_t iter;
354+
355+
RETURN_BOOL(bson_iter_init_find_case(&iter, &sd->last_is_master, "hidden") && bson_iter_as_bool(&iter));
356+
}
357+
358+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
244359
}
245360
/* }}} */
246361
/* {{{ proto bool Server::isPassive()
247362
Checks if this is a special passive node member of a ReplicaSet */
248363
PHP_METHOD(Server, isPassive)
249364
{
250-
php_phongo_server_t *intern;
365+
php_phongo_server_t *intern;
366+
mongoc_server_description_t *sd;
367+
(void)return_value_ptr; (void)return_value_used;
251368

252369

253370
intern = (php_phongo_server_t *)zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -256,6 +373,13 @@ PHP_METHOD(Server, isPassive)
256373
return;
257374
}
258375

376+
if ((sd = mongoc_topology_description_server_by_id(&intern->client->topology->description, intern->server_id))) {
377+
bson_iter_t iter;
378+
379+
RETURN_BOOL(bson_iter_init_find_case(&iter, &sd->last_is_master, "passive") && bson_iter_as_bool(&iter));
380+
}
381+
382+
phongo_throw_exception(PHONGO_ERROR_RUNTIME TSRMLS_CC, "%s", "Failed to get server description, server likely gone");
259383
}
260384
/* }}} */
261385

@@ -286,6 +410,9 @@ ZEND_END_ARG_INFO();
286410
ZEND_BEGIN_ARG_INFO_EX(ai_Server_getHost, 0, 0, 0)
287411
ZEND_END_ARG_INFO();
288412

413+
ZEND_BEGIN_ARG_INFO_EX(ai_Server_getTags, 0, 0, 0)
414+
ZEND_END_ARG_INFO();
415+
289416
ZEND_BEGIN_ARG_INFO_EX(ai_Server_getInfo, 0, 0, 0)
290417
ZEND_END_ARG_INFO();
291418

@@ -295,13 +422,19 @@ ZEND_END_ARG_INFO();
295422
ZEND_BEGIN_ARG_INFO_EX(ai_Server_getPort, 0, 0, 0)
296423
ZEND_END_ARG_INFO();
297424

298-
ZEND_BEGIN_ARG_INFO_EX(ai_Server_getState, 0, 0, 0)
425+
ZEND_BEGIN_ARG_INFO_EX(ai_Server_getType, 0, 0, 0)
299426
ZEND_END_ARG_INFO();
300427

301-
ZEND_BEGIN_ARG_INFO_EX(ai_Server_getType, 0, 0, 0)
428+
ZEND_BEGIN_ARG_INFO_EX(ai_Server_isPrimary, 0, 0, 0)
429+
ZEND_END_ARG_INFO();
430+
431+
ZEND_BEGIN_ARG_INFO_EX(ai_Server_isSecondary, 0, 0, 0)
302432
ZEND_END_ARG_INFO();
303433

304-
ZEND_BEGIN_ARG_INFO_EX(ai_Server_isDelayed, 0, 0, 0)
434+
ZEND_BEGIN_ARG_INFO_EX(ai_Server_isArbiter, 0, 0, 0)
435+
ZEND_END_ARG_INFO();
436+
437+
ZEND_BEGIN_ARG_INFO_EX(ai_Server_isHidden, 0, 0, 0)
305438
ZEND_END_ARG_INFO();
306439

307440
ZEND_BEGIN_ARG_INFO_EX(ai_Server_isPassive, 0, 0, 0)
@@ -314,12 +447,15 @@ static zend_function_entry php_phongo_server_me[] = {
314447
PHP_ME(Server, executeQuery, ai_Server_executeQuery, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
315448
PHP_ME(Server, executeBulkWrite, ai_Server_executeBulkWrite, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
316449
PHP_ME(Server, getHost, ai_Server_getHost, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
450+
PHP_ME(Server, getTags, ai_Server_getTags, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
317451
PHP_ME(Server, getInfo, ai_Server_getInfo, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
318452
PHP_ME(Server, getLatency, ai_Server_getLatency, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
319453
PHP_ME(Server, getPort, ai_Server_getPort, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
320-
PHP_ME(Server, getState, ai_Server_getState, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
321454
PHP_ME(Server, getType, ai_Server_getType, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
322-
PHP_ME(Server, isDelayed, ai_Server_isDelayed, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
455+
PHP_ME(Server, isPrimary, ai_Server_isPrimary, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
456+
PHP_ME(Server, isSecondary, ai_Server_isSecondary, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
457+
PHP_ME(Server, isArbiter, ai_Server_isArbiter, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
458+
PHP_ME(Server, isHidden, ai_Server_isHidden, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
323459
PHP_ME(Server, isPassive, ai_Server_isPassive, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
324460
PHP_FE_END
325461
};
@@ -389,11 +525,16 @@ PHP_MINIT_FUNCTION(Server)
389525
memcpy(&php_phongo_handler_server, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
390526
php_phongo_handler_server.compare_objects = php_phongo_server_compare_objects;
391527

392-
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_MONGOS"), 0x01 TSRMLS_CC);
393-
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_STANDALONE"), 0x02 TSRMLS_CC);
394-
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_ARBITER"), 0x03 TSRMLS_CC);
395-
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_SECONDARY"), 0x04 TSRMLS_CC);
396-
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_PRIMARY"), 0x05 TSRMLS_CC);
528+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_UNKNOWN"), MONGOC_SERVER_UNKNOWN TSRMLS_CC);
529+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_STANDALONE"), MONGOC_SERVER_STANDALONE TSRMLS_CC);
530+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_MONGOS"), MONGOC_SERVER_MONGOS TSRMLS_CC);
531+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_POSSIBLE_PRIMARY"), MONGOC_SERVER_POSSIBLE_PRIMARY TSRMLS_CC);
532+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_RS_PRIMARY"), MONGOC_SERVER_RS_PRIMARY TSRMLS_CC);
533+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_RS_SECONDARY"), MONGOC_SERVER_RS_SECONDARY TSRMLS_CC);
534+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_RS_ARBITER"), MONGOC_SERVER_RS_ARBITER TSRMLS_CC);
535+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_RS_OTHER"), MONGOC_SERVER_RS_OTHER TSRMLS_CC);
536+
zend_declare_class_constant_long(php_phongo_server_ce, ZEND_STRL("TYPE_RS_GHOST"), MONGOC_SERVER_RS_GHOST TSRMLS_CC);
537+
397538

398539
return SUCCESS;
399540
}

tests/generic/server-constants.phpt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,27 @@ MongoDB\Driver\Server constants
66
<?php
77
require_once "tests/utils/basic.inc";
88

9-
var_dump(MongoDB\Driver\Server::TYPE_MONGOS);
9+
var_dump(MongoDB\Driver\Server::TYPE_UNKNOWN);
1010
var_dump(MongoDB\Driver\Server::TYPE_STANDALONE);
11-
var_dump(MongoDB\Driver\Server::TYPE_ARBITER);
12-
var_dump(MongoDB\Driver\Server::TYPE_SECONDARY);
13-
var_dump(MongoDB\Driver\Server::TYPE_PRIMARY);
11+
var_dump(MongoDB\Driver\Server::TYPE_MONGOS);
12+
var_dump(MongoDB\Driver\Server::TYPE_POSSIBLE_PRIMARY);
13+
var_dump(MongoDB\Driver\Server::TYPE_RS_PRIMARY);
14+
var_dump(MongoDB\Driver\Server::TYPE_RS_SECONDARY);
15+
var_dump(MongoDB\Driver\Server::TYPE_RS_ARBITER);
16+
var_dump(MongoDB\Driver\Server::TYPE_RS_OTHER);
17+
var_dump(MongoDB\Driver\Server::TYPE_RS_GHOST);
1418

1519
?>
1620
===DONE===
1721
<?php exit(0); ?>
1822
--EXPECT--
23+
int(0)
1924
int(1)
2025
int(2)
2126
int(3)
2227
int(4)
2328
int(5)
29+
int(6)
30+
int(7)
31+
int(8)
2432
===DONE===

0 commit comments

Comments
 (0)