Skip to content

Commit 4f5c604

Browse files
authored
PHPC-1627 Support object cloning for ReadConcern, ReadPreference, and WriteConcern (#2002)
1 parent aed08ff commit 4f5c604

6 files changed

Lines changed: 159 additions & 4 deletions

File tree

src/MongoDB/ReadConcern.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,32 @@ static zend_object* phongo_readconcern_create_object(zend_class_entry* class_typ
188188
return &intern->std;
189189
}
190190

191+
static zend_object* phongo_readconcern_clone_object(zend_object* object)
192+
{
193+
PHONGO_INTERN_FROM_Z_OBJ(readconcern, object);
194+
195+
phongo_readconcern_t* new_intern;
196+
zend_object* new_object;
197+
198+
new_object = phongo_readconcern_create_object(object->ce);
199+
200+
new_intern = Z_OBJ_READCONCERN(new_object);
201+
zend_objects_clone_members(&new_intern->std, &intern->std);
202+
203+
new_intern->read_concern = mongoc_read_concern_copy(intern->read_concern);
204+
205+
return new_object;
206+
}
207+
191208
void phongo_readconcern_init_ce(INIT_FUNC_ARGS)
192209
{
193210
phongo_readconcern_ce = register_class_MongoDB_Driver_ReadConcern(phongo_serializable_ce);
194211
phongo_readconcern_ce->create_object = phongo_readconcern_create_object;
195212

196213
memcpy(&phongo_handler_readconcern, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
197-
phongo_handler_readconcern.free_obj = phongo_readconcern_free_object;
198-
phongo_handler_readconcern.offset = XtOffsetOf(phongo_readconcern_t, std);
214+
phongo_handler_readconcern.clone_obj = phongo_readconcern_clone_object;
215+
phongo_handler_readconcern.free_obj = phongo_readconcern_free_object;
216+
phongo_handler_readconcern.offset = XtOffsetOf(phongo_readconcern_t, std);
199217
}
200218

201219
void phongo_readconcern_init(zval* return_value, const mongoc_read_concern_t* read_concern)

src/MongoDB/ReadPreference.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,23 @@ static zend_object* phongo_readpreference_create_object(zend_class_entry* class_
487487
return &intern->std;
488488
}
489489

490+
static zend_object* phongo_readpreference_clone_object(zend_object* object)
491+
{
492+
PHONGO_INTERN_FROM_Z_OBJ(readpreference, object);
493+
494+
phongo_readpreference_t* new_intern;
495+
zend_object* new_object;
496+
497+
new_object = phongo_readpreference_create_object(object->ce);
498+
499+
new_intern = Z_OBJ_READPREFERENCE(new_object);
500+
zend_objects_clone_members(&new_intern->std, &intern->std);
501+
502+
new_intern->read_preference = mongoc_read_prefs_copy(intern->read_preference);
503+
504+
return new_object;
505+
}
506+
490507
static zval* phongo_readpreference_read_property(zend_object* zobj, zend_string* name, int type, void** cache_slot, zval* rv)
491508
{
492509
if (!strcmp(ZSTR_VAL(name), "hedge")) {
@@ -502,6 +519,7 @@ void phongo_readpreference_init_ce(INIT_FUNC_ARGS)
502519
phongo_readpreference_ce->create_object = phongo_readpreference_create_object;
503520

504521
memcpy(&phongo_handler_readpreference, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
522+
phongo_handler_readpreference.clone_obj = phongo_readpreference_clone_object;
505523
phongo_handler_readpreference.read_property = phongo_readpreference_read_property;
506524
phongo_handler_readpreference.free_obj = phongo_readpreference_free_object;
507525
phongo_handler_readpreference.offset = XtOffsetOf(phongo_readpreference_t, std);

src/MongoDB/WriteConcern.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,14 +358,32 @@ static zend_object* phongo_writeconcern_create_object(zend_class_entry* class_ty
358358
return &intern->std;
359359
}
360360

361+
static zend_object* phongo_writeconcern_clone_object(zend_object* object)
362+
{
363+
PHONGO_INTERN_FROM_Z_OBJ(writeconcern, object);
364+
365+
phongo_writeconcern_t* new_intern;
366+
zend_object* new_object;
367+
368+
new_object = phongo_writeconcern_create_object(object->ce);
369+
370+
new_intern = Z_OBJ_WRITECONCERN(new_object);
371+
zend_objects_clone_members(&new_intern->std, &intern->std);
372+
373+
new_intern->write_concern = mongoc_write_concern_copy(intern->write_concern);
374+
375+
return new_object;
376+
}
377+
361378
void phongo_writeconcern_init_ce(INIT_FUNC_ARGS)
362379
{
363380
phongo_writeconcern_ce = register_class_MongoDB_Driver_WriteConcern(phongo_serializable_ce);
364381
phongo_writeconcern_ce->create_object = phongo_writeconcern_create_object;
365382

366383
memcpy(&phongo_handler_writeconcern, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
367-
phongo_handler_writeconcern.free_obj = phongo_writeconcern_free_object;
368-
phongo_handler_writeconcern.offset = XtOffsetOf(phongo_writeconcern_t, std);
384+
phongo_handler_writeconcern.clone_obj = phongo_writeconcern_clone_object;
385+
phongo_handler_writeconcern.free_obj = phongo_writeconcern_free_object;
386+
phongo_handler_writeconcern.offset = XtOffsetOf(phongo_writeconcern_t, std);
369387
}
370388

371389
void phongo_writeconcern_init(zval* return_value, const mongoc_write_concern_t* write_concern)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
MongoDB\Driver\ReadConcern can be cloned
3+
--FILE--
4+
<?php
5+
6+
require_once __DIR__ . '/../utils/basic.inc';
7+
8+
$readConcern = new MongoDB\Driver\ReadConcern(MongoDB\Driver\ReadConcern::LOCAL);
9+
$clone = clone $readConcern;
10+
11+
var_dump($clone == $readConcern);
12+
var_dump($clone === $readConcern);
13+
14+
unset($readConcern);
15+
16+
var_dump($clone);
17+
?>
18+
===DONE===
19+
<?php exit(0); ?>
20+
--EXPECTF--
21+
bool(true)
22+
bool(false)
23+
object(MongoDB\Driver\ReadConcern)#%d (%d) {
24+
["level"]=>
25+
string(5) "local"
26+
}
27+
===DONE===
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
--TEST--
2+
MongoDB\Driver\ReadPreference can be cloned
3+
--FILE--
4+
<?php
5+
6+
require_once __DIR__ . '/../utils/basic.inc';
7+
8+
$readPreference = new MongoDB\Driver\ReadPreference(
9+
MongoDB\Driver\ReadPreference::SECONDARY,
10+
[['dc' => 'ny']],
11+
['maxStalenessSeconds' => 1000]
12+
);
13+
$clone = clone $readPreference;
14+
15+
var_dump($clone == $readPreference);
16+
var_dump($clone === $readPreference);
17+
18+
unset($readPreference);
19+
20+
var_dump($clone);
21+
?>
22+
===DONE===
23+
<?php exit(0); ?>
24+
--EXPECTF--
25+
bool(true)
26+
bool(false)
27+
object(MongoDB\Driver\ReadPreference)#%d (%d) {
28+
["mode"]=>
29+
string(9) "secondary"
30+
["tags"]=>
31+
array(1) {
32+
[0]=>
33+
object(stdClass)#%d (%d) {
34+
["dc"]=>
35+
string(2) "ny"
36+
}
37+
}
38+
["maxStalenessSeconds"]=>
39+
int(1000)
40+
["hedge"]=>
41+
NULL
42+
}
43+
===DONE===
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--TEST--
2+
MongoDB\Driver\WriteConcern can be cloned
3+
--FILE--
4+
<?php
5+
6+
require_once __DIR__ . '/../utils/basic.inc';
7+
8+
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000, true);
9+
$clone = clone $writeConcern;
10+
11+
var_dump($clone == $writeConcern);
12+
var_dump($clone === $writeConcern);
13+
14+
unset($writeConcern);
15+
16+
var_dump($clone);
17+
?>
18+
===DONE===
19+
<?php exit(0); ?>
20+
--EXPECTF--
21+
bool(true)
22+
bool(false)
23+
object(MongoDB\Driver\WriteConcern)#%d (%d) {
24+
["w"]=>
25+
string(8) "majority"
26+
["j"]=>
27+
bool(true)
28+
["wtimeout"]=>
29+
int(1000)
30+
}
31+
===DONE===

0 commit comments

Comments
 (0)