Skip to content

Commit 8388aaa

Browse files
committed
Implement object comparison handler for read preference
1 parent 034974e commit 8388aaa

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

src/MongoDB/ReadPreference.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,12 +520,60 @@ static HashTable* phongo_readpreference_get_properties(zend_object* object)
520520
return phongo_readpreference_get_properties_hash(object, false);
521521
}
522522

523+
static int phongo_readpreference_compare_objects(zval* o1, zval* o2)
524+
{
525+
ZEND_COMPARE_OBJECTS_FALLBACK(o1, o2);
526+
527+
phongo_readpreference_t *intern1, *intern2;
528+
529+
const mongoc_read_prefs_t* rp1 = NULL;
530+
const mongoc_read_prefs_t* rp2 = NULL;
531+
532+
intern1 = Z_READPREFERENCE_OBJ_P(o1);
533+
intern2 = Z_READPREFERENCE_OBJ_P(o2);
534+
535+
if (intern1 && intern1->read_preference) {
536+
rp1 = intern1->read_preference;
537+
}
538+
539+
if (intern2 && intern2->read_preference) {
540+
rp2 = intern2->read_preference;
541+
}
542+
543+
if (rp1 == rp2) {
544+
return 0;
545+
}
546+
547+
if (!rp1 || !rp2) {
548+
return -1;
549+
}
550+
551+
if (mongoc_read_prefs_get_mode(rp1) != mongoc_read_prefs_get_mode(rp2)) {
552+
return -1;
553+
}
554+
555+
if (mongoc_read_prefs_get_max_staleness_seconds(rp1) != mongoc_read_prefs_get_max_staleness_seconds(rp2)) {
556+
return -1;
557+
}
558+
559+
if (bson_compare(mongoc_read_prefs_get_tags(rp1), mongoc_read_prefs_get_tags(rp2)) != 0) {
560+
return -1;
561+
}
562+
563+
if (bson_compare(mongoc_read_prefs_get_hedge(rp1), mongoc_read_prefs_get_hedge(rp2)) != 0) {
564+
return -1;
565+
}
566+
567+
return 0;
568+
}
569+
523570
void phongo_readpreference_init_ce(INIT_FUNC_ARGS)
524571
{
525572
phongo_readpreference_ce = register_class_MongoDB_Driver_ReadPreference(phongo_serializable_ce);
526573
phongo_readpreference_ce->create_object = phongo_readpreference_create_object;
527574

528575
memcpy(&phongo_handler_readpreference, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
576+
phongo_handler_readpreference.compare = phongo_readpreference_compare_objects;
529577
phongo_handler_readpreference.get_debug_info = phongo_readpreference_get_debug_info;
530578
phongo_handler_readpreference.get_properties = phongo_readpreference_get_properties;
531579
phongo_handler_readpreference.free_obj = phongo_readpreference_free_object;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
--TEST--
2+
MongoDB\Driver\ReadPreference equality comparison
3+
--FILE--
4+
<?php
5+
6+
// True: same mode
7+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::PRIMARY) == new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::PRIMARY));
8+
// True: same mode and tag sets
9+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, [['dc' => 'east']]) == new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, [['dc' => 'east']]));
10+
// True: same mode and maxStalenessSeconds
11+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, null, ['maxStalenessSeconds' => 120]) == new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, null, ['maxStalenessSeconds' => 120]));
12+
13+
// False for different modes
14+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::PRIMARY) == new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY));
15+
// False for different tag sets
16+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, [['dc' => 'east']]) == new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, [['dc' => 'west']]));
17+
// False for different maxStalenessSeconds
18+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, null, ['maxStalenessSeconds' => 120]) == new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, null, ['maxStalenessSeconds' => 180]));
19+
// False if one has tag sets and the other does not
20+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, [['dc' => 'east']]) == new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY));
21+
// False if one has maxStalenessSeconds and the other does not
22+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY, null, ['maxStalenessSeconds' => 120]) == new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::SECONDARY));
23+
24+
// Object comparison fallback if one value is not a ReadPreference
25+
var_dump(new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::PRIMARY) == new MongoDB\BSON\Int64('1'));
26+
27+
?>
28+
===DONE===
29+
<?php exit(0); ?>
30+
--EXPECT--
31+
bool(true)
32+
bool(true)
33+
bool(true)
34+
bool(false)
35+
bool(false)
36+
bool(false)
37+
bool(false)
38+
bool(false)
39+
bool(false)
40+
===DONE===

0 commit comments

Comments
 (0)