Skip to content

Commit c598560

Browse files
committed
Merge pull request #1062
2 parents 638c908 + 24de9ca commit c598560

File tree

3 files changed

+138
-37
lines changed

3 files changed

+138
-37
lines changed

src/MongoDB/ReadPreference.c

Lines changed: 74 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@
3434

3535
zend_class_entry* php_phongo_readpreference_ce;
3636

37+
#define PHONGO_READ_PRIMARY "primary"
38+
#define PHONGO_READ_PRIMARY_PREFERRED "primaryPreferred"
39+
#define PHONGO_READ_SECONDARY "secondary"
40+
#define PHONGO_READ_SECONDARY_PREFERRED "secondaryPreferred"
41+
#define PHONGO_READ_NEAREST "nearest"
42+
3743
/* Initialize the object from a HashTable and return whether it was successful.
3844
* An exception will be thrown on error. */
3945
static bool php_phongo_readpreference_init_from_hash(php_phongo_readpreference_t* intern, HashTable* props TSRMLS_DC) /* {{{ */
@@ -42,15 +48,15 @@ static bool php_phongo_readpreference_init_from_hash(php_phongo_readpreference_t
4248
zval *mode, *tagSets, *maxStalenessSeconds;
4349

4450
if ((mode = zend_hash_str_find(props, "mode", sizeof("mode") - 1)) && Z_TYPE_P(mode) == IS_STRING) {
45-
if (strcasecmp(Z_STRVAL_P(mode), "primary") == 0) {
51+
if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_PRIMARY) == 0) {
4652
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_PRIMARY);
47-
} else if (strcasecmp(Z_STRVAL_P(mode), "primaryPreferred") == 0) {
53+
} else if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_PRIMARY_PREFERRED) == 0) {
4854
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_PRIMARY_PREFERRED);
49-
} else if (strcasecmp(Z_STRVAL_P(mode), "secondary") == 0) {
55+
} else if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_SECONDARY) == 0) {
5056
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_SECONDARY);
51-
} else if (strcasecmp(Z_STRVAL_P(mode), "secondaryPreferred") == 0) {
57+
} else if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_SECONDARY_PREFERRED) == 0) {
5258
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED);
53-
} else if (strcasecmp(Z_STRVAL_P(mode), "nearest") == 0) {
59+
} else if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_NEAREST) == 0) {
5460
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_NEAREST);
5561
} else {
5662
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "%s initialization requires specific values for \"mode\" string field", ZSTR_VAL(php_phongo_readpreference_ce->name));
@@ -113,15 +119,15 @@ static bool php_phongo_readpreference_init_from_hash(php_phongo_readpreference_t
113119
zval **mode, **tagSets, **maxStalenessSeconds;
114120

115121
if (zend_hash_find(props, "mode", sizeof("mode"), (void**) &mode) == SUCCESS && Z_TYPE_PP(mode) == IS_STRING) {
116-
if (strcasecmp(Z_STRVAL_PP(mode), "primary") == 0) {
122+
if (strcasecmp(Z_STRVAL_PP(mode), PHONGO_READ_PRIMARY) == 0) {
117123
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_PRIMARY);
118-
} else if (strcasecmp(Z_STRVAL_PP(mode), "primaryPreferred") == 0) {
124+
} else if (strcasecmp(Z_STRVAL_PP(mode), PHONGO_READ_PRIMARY_PREFERRED) == 0) {
119125
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_PRIMARY_PREFERRED);
120-
} else if (strcasecmp(Z_STRVAL_PP(mode), "secondary") == 0) {
126+
} else if (strcasecmp(Z_STRVAL_PP(mode), PHONGO_READ_SECONDARY) == 0) {
121127
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_SECONDARY);
122-
} else if (strcasecmp(Z_STRVAL_PP(mode), "secondaryPreferred") == 0) {
128+
} else if (strcasecmp(Z_STRVAL_PP(mode), PHONGO_READ_SECONDARY_PREFERRED) == 0) {
123129
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED);
124-
} else if (strcasecmp(Z_STRVAL_PP(mode), "nearest") == 0) {
130+
} else if (strcasecmp(Z_STRVAL_PP(mode), PHONGO_READ_NEAREST) == 0) {
125131
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_NEAREST);
126132
} else {
127133
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "%s initialization requires specific values for \"mode\" string field", ZSTR_VAL(php_phongo_readpreference_ce->name));
@@ -190,6 +196,28 @@ static bool php_phongo_readpreference_init_from_hash(php_phongo_readpreference_t
190196
return false;
191197
} /* }}} */
192198

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+
193221
/* {{{ proto void MongoDB\Driver\ReadPreference::__construct(int|string $mode[, array $tagSets = array()[, array $options = array()]])
194222
Constructs a new ReadPreference */
195223
static PHP_METHOD(ReadPreference, __construct)
@@ -225,15 +253,15 @@ static PHP_METHOD(ReadPreference, __construct)
225253
return;
226254
}
227255
} else if (Z_TYPE_P(mode) == IS_STRING) {
228-
if (strcasecmp(Z_STRVAL_P(mode), "primary") == 0) {
256+
if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_PRIMARY) == 0) {
229257
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_PRIMARY);
230-
} else if (strcasecmp(Z_STRVAL_P(mode), "primaryPreferred") == 0) {
258+
} else if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_PRIMARY_PREFERRED) == 0) {
231259
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_PRIMARY_PREFERRED);
232-
} else if (strcasecmp(Z_STRVAL_P(mode), "secondary") == 0) {
260+
} else if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_SECONDARY) == 0) {
233261
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_SECONDARY);
234-
} else if (strcasecmp(Z_STRVAL_P(mode), "secondaryPreferred") == 0) {
262+
} else if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_SECONDARY_PREFERRED) == 0) {
235263
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED);
236-
} else if (strcasecmp(Z_STRVAL_P(mode), "nearest") == 0) {
264+
} else if (strcasecmp(Z_STRVAL_P(mode), PHONGO_READ_NEAREST) == 0) {
237265
intern->read_preference = mongoc_read_prefs_new(MONGOC_READ_NEAREST);
238266
} else {
239267
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Invalid mode: '%s'", Z_STRVAL_P(mode));
@@ -343,6 +371,28 @@ static PHP_METHOD(ReadPreference, getMode)
343371
RETURN_LONG(mongoc_read_prefs_get_mode(intern->read_preference));
344372
} /* }}} */
345373

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+
346396
/* {{{ proto array MongoDB\Driver\ReadPreference::getTagSets()
347397
Returns the ReadPreference tag sets */
348398
static PHP_METHOD(ReadPreference, getTagSets)
@@ -378,26 +428,6 @@ static PHP_METHOD(ReadPreference, getTagSets)
378428
}
379429
} /* }}} */
380430

381-
static const char* php_phongo_readpreference_get_mode_string(mongoc_read_mode_t mode) /* {{{ */
382-
{
383-
switch (mode) {
384-
case MONGOC_READ_PRIMARY:
385-
return "primary";
386-
case MONGOC_READ_PRIMARY_PREFERRED:
387-
return "primaryPreferred";
388-
case MONGOC_READ_SECONDARY:
389-
return "secondary";
390-
case MONGOC_READ_SECONDARY_PREFERRED:
391-
return "secondaryPreferred";
392-
case MONGOC_READ_NEAREST:
393-
return "nearest";
394-
default: /* Do nothing */
395-
break;
396-
}
397-
398-
return NULL;
399-
} /* }}} */
400-
401431
static HashTable* php_phongo_readpreference_get_properties_hash(zval* object, bool is_debug TSRMLS_DC) /* {{{ */
402432
{
403433
php_phongo_readpreference_t* intern;
@@ -416,7 +446,7 @@ static HashTable* php_phongo_readpreference_get_properties_hash(zval* object, bo
416446

417447
tags = mongoc_read_prefs_get_tags(intern->read_preference);
418448
mode = mongoc_read_prefs_get_mode(intern->read_preference);
419-
modeString = php_phongo_readpreference_get_mode_string(mode);
449+
modeString = php_phongo_readpreference_get_mode_string(mode TSRMLS_CC);
420450

421451
if (modeString) {
422452
#if PHP_VERSION_ID >= 70000
@@ -510,7 +540,7 @@ static PHP_METHOD(ReadPreference, serialize)
510540

511541
tags = mongoc_read_prefs_get_tags(intern->read_preference);
512542
mode = mongoc_read_prefs_get_mode(intern->read_preference);
513-
modeString = php_phongo_readpreference_get_mode_string(mode);
543+
modeString = php_phongo_readpreference_get_mode_string(mode TSRMLS_CC);
514544
maxStalenessSeconds = mongoc_read_prefs_get_max_staleness_seconds(intern->read_preference);
515545

516546
#if PHP_VERSION_ID >= 70000
@@ -638,6 +668,7 @@ static zend_function_entry php_phongo_readpreference_me[] = {
638668
PHP_ME(ReadPreference, __set_state, ai_ReadPreference___set_state, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
639669
PHP_ME(ReadPreference, getMaxStalenessSeconds, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
640670
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)
641672
PHP_ME(ReadPreference, getTagSets, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
642673
PHP_ME(ReadPreference, bsonSerialize, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
643674
PHP_ME(ReadPreference, serialize, ai_ReadPreference_void, ZEND_ACC_PUBLIC | ZEND_ACC_FINAL)
@@ -733,6 +764,12 @@ void php_phongo_readpreference_init_ce(INIT_FUNC_ARGS) /* {{{ */
733764
zend_declare_class_constant_long(php_phongo_readpreference_ce, ZEND_STRL("RP_NEAREST"), MONGOC_READ_NEAREST TSRMLS_CC);
734765
zend_declare_class_constant_long(php_phongo_readpreference_ce, ZEND_STRL("NO_MAX_STALENESS"), MONGOC_NO_MAX_STALENESS TSRMLS_CC);
735766
zend_declare_class_constant_long(php_phongo_readpreference_ce, ZEND_STRL("SMALLEST_MAX_STALENESS_SECONDS"), MONGOC_SMALLEST_MAX_STALENESS_SECONDS TSRMLS_CC);
767+
768+
zend_declare_class_constant_string(php_phongo_readpreference_ce, ZEND_STRL("PRIMARY"), PHONGO_READ_PRIMARY TSRMLS_CC);
769+
zend_declare_class_constant_string(php_phongo_readpreference_ce, ZEND_STRL("PRIMARY_PREFERRED"), PHONGO_READ_PRIMARY_PREFERRED TSRMLS_CC);
770+
zend_declare_class_constant_string(php_phongo_readpreference_ce, ZEND_STRL("SECONDARY"), PHONGO_READ_SECONDARY TSRMLS_CC);
771+
zend_declare_class_constant_string(php_phongo_readpreference_ce, ZEND_STRL("SECONDARY_PREFERRED"), PHONGO_READ_SECONDARY_PREFERRED TSRMLS_CC);
772+
zend_declare_class_constant_string(php_phongo_readpreference_ce, ZEND_STRL("NEAREST"), PHONGO_READ_NEAREST TSRMLS_CC);
736773
} /* }}} */
737774

738775
/*
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
--TEST--
2+
MongoDB\Driver\ReadPreference constants
3+
--FILE--
4+
<?php
5+
6+
var_dump(MongoDB\Driver\ReadPreference::RP_PRIMARY);
7+
var_dump(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED);
8+
var_dump(MongoDB\Driver\ReadPreference::RP_SECONDARY);
9+
var_dump(MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED);
10+
var_dump(MongoDB\Driver\ReadPreference::RP_NEAREST);
11+
var_dump(MongoDB\Driver\ReadPreference::NO_MAX_STALENESS);
12+
var_dump(MongoDB\Driver\ReadPreference::SMALLEST_MAX_STALENESS_SECONDS);
13+
14+
var_dump(MongoDB\Driver\ReadPreference::PRIMARY);
15+
var_dump(MongoDB\Driver\ReadPreference::PRIMARY_PREFERRED);
16+
var_dump(MongoDB\Driver\ReadPreference::SECONDARY);
17+
var_dump(MongoDB\Driver\ReadPreference::SECONDARY_PREFERRED);
18+
var_dump(MongoDB\Driver\ReadPreference::NEAREST);
19+
20+
?>
21+
===DONE===
22+
<?php exit(0); ?>
23+
--EXPECTF--
24+
int(1)
25+
int(5)
26+
int(2)
27+
int(6)
28+
int(10)
29+
int(-1)
30+
int(90)
31+
string(7) "primary"
32+
string(16) "primaryPreferred"
33+
string(9) "secondary"
34+
string(18) "secondaryPreferred"
35+
string(7) "nearest"
36+
===DONE===
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)