Skip to content

Commit e3a84d7

Browse files
committed
PHPC-1491: Expose read preference mode as string
1 parent c64a088 commit e3a84d7

File tree

2 files changed

+75
-22
lines changed

2 files changed

+75
-22
lines changed

src/MongoDB/ReadPreference.c

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,28 @@ static bool php_phongo_readpreference_init_from_hash(php_phongo_readpreference_t
196196
return false;
197197
} /* }}} */
198198

199+
static const char* php_phongo_readpreference_get_mode_string(mongoc_read_mode_t mode TSRMLS_DC) /* {{{ */
200+
{
201+
switch (mode) {
202+
case MONGOC_READ_PRIMARY:
203+
return PHONGO_READ_PRIMARY;
204+
case MONGOC_READ_PRIMARY_PREFERRED:
205+
return PHONGO_READ_PRIMARY_PREFERRED;
206+
case MONGOC_READ_SECONDARY:
207+
return PHONGO_READ_SECONDARY;
208+
case MONGOC_READ_SECONDARY_PREFERRED:
209+
return PHONGO_READ_SECONDARY_PREFERRED;
210+
case MONGOC_READ_NEAREST:
211+
return PHONGO_READ_NEAREST;
212+
default:
213+
/* Should never happen, but if it does: exception */
214+
phongo_throw_exception(PHONGO_ERROR_LOGIC TSRMLS_CC, "Mode '%d' should never have been passed to php_phongo_readpreference_get_mode_string, please file a bug report", mode);
215+
break;
216+
}
217+
218+
return NULL;
219+
} /* }}} */
220+
199221
/* {{{ proto void MongoDB\Driver\ReadPreference::__construct(int|string $mode[, array $tagSets = array()[, array $options = array()]])
200222
Constructs a new ReadPreference */
201223
static PHP_METHOD(ReadPreference, __construct)
@@ -349,6 +371,28 @@ static PHP_METHOD(ReadPreference, getMode)
349371
RETURN_LONG(mongoc_read_prefs_get_mode(intern->read_preference));
350372
} /* }}} */
351373

374+
/* {{{ proto string MongoDB\Driver\ReadPreference::getModeString()
375+
Returns the ReadPreference mode as string */
376+
static PHP_METHOD(ReadPreference, getModeString)
377+
{
378+
php_phongo_readpreference_t* intern;
379+
const char* mode_string;
380+
381+
intern = Z_READPREFERENCE_OBJ_P(getThis());
382+
383+
if (zend_parse_parameters_none() == FAILURE) {
384+
return;
385+
}
386+
387+
mode_string = php_phongo_readpreference_get_mode_string(mongoc_read_prefs_get_mode(intern->read_preference) TSRMLS_CC);
388+
if (!mode_string) {
389+
/* Exception already thrown */
390+
return;
391+
}
392+
393+
PHONGO_RETURN_STRING(mode_string);
394+
} /* }}} */
395+
352396
/* {{{ proto array MongoDB\Driver\ReadPreference::getTagSets()
353397
Returns the ReadPreference tag sets */
354398
static PHP_METHOD(ReadPreference, getTagSets)
@@ -384,26 +428,6 @@ static PHP_METHOD(ReadPreference, getTagSets)
384428
}
385429
} /* }}} */
386430

387-
static const char* php_phongo_readpreference_get_mode_string(mongoc_read_mode_t mode) /* {{{ */
388-
{
389-
switch (mode) {
390-
case MONGOC_READ_PRIMARY:
391-
return PHONGO_READ_PRIMARY;
392-
case MONGOC_READ_PRIMARY_PREFERRED:
393-
return PHONGO_READ_PRIMARY_PREFERRED;
394-
case MONGOC_READ_SECONDARY:
395-
return PHONGO_READ_SECONDARY;
396-
case MONGOC_READ_SECONDARY_PREFERRED:
397-
return PHONGO_READ_SECONDARY_PREFERRED;
398-
case MONGOC_READ_NEAREST:
399-
return PHONGO_READ_NEAREST;
400-
default: /* Do nothing */
401-
break;
402-
}
403-
404-
return NULL;
405-
} /* }}} */
406-
407431
static HashTable* php_phongo_readpreference_get_properties_hash(zval* object, bool is_debug TSRMLS_DC) /* {{{ */
408432
{
409433
php_phongo_readpreference_t* intern;
@@ -422,7 +446,7 @@ static HashTable* php_phongo_readpreference_get_properties_hash(zval* object, bo
422446

423447
tags = mongoc_read_prefs_get_tags(intern->read_preference);
424448
mode = mongoc_read_prefs_get_mode(intern->read_preference);
425-
modeString = php_phongo_readpreference_get_mode_string(mode);
449+
modeString = php_phongo_readpreference_get_mode_string(mode TSRMLS_CC);
426450

427451
if (modeString) {
428452
#if PHP_VERSION_ID >= 70000
@@ -516,7 +540,7 @@ static PHP_METHOD(ReadPreference, serialize)
516540

517541
tags = mongoc_read_prefs_get_tags(intern->read_preference);
518542
mode = mongoc_read_prefs_get_mode(intern->read_preference);
519-
modeString = php_phongo_readpreference_get_mode_string(mode);
543+
modeString = php_phongo_readpreference_get_mode_string(mode TSRMLS_CC);
520544
maxStalenessSeconds = mongoc_read_prefs_get_max_staleness_seconds(intern->read_preference);
521545

522546
#if PHP_VERSION_ID >= 70000
@@ -644,6 +668,7 @@ static zend_function_entry php_phongo_readpreference_me[] = {
644668
PHP_ME(ReadPreference, __set_state, ai_ReadPreference___set_state, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
645669
PHP_ME(ReadPreference, getMaxStalenessSeconds, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
646670
PHP_ME(ReadPreference, getMode, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
671+
PHP_ME(ReadPreference, getModeString, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
647672
PHP_ME(ReadPreference, getTagSets, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
648673
PHP_ME(ReadPreference, bsonSerialize, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
649674
PHP_ME(ReadPreference, serialize, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
MongoDB\Driver\ReadPreference::getModeString()
3+
--FILE--
4+
<?php
5+
6+
$tests = [
7+
MongoDB\Driver\ReadPreference::RP_PRIMARY,
8+
MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED,
9+
MongoDB\Driver\ReadPreference::RP_SECONDARY,
10+
MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED,
11+
MongoDB\Driver\ReadPreference::RP_NEAREST,
12+
];
13+
14+
foreach ($tests as $test) {
15+
$rp = new MongoDB\Driver\ReadPreference($test);
16+
var_dump($rp->getModeString());
17+
}
18+
19+
?>
20+
===DONE===
21+
<?php exit(0); ?>
22+
--EXPECT--
23+
string(7) "primary"
24+
string(16) "primaryPreferred"
25+
string(9) "secondary"
26+
string(18) "secondaryPreferred"
27+
string(7) "nearest"
28+
===DONE===

0 commit comments

Comments
 (0)