Skip to content
This repository was archived by the owner on Dec 23, 2021. It is now read-only.

Commit 49fe7b5

Browse files
committed
HHVM-158: BSON objects should implement JsonSerializable
1 parent 5263949 commit 49fe7b5

11 files changed

+216
-9
lines changed

ext_mongodb.php

Lines changed: 75 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ public function unserialize(mixed $data) : void
945945
}
946946
}
947947

948-
final class Binary implements Type, \Serializable
948+
final class Binary implements Type, \Serializable, \JsonSerializable
949949
{
950950
static private function checkArray(array $state)
951951
{
@@ -966,6 +966,14 @@ public function serialize() : string
966966
] );
967967
}
968968

969+
public function jsonSerialize() : mixed
970+
{
971+
return [
972+
'$binary' => base64_encode( $this->data ),
973+
'$type' => sprintf( "%02x", $this->type )
974+
];
975+
}
976+
969977
public function unserialize(mixed $serialized) : void
970978
{
971979
$unserialized = unserialize( $serialized );
@@ -1012,7 +1020,7 @@ function __debugInfo() : array;
10121020
}
10131021

10141022
<<__NativeData("MongoDBBsonDecimal128")>>
1015-
final class Decimal128 implements Type, \Serializable
1023+
final class Decimal128 implements Type, \Serializable, \JsonSerializable
10161024
{
10171025
static private function checkArray(array $state)
10181026
{
@@ -1030,6 +1038,13 @@ public function serialize() : string
10301038
] );
10311039
}
10321040

1041+
public function jsonSerialize() : mixed
1042+
{
1043+
return [
1044+
'$numberDecimal' => (string) $this->dec
1045+
];
1046+
}
1047+
10331048
public function unserialize(mixed $serialized) : void
10341049
{
10351050
$unserialized = unserialize( $serialized );
@@ -1053,7 +1068,7 @@ function __toString() : string;
10531068
function __debugInfo() : array;
10541069
}
10551070

1056-
final class Javascript implements Type, \Serializable
1071+
final class Javascript implements Type, \Serializable, \JsonSerializable
10571072
{
10581073
private $code;
10591074
private $scope;
@@ -1084,6 +1099,11 @@ public function serialize() : string
10841099
return serialize( $s );
10851100
}
10861101

1102+
public function jsonSerialize() : mixed
1103+
{
1104+
return $this->code;
1105+
}
1106+
10871107
public function unserialize(mixed $serialized) : void
10881108
{
10891109
$unserialized = unserialize( $serialized );
@@ -1145,13 +1165,20 @@ public function __toString() : string
11451165
}
11461166
}
11471167

1148-
final class MaxKey implements Type, \Serializable
1168+
final class MaxKey implements Type, \Serializable, \JsonSerializable
11491169
{
11501170
public function serialize() : string
11511171
{
11521172
return '';
11531173
}
11541174

1175+
public function jsonSerialize() : mixed
1176+
{
1177+
return [
1178+
'$maxKey' => 1
1179+
];
1180+
}
1181+
11551182
public function unserialize(mixed $serialized) : void
11561183
{
11571184
}
@@ -1162,13 +1189,20 @@ static public function __set_state(array $state)
11621189
}
11631190
}
11641191

1165-
final class MinKey implements Type, \Serializable
1192+
final class MinKey implements Type, \Serializable, \JsonSerializable
11661193
{
11671194
public function serialize() : string
11681195
{
11691196
return '';
11701197
}
11711198

1199+
public function jsonSerialize() : mixed
1200+
{
1201+
return [
1202+
'$minKey' => 1
1203+
];
1204+
}
1205+
11721206
public function unserialize(mixed $serialized) : void
11731207
{
11741208
}
@@ -1180,7 +1214,7 @@ static public function __set_state(array $state)
11801214
}
11811215

11821216
<<__NativeData("MongoDBBsonObjectID")>>
1183-
final class ObjectID implements Type, \Serializable
1217+
final class ObjectID implements Type, \Serializable, \JsonSerializable
11841218
{
11851219
static private function checkArray( array $state )
11861220
{
@@ -1198,6 +1232,13 @@ public function serialize() : string
11981232
] );
11991233
}
12001234

1235+
public function jsonSerialize() : mixed
1236+
{
1237+
return [
1238+
'$oid' => $this->__toString()
1239+
];
1240+
}
1241+
12011242
public function unserialize(mixed $serialized) : void
12021243
{
12031244
$unserialized = unserialize( $serialized );
@@ -1226,7 +1267,7 @@ public function getTimestamp() : int
12261267
}
12271268
}
12281269

1229-
final class Regex implements Type, \Serializable
1270+
final class Regex implements Type, \Serializable, \JsonSerializable
12301271
{
12311272
private $pattern;
12321273
private $flags;
@@ -1250,6 +1291,14 @@ public function serialize() : string
12501291
] );
12511292
}
12521293

1294+
public function jsonSerialize() : mixed
1295+
{
1296+
return [
1297+
'$regex' => $this->pattern,
1298+
'$options' => $this->flags,
1299+
];
1300+
}
1301+
12531302
public function unserialize(mixed $serialized) : void
12541303
{
12551304
$unserialized = unserialize( $serialized );
@@ -1302,7 +1351,7 @@ public function __debugInfo() : array
13021351
}
13031352
}
13041353

1305-
final class Timestamp implements Type, \Serializable
1354+
final class Timestamp implements Type, \Serializable, \JsonSerializable
13061355
{
13071356
static private function checkArray( array $state )
13081357
{
@@ -1338,6 +1387,16 @@ public function serialize() : string
13381387
] );
13391388
}
13401389

1390+
public function jsonSerialize() : mixed
1391+
{
1392+
return [
1393+
'$timestamp' => [
1394+
't' => (int) $this->timestamp,
1395+
'i' => (int) $this->increment,
1396+
]
1397+
];
1398+
}
1399+
13411400
public function unserialize(mixed $serialized) : void
13421401
{
13431402
$unserialized = unserialize( $serialized );
@@ -1389,7 +1448,7 @@ public function __debugInfo() : array
13891448
}
13901449
}
13911450

1392-
final class UTCDateTime implements Type, \Serializable
1451+
final class UTCDateTime implements Type, \Serializable, \JsonSerializable
13931452
{
13941453
private string $milliseconds;
13951454

@@ -1410,6 +1469,13 @@ public function serialize() : string
14101469
] );
14111470
}
14121471

1472+
public function jsonSerialize() : mixed
1473+
{
1474+
return [
1475+
'$date' => (int) $this->milliseconds
1476+
];
1477+
}
1478+
14131479
public function unserialize(mixed $serialized) : void
14141480
{
14151481
$unserialized = unserialize( $serialized );

tests/json-serialize-binary.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: Binary
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Binary( "gargleblaster", 24 )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : { "$binary" : "Z2FyZ2xlYmxhc3Rlcg==", "$type" : "18" } }
14+
{"foo":{"$binary":"Z2FyZ2xlYmxhc3Rlcg==","$type":"18"}}

tests/json-serialize-decimal128.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: Decimal128
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Decimal128( "12389719287312" )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : { "$numberDecimal" : "12389719287312" } }
14+
{"foo":{"$numberDecimal":"12389719287312"}}

tests/json-serialize-javascript.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: Javascript
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Javascript( "function foo(bar) { return bar; }", [ 'foo' => 42 ] )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : "function foo(bar) { return bar; }" }
14+
{"foo":"function foo(bar) { return bar; }"}

tests/json-serialize-maxkey.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: MaxKey
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\MaxKey()
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : { "$maxKey" : 1 } }
14+
{"foo":{"$maxKey":1}}

tests/json-serialize-minkey.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: MinKey
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\MinKey()
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : { "$minKey" : 1 } }
14+
{"foo":{"$minKey":1}}

tests/json-serialize-objectid.phpt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
JsonSerializable: ObjectID
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\ObjectID()
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECTF--
13+
{ "foo" : { "$oid" : "%s" } }
14+
{"foo":{"$oid":"%s"}}
15+

tests/json-serialize-regex-001.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: Regex
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Regex( "/foo/", "i" )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : { "$regex" : "/foo/", "$options" : "i" } }
14+
{"foo":{"$regex":"\/foo\/","$options":"i"}}

tests/json-serialize-regex-002.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: Regex without flags
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Regex( "/foo/" )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : { "$regex" : "/foo/", "$options" : "" } }
14+
{"foo":{"$regex":"\/foo\/","$options":""}}

tests/json-serialize-timestamp.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: Timestamp
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Timestamp( "1234", "5678" )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : { "$timestamp" : { "t" : 5678, "i" : 1234 } } }
14+
{"foo":{"$timestamp":{"t":5678,"i":1234}}}

tests/json-serialize-utcdatetime.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
JsonSerializable: UTCDateTime
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\UTCDateTime( new \DateTime( '2016-10-11 13:34:26' ) )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
echo json_encode( $doc ), "\n";
11+
?>
12+
--EXPECT--
13+
{ "foo" : { "$date" : 1476189266000 } }
14+
{"foo":{"$date":1476189266000}}

0 commit comments

Comments
 (0)