Merge "Type hint against LinkTarget in WatchedItemStore"
[lhc/web/wiklou.git] / includes / libs / objectcache / serialized / SerializedValueContainer.php
1 <?php
2
3 /**
4 * Helper class for segmenting large cache values without relying on serializing classes
5 *
6 * @since 1.34
7 */
8 class SerializedValueContainer {
9 const SCHEMA = '__svc_schema__';
10 const SCHEMA_UNIFIED = 'DAAIDgoKAQw'; // 64 bit UID
11 const SCHEMA_SEGMENTED = 'CAYCDAgCDw4'; // 64 bit UID
12
13 const UNIFIED_DATA = '__data__';
14 const SEGMENTED_HASHES = '__hashes__';
15
16 /**
17 * @param string $serialized
18 * @return stdClass
19 */
20 public static function newUnified( $serialized ) {
21 return (object)[
22 self::SCHEMA => self::SCHEMA_UNIFIED,
23 self::UNIFIED_DATA => $serialized
24 ];
25 }
26
27 /**
28 * @param string[] $segmentHashList Ordered list of hashes for each segment
29 * @return stdClass
30 */
31 public static function newSegmented( array $segmentHashList ) {
32 return (object)[
33 self::SCHEMA => self::SCHEMA_SEGMENTED,
34 self::SEGMENTED_HASHES => $segmentHashList
35 ];
36 }
37
38 /**
39 * @param mixed $value
40 * @return bool
41 */
42 public static function isUnified( $value ) {
43 return self::instanceOf( $value, self::SCHEMA_UNIFIED );
44 }
45
46 /**
47 * @param mixed $value
48 * @return bool
49 */
50 public static function isSegmented( $value ) {
51 return self::instanceOf( $value, self::SCHEMA_SEGMENTED );
52 }
53
54 /**
55 * @param mixed $value
56 * @param string $schema SCHEMA_* class constant
57 * @return bool
58 */
59 private static function instanceOf( $value, $schema ) {
60 return (
61 $value instanceof stdClass &&
62 property_exists( $value, self::SCHEMA ) &&
63 $value->{self::SCHEMA} === $schema
64 );
65 }
66 }