Skip to content

Commit fa1a263

Browse files
committed
PHPC-260: Allow/use "object" in setTypeMap() as alias/preferred for "stdclass"
1 parent f1d053a commit fa1a263

File tree

3 files changed

+67
-7
lines changed

3 files changed

+67
-7
lines changed

php_bson.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ typedef enum {
4141
typedef enum {
4242
PHONGO_TYPEMAP_NONE,
4343
PHONGO_TYPEMAP_NATIVE_ARRAY,
44-
PHONGO_TYPEMAP_NATIVE_STDCLASS,
44+
PHONGO_TYPEMAP_NATIVE_OBJECT,
4545
PHONGO_TYPEMAP_CLASS
4646
} php_phongo_bson_typemap_types;
4747

src/bson.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ bool php_phongo_bson_visit_document(const bson_iter_t *iter ARG_UNUSED, const ch
485485
break;
486486
}
487487

488-
case PHONGO_TYPEMAP_NATIVE_STDCLASS:
488+
case PHONGO_TYPEMAP_NATIVE_OBJECT:
489489
default:
490490
object_and_properties_init(state.zchild, zend_standard_class_def, Z_ARRVAL_P(state.zchild));
491491
add_assoc_zval(retval, key, state.zchild);
@@ -532,7 +532,7 @@ bool php_phongo_bson_visit_array(const bson_iter_t *iter ARG_UNUSED, const char
532532
*/
533533

534534
/* break intentionally omitted */
535-
case PHONGO_TYPEMAP_NATIVE_STDCLASS:
535+
case PHONGO_TYPEMAP_NATIVE_OBJECT:
536536
object_and_properties_init(state.zchild, zend_standard_class_def, Z_ARRVAL_P(state.zchild));
537537
add_assoc_zval(retval, key, state.zchild);
538538
Z_SET_REFCOUNT_P(state.zchild, 1);
@@ -938,8 +938,8 @@ void php_phongo_bson_typemap_to_state(zval *typemap, php_phongo_bson_typemap *ma
938938
if (classname_len) {
939939
if (!strcasecmp(classname, "array")) {
940940
map->array_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
941-
} else if (!strcasecmp(classname, "stdclass")) {
942-
map->array_type = PHONGO_TYPEMAP_NATIVE_STDCLASS;
941+
} else if (!strcasecmp(classname, "stdclass") || !strcasecmp(classname, "object")) {
942+
map->array_type = PHONGO_TYPEMAP_NATIVE_OBJECT;
943943
} else {
944944
map->array_type = PHONGO_TYPEMAP_CLASS;
945945
array_ce = zend_fetch_class(classname, classname_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
@@ -957,8 +957,8 @@ void php_phongo_bson_typemap_to_state(zval *typemap, php_phongo_bson_typemap *ma
957957
if (classname_len) {
958958
if (!strcasecmp(classname, "array")) {
959959
map->document_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
960-
} else if (!strcasecmp(classname, "stdclass")) {
961-
map->document_type = PHONGO_TYPEMAP_NATIVE_STDCLASS;
960+
} else if (!strcasecmp(classname, "stdclass") || !strcasecmp(classname, "object")) {
961+
map->document_type = PHONGO_TYPEMAP_NATIVE_OBJECT;
962962
} else {
963963
map->document_type = PHONGO_TYPEMAP_CLASS;
964964
document_ce = zend_fetch_class(classname, classname_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);

tests/bson/typemap-002.phpt

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
--TEST--
2+
MongoDB\Driver\Cursor::setTypeMap(): Setting using type "object"
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; CLEANUP(STANDALONE) ?>
5+
--FILE--
6+
<?php
7+
require_once __DIR__ . "/../utils/basic.inc";
8+
9+
class MyArrayObject extends ArrayObject implements BSON\Unserializable
10+
{
11+
function bsonUnserialize(array $data)
12+
{
13+
parent::__construct($data);
14+
}
15+
}
16+
17+
$manager = new MongoDB\Driver\Manager(STANDALONE);
18+
19+
$manager->executeInsert(NS, array('_id' => 1, 'bson_array' => array(1, 2, 3), 'bson_object' => array("string" => "keys", "for" => "ever")));
20+
$manager->executeInsert(NS, array('_id' => 2, 'bson_array' => array(4, 5, 6)));
21+
22+
function fetch($manager, $typemap = array()) {
23+
$cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query(array('bson_array' => 1)));
24+
if ($typemap) {
25+
$cursor->setTypeMap($typemap);
26+
}
27+
28+
$documents = $cursor->toArray();
29+
return $documents;
30+
}
31+
32+
33+
34+
/* Setting to stdlcass & array */
35+
$documents = fetch($manager, array("array" => "object", "document" => "array"));
36+
var_dump(is_object($documents[0]['bson_array']));
37+
var_dump(is_array($documents[0]['bson_object']));
38+
39+
40+
/* Setting to array & object */
41+
$documents = fetch($manager, array("array" => "array", "document" => "object"));
42+
var_dump(is_array($documents[0]['bson_array']));
43+
var_dump(is_object($documents[0]['bson_object']));
44+
45+
46+
/* Setting to object */
47+
$documents = fetch($manager, array("array" => "object", "document" => "object"));
48+
var_dump(is_object($documents[0]['bson_array']));
49+
var_dump(is_object($documents[0]['bson_object']));
50+
?>
51+
===DONE===
52+
<?php exit(0); ?>
53+
--EXPECT--
54+
bool(true)
55+
bool(true)
56+
bool(true)
57+
bool(true)
58+
bool(true)
59+
bool(true)
60+
===DONE===

0 commit comments

Comments
 (0)