Skip to content

Commit 5b45b90

Browse files
committed
Merge pull request #226
2 parents 1c4caa2 + ba83c54 commit 5b45b90

16 files changed

+663
-22
lines changed

php_bson.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@
3939
typedef enum {
4040
PHONGO_BSON_NONE = 0x00,
4141
PHONGO_BSON_ADD_ID = 0x01,
42-
PHONGO_BSON_RETURN_ID = 0x02,
43-
PHONGO_BSON_ADD_ODS = 0x04,
44-
PHONGO_BSON_ADD_CHILD_ODS = 0x08
42+
PHONGO_BSON_RETURN_ID = 0x02
4543
} php_phongo_bson_flags_t;
4644

4745
typedef enum {

src/MongoDB/BulkWrite.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ PHP_METHOD(BulkWrite, insert)
105105
if (return_value_used) {
106106
bson_flags |= PHONGO_BSON_RETURN_ID;
107107
}
108-
bson_flags |= PHONGO_BSON_ADD_ODS|PHONGO_BSON_ADD_CHILD_ODS;
109108

110109
bson = bson_new();
111110
phongo_zval_to_bson(document, bson_flags, bson, &bson_out TSRMLS_CC);

src/bson.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -877,13 +877,11 @@ void object_to_bson(zval *object, php_phongo_bson_flags_t flags, const char *key
877877
#endif
878878
bson_append_document_begin(bson, key, key_len, &child);
879879
if (instanceof_function(Z_OBJCE_P(object), php_phongo_persistable_ce TSRMLS_CC)) {
880-
if (flags & PHONGO_BSON_ADD_CHILD_ODS) {
881880
#if PHP_VERSION_ID >= 70000
882-
bson_append_binary(&child, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(object)->name->val, Z_OBJCE_P(object)->name->len);
881+
bson_append_binary(&child, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(object)->name->val, Z_OBJCE_P(object)->name->len);
883882
#else
884-
bson_append_binary(&child, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(object)->name, strlen(Z_OBJCE_P(object)->name));
883+
bson_append_binary(&child, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(object)->name, strlen(Z_OBJCE_P(object)->name));
885884
#endif
886-
}
887885
}
888886
#if PHP_VERSION_ID >= 70000
889887
phongo_zval_to_bson(&obj_data, flags, &child, NULL TSRMLS_CC);
@@ -1161,15 +1159,13 @@ PHONGO_API void phongo_zval_to_bson(zval *data, php_phongo_bson_flags_t flags, b
11611159
#endif
11621160

11631161
if (instanceof_function(Z_OBJCE_P(data), php_phongo_persistable_ce TSRMLS_CC)) {
1164-
if (flags & PHONGO_BSON_ADD_ODS) {
11651162
#if PHP_VERSION_ID >= 70000
1166-
bson_append_binary(bson, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(data)->name->val, Z_OBJCE_P(data)->name->len);
1167-
zend_hash_str_del(ht_data, PHONGO_ODM_FIELD_NAME, sizeof(PHONGO_ODM_FIELD_NAME)-1);
1163+
bson_append_binary(bson, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(data)->name->val, Z_OBJCE_P(data)->name->len);
1164+
zend_hash_str_del(ht_data, PHONGO_ODM_FIELD_NAME, sizeof(PHONGO_ODM_FIELD_NAME)-1);
11681165
#else
1169-
bson_append_binary(bson, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(data)->name, strlen(Z_OBJCE_P(data)->name));
1170-
zend_hash_del(ht_data, PHONGO_ODM_FIELD_NAME, sizeof(PHONGO_ODM_FIELD_NAME));
1166+
bson_append_binary(bson, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(data)->name, strlen(Z_OBJCE_P(data)->name));
1167+
zend_hash_del(ht_data, PHONGO_ODM_FIELD_NAME, sizeof(PHONGO_ODM_FIELD_NAME));
11711168
#endif
1172-
}
11731169
}
11741170

11751171
break;
@@ -1459,7 +1455,7 @@ PHP_FUNCTION(fromPHP)
14591455
}
14601456

14611457
bson = bson_new();
1462-
phongo_zval_to_bson(data, PHONGO_BSON_ADD_ODS|PHONGO_BSON_ADD_CHILD_ODS, bson, NULL TSRMLS_CC);
1458+
phongo_zval_to_bson(data, PHONGO_BSON_NONE, bson, NULL TSRMLS_CC);
14631459

14641460
PHONGO_RETVAL_STRINGL((const char *) bson_get_data(bson), bson->len);
14651461
bson_destroy(bson);

tests/bson/bson-ods-001.phpt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
--TEST--
22
BSON encoding: Encoding data into BSON representation, and BSON into Extended JSON
3+
--XFAIL--
4+
Persistable::bsonSerialize() should not return atomic modifiers (see: PHPC-550)
35
--SKIPIF--
46
<?php require __DIR__ . "/../utils/basic-skipif.inc"?>
57
--FILE--

tests/bson/bson-ods-002.phpt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
--TEST--
22
BSON encoding: Encoding data into BSON representation, and BSON into Extended JSON
3+
--XFAIL--
4+
Persistable::bsonSerialize() should not return atomic modifiers (see: PHPC-550)
35
--INI--
46
date.timezone=America/Los_Angeles
57
--SKIPIF--

tests/bulk/bulkwrite-delete-001.phpt

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
--TEST--
2+
MongoDB\Driver\BulkWrite::delete() should always encode __pclass for Persistable objects
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+
use MongoDB\BSON as BSON;
10+
11+
class MyClass implements BSON\Persistable
12+
{
13+
private $id;
14+
private $child;
15+
16+
public function __construct($id, MyClass $child = null)
17+
{
18+
$this->id = $id;
19+
$this->child = $child;
20+
}
21+
22+
public function bsonSerialize()
23+
{
24+
return [
25+
'_id' => $this->id,
26+
'child' => $this->child,
27+
];
28+
}
29+
30+
public function bsonUnserialize(array $data)
31+
{
32+
$this->id = $data['_id'];
33+
$this->child = $data['child'];
34+
}
35+
}
36+
37+
$manager = new MongoDB\Driver\Manager(STANDALONE);
38+
39+
$document = new MyClass('foo', new MyClass('bar', new MyClass('baz')));
40+
41+
$bulk = new MongoDB\Driver\BulkWrite();
42+
$bulk->insert($document);
43+
$result = $manager->executeBulkWrite(NS, $bulk);
44+
printf("Inserted %d document(s)\n", $result->getInsertedCount());
45+
46+
$cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query([]));
47+
var_dump($cursor->toArray());
48+
49+
$bulk = new MongoDB\Driver\BulkWrite();
50+
$bulk->delete($document);
51+
$result = $manager->executeBulkWrite(NS, $bulk);
52+
printf("Deleted %d document(s)\n", $result->getDeletedCount());
53+
54+
$cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query([]));
55+
var_dump($cursor->toArray());
56+
57+
?>
58+
===DONE===
59+
<?php exit(0); ?>
60+
--EXPECTF--
61+
Inserted 1 document(s)
62+
array(1) {
63+
[0]=>
64+
object(MyClass)#%d (%d) {
65+
["id":"MyClass":private]=>
66+
string(3) "foo"
67+
["child":"MyClass":private]=>
68+
object(MyClass)#%d (%d) {
69+
["id":"MyClass":private]=>
70+
string(3) "bar"
71+
["child":"MyClass":private]=>
72+
object(MyClass)#%d (%d) {
73+
["id":"MyClass":private]=>
74+
string(3) "baz"
75+
["child":"MyClass":private]=>
76+
NULL
77+
}
78+
}
79+
}
80+
}
81+
Deleted 1 document(s)
82+
array(0) {
83+
}
84+
===DONE===

tests/bulk/bulkwrite-insert-001.phpt

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
--TEST--
2+
MongoDB\Driver\BulkWrite::insert() should always encode __pclass for Persistable objects
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+
use MongoDB\BSON as BSON;
10+
11+
class MyClass implements BSON\Persistable
12+
{
13+
private $id;
14+
private $child;
15+
16+
public function __construct($id, MyClass $child = null)
17+
{
18+
$this->id = $id;
19+
$this->child = $child;
20+
}
21+
22+
public function bsonSerialize()
23+
{
24+
return [
25+
'_id' => $this->id,
26+
'child' => $this->child,
27+
];
28+
}
29+
30+
public function bsonUnserialize(array $data)
31+
{
32+
$this->id = $data['_id'];
33+
$this->child = $data['child'];
34+
}
35+
}
36+
37+
$manager = new MongoDB\Driver\Manager(STANDALONE);
38+
39+
$bulk = new MongoDB\Driver\BulkWrite();
40+
$bulk->insert(new MyClass('foo', new MyClass('bar', new MyClass('baz'))));
41+
$result = $manager->executeBulkWrite(NS, $bulk);
42+
printf("Inserted %d document(s)\n", $result->getInsertedCount());
43+
44+
$cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query([]));
45+
var_dump($cursor->toArray());
46+
47+
?>
48+
===DONE===
49+
<?php exit(0); ?>
50+
--EXPECTF--
51+
Inserted 1 document(s)
52+
array(1) {
53+
[0]=>
54+
object(MyClass)#%d (%d) {
55+
["id":"MyClass":private]=>
56+
string(3) "foo"
57+
["child":"MyClass":private]=>
58+
object(MyClass)#%d (%d) {
59+
["id":"MyClass":private]=>
60+
string(3) "bar"
61+
["child":"MyClass":private]=>
62+
object(MyClass)#%d (%d) {
63+
["id":"MyClass":private]=>
64+
string(3) "baz"
65+
["child":"MyClass":private]=>
66+
NULL
67+
}
68+
}
69+
}
70+
}
71+
===DONE===

tests/bulk/bulkwrite-update-001.phpt

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
--TEST--
2+
MongoDB\Driver\BulkWrite::update() should always encode __pclass for Persistable objects
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+
use MongoDB\BSON as BSON;
10+
11+
class MyClass implements BSON\Persistable
12+
{
13+
private $id;
14+
private $child;
15+
16+
public function __construct($id, MyClass $child = null)
17+
{
18+
$this->id = $id;
19+
$this->child = $child;
20+
}
21+
22+
public function bsonSerialize()
23+
{
24+
return [
25+
'_id' => $this->id,
26+
'child' => $this->child,
27+
];
28+
}
29+
30+
public function bsonUnserialize(array $data)
31+
{
32+
$this->id = $data['_id'];
33+
$this->child = $data['child'];
34+
}
35+
}
36+
37+
$manager = new MongoDB\Driver\Manager(STANDALONE);
38+
39+
$document = new MyClass('foo', new MyClass('bar', new MyClass('baz')));
40+
41+
$bulk = new MongoDB\Driver\BulkWrite();
42+
$bulk->update(
43+
['_id' => 'foo'],
44+
$document,
45+
['upsert' => true]
46+
);
47+
$result = $manager->executeBulkWrite(NS, $bulk);
48+
printf("Upserted %d document(s)\n", $result->getUpsertedCount());
49+
50+
$cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query([]));
51+
var_dump($cursor->toArray());
52+
53+
$bulk = new MongoDB\Driver\BulkWrite();
54+
$bulk->update(
55+
$document,
56+
['$set' => ['child' => new MyClass('yip', new MyClass('yap'))]]
57+
);
58+
$result = $manager->executeBulkWrite(NS, $bulk);
59+
printf("Modified %d document(s)\n", $result->getModifiedCount());
60+
61+
$cursor = $manager->executeQuery(NS, new MongoDB\Driver\Query([]));
62+
var_dump($cursor->toArray());
63+
64+
?>
65+
===DONE===
66+
<?php exit(0); ?>
67+
--EXPECTF--
68+
Upserted 1 document(s)
69+
array(1) {
70+
[0]=>
71+
object(MyClass)#%d (%d) {
72+
["id":"MyClass":private]=>
73+
string(3) "foo"
74+
["child":"MyClass":private]=>
75+
object(MyClass)#%d (%d) {
76+
["id":"MyClass":private]=>
77+
string(3) "bar"
78+
["child":"MyClass":private]=>
79+
object(MyClass)#%d (%d) {
80+
["id":"MyClass":private]=>
81+
string(3) "baz"
82+
["child":"MyClass":private]=>
83+
NULL
84+
}
85+
}
86+
}
87+
}
88+
Modified 1 document(s)
89+
array(1) {
90+
[0]=>
91+
object(MyClass)#%d (%d) {
92+
["id":"MyClass":private]=>
93+
string(3) "foo"
94+
["child":"MyClass":private]=>
95+
object(MyClass)#%d (%d) {
96+
["id":"MyClass":private]=>
97+
string(3) "yip"
98+
["child":"MyClass":private]=>
99+
object(MyClass)#%d (%d) {
100+
["id":"MyClass":private]=>
101+
string(3) "yap"
102+
["child":"MyClass":private]=>
103+
NULL
104+
}
105+
}
106+
}
107+
}
108+
===DONE===

tests/bulk/write-0001.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
--TEST--
22
MongoDB\Driver\BulkWrite: #001 Variety Bulk
33
--SKIPIF--
4-
<?php require __DIR__ . "/../utils/basic-skipif.inc"?>
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; CLEANUP(STANDALONE); ?>
55
--FILE--
66
<?php
77
require_once __DIR__ . "/../utils/basic.inc";

tests/bulk/write-0002.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
--TEST--
22
MongoDB\Driver\BulkWrite: #002 Get the generated ID
33
--SKIPIF--
4-
<?php require __DIR__ . "/../utils/basic-skipif.inc"?>
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; CLEANUP(STANDALONE); ?>
55
--FILE--
66
<?php
77
require_once __DIR__ . "/../utils/basic.inc";
@@ -19,7 +19,7 @@ $w = 1;
1919
$wtimeout = 1000;
2020
$writeConcern = new \MongoDB\Driver\WriteConcern($w, $wtimeout);
2121
var_dump($insertBulk);
22-
$result = $manager->executeBulkWrite("db.collection", $insertBulk, $writeConcern);
22+
$result = $manager->executeBulkWrite(NS, $insertBulk, $writeConcern);
2323
var_dump($insertBulk);
2424

2525
assert($result instanceof \MongoDB\Driver\WriteResult);
@@ -50,9 +50,9 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
5050
}
5151
object(MongoDB\Driver\BulkWrite)#%d (%d) {
5252
["database"]=>
53-
string(2) "db"
53+
string(6) "phongo"
5454
["collection"]=>
55-
string(10) "collection"
55+
string(15) "bulk_write_0002"
5656
["ordered"]=>
5757
bool(true)
5858
["executed"]=>

0 commit comments

Comments
 (0)