@@ -132,26 +132,56 @@ PHP_METHOD(Server, executeBulkWrite)
132
132
PHP_METHOD (Server , getHost )
133
133
{
134
134
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
+
137
159
138
160
intern = (php_phongo_server_t * )zend_object_store_get_object (getThis () TSRMLS_CC );
139
161
140
162
if (zend_parse_parameters_none () == FAILURE ) {
141
163
return ;
142
164
}
143
165
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 );
147
173
}
174
+
175
+ phongo_throw_exception (PHONGO_ERROR_RUNTIME TSRMLS_CC , "%s" , "Failed to get server description, server likely gone" );
148
176
}
149
177
/* }}} */
150
178
/* {{{ proto array Server::getInfo()
151
179
Returns the last isMaster() result document */
152
180
PHP_METHOD (Server , getInfo )
153
181
{
154
182
php_phongo_server_t * intern ;
183
+ mongoc_server_description_t * sd ;
184
+ (void )return_value_ptr ; (void )return_value_used ;
155
185
156
186
157
187
intern = (php_phongo_server_t * )zend_object_store_get_object (getThis () TSRMLS_CC );
@@ -160,13 +190,25 @@ PHP_METHOD(Server, getInfo)
160
190
return ;
161
191
}
162
192
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" );
163
203
}
164
204
/* }}} */
165
205
/* {{{ proto integer Server::getLatency()
166
206
Returns the last messured latency */
167
207
PHP_METHOD (Server , getLatency )
168
208
{
169
209
php_phongo_server_t * intern ;
210
+ mongoc_server_description_t * sd ;
211
+ (void )return_value_ptr ; (void )return_value_used ;
170
212
171
213
172
214
intern = (php_phongo_server_t * )zend_object_store_get_object (getThis () TSRMLS_CC );
@@ -175,6 +217,11 @@ PHP_METHOD(Server, getLatency)
175
217
return ;
176
218
}
177
219
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" );
178
225
}
179
226
/* }}} */
180
227
/* {{{ proto integer Server::getPort()
@@ -183,6 +230,7 @@ PHP_METHOD(Server, getPort)
183
230
{
184
231
php_phongo_server_t * intern ;
185
232
mongoc_server_description_t * sd ;
233
+ (void )return_value_ptr ; (void )return_value_used ;
186
234
187
235
188
236
intern = (php_phongo_server_t * )zend_object_store_get_object (getThis () TSRMLS_CC );
@@ -198,11 +246,13 @@ PHP_METHOD(Server, getPort)
198
246
phongo_throw_exception (PHONGO_ERROR_RUNTIME TSRMLS_CC , "%s" , "Failed to get server description, server likely gone" );
199
247
}
200
248
/* }}} */
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 )
204
252
{
205
253
php_phongo_server_t * intern ;
254
+ mongoc_server_description_t * sd ;
255
+ (void )return_value_ptr ; (void )return_value_used ;
206
256
207
257
208
258
intern = (php_phongo_server_t * )zend_object_store_get_object (getThis () TSRMLS_CC );
@@ -211,13 +261,20 @@ PHP_METHOD(Server, getState)
211
261
return ;
212
262
}
213
263
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" );
214
269
}
215
270
/* }}} */
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 )
219
274
{
220
275
php_phongo_server_t * intern ;
276
+ mongoc_server_description_t * sd ;
277
+ (void )return_value_ptr ; (void )return_value_used ;
221
278
222
279
223
280
intern = (php_phongo_server_t * )zend_object_store_get_object (getThis () TSRMLS_CC );
@@ -226,13 +283,20 @@ PHP_METHOD(Server, getType)
226
283
return ;
227
284
}
228
285
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" );
229
291
}
230
292
/* }}} */
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 )
234
296
{
235
297
php_phongo_server_t * intern ;
298
+ mongoc_server_description_t * sd ;
299
+ (void )return_value_ptr ; (void )return_value_used ;
236
300
237
301
238
302
intern = (php_phongo_server_t * )zend_object_store_get_object (getThis () TSRMLS_CC );
@@ -241,13 +305,66 @@ PHP_METHOD(Server, isDelayed)
241
305
return ;
242
306
}
243
307
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" );
244
359
}
245
360
/* }}} */
246
361
/* {{{ proto bool Server::isPassive()
247
362
Checks if this is a special passive node member of a ReplicaSet */
248
363
PHP_METHOD (Server , isPassive )
249
364
{
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 ;
251
368
252
369
253
370
intern = (php_phongo_server_t * )zend_object_store_get_object (getThis () TSRMLS_CC );
@@ -256,6 +373,13 @@ PHP_METHOD(Server, isPassive)
256
373
return ;
257
374
}
258
375
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" );
259
383
}
260
384
/* }}} */
261
385
@@ -286,6 +410,9 @@ ZEND_END_ARG_INFO();
286
410
ZEND_BEGIN_ARG_INFO_EX (ai_Server_getHost , 0 , 0 , 0 )
287
411
ZEND_END_ARG_INFO ();
288
412
413
+ ZEND_BEGIN_ARG_INFO_EX (ai_Server_getTags , 0 , 0 , 0 )
414
+ ZEND_END_ARG_INFO ();
415
+
289
416
ZEND_BEGIN_ARG_INFO_EX (ai_Server_getInfo , 0 , 0 , 0 )
290
417
ZEND_END_ARG_INFO ();
291
418
@@ -295,13 +422,19 @@ ZEND_END_ARG_INFO();
295
422
ZEND_BEGIN_ARG_INFO_EX (ai_Server_getPort , 0 , 0 , 0 )
296
423
ZEND_END_ARG_INFO ();
297
424
298
- ZEND_BEGIN_ARG_INFO_EX (ai_Server_getState , 0 , 0 , 0 )
425
+ ZEND_BEGIN_ARG_INFO_EX (ai_Server_getType , 0 , 0 , 0 )
299
426
ZEND_END_ARG_INFO ();
300
427
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 )
302
432
ZEND_END_ARG_INFO ();
303
433
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 )
305
438
ZEND_END_ARG_INFO ();
306
439
307
440
ZEND_BEGIN_ARG_INFO_EX (ai_Server_isPassive , 0 , 0 , 0 )
@@ -314,12 +447,15 @@ static zend_function_entry php_phongo_server_me[] = {
314
447
PHP_ME (Server , executeQuery , ai_Server_executeQuery , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
315
448
PHP_ME (Server , executeBulkWrite , ai_Server_executeBulkWrite , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
316
449
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 )
317
451
PHP_ME (Server , getInfo , ai_Server_getInfo , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
318
452
PHP_ME (Server , getLatency , ai_Server_getLatency , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
319
453
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 )
321
454
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 )
323
459
PHP_ME (Server , isPassive , ai_Server_isPassive , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
324
460
PHP_FE_END
325
461
};
@@ -389,11 +525,16 @@ PHP_MINIT_FUNCTION(Server)
389
525
memcpy (& php_phongo_handler_server , phongo_get_std_object_handlers (), sizeof (zend_object_handlers ));
390
526
php_phongo_handler_server .compare_objects = php_phongo_server_compare_objects ;
391
527
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
+
397
538
398
539
return SUCCESS ;
399
540
}
0 commit comments