1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.0.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Database\Type;
16:
17: use Cake\Core\Exception\Exception;
18: use Cake\Database\Driver;
19: use Cake\Database\Driver\Sqlserver;
20: use Cake\Database\Type;
21: use Cake\Database\TypeInterface;
22: use PDO;
23:
24: /**
25: * Binary type converter.
26: *
27: * Use to convert binary data between PHP and the database types.
28: */
29: class BinaryType extends Type implements TypeInterface
30: {
31: /**
32: * Identifier name for this type.
33: *
34: * (This property is declared here again so that the inheritance from
35: * Cake\Database\Type can be removed in the future.)
36: *
37: * @var string|null
38: */
39: protected $_name;
40:
41: /**
42: * Constructor.
43: *
44: * (This method is declared here again so that the inheritance from
45: * Cake\Database\Type can be removed in the future.)
46: *
47: * @param string|null $name The name identifying this type
48: */
49: public function __construct($name = null)
50: {
51: $this->_name = $name;
52: }
53:
54: /**
55: * Convert binary data into the database format.
56: *
57: * Binary data is not altered before being inserted into the database.
58: * As PDO will handle reading file handles.
59: *
60: * @param string|resource $value The value to convert.
61: * @param \Cake\Database\Driver $driver The driver instance to convert with.
62: * @return string|resource
63: */
64: public function toDatabase($value, Driver $driver)
65: {
66: return $value;
67: }
68:
69: /**
70: * Convert binary into resource handles
71: *
72: * @param null|string|resource $value The value to convert.
73: * @param \Cake\Database\Driver $driver The driver instance to convert with.
74: * @return resource|null
75: * @throws \Cake\Core\Exception\Exception
76: */
77: public function toPHP($value, Driver $driver)
78: {
79: if ($value === null) {
80: return null;
81: }
82: if (is_string($value)
83: && $driver instanceof Sqlserver
84: && version_compare(PHP_VERSION, '7.0', '<')
85: ) {
86: $value = pack('H*', $value);
87: }
88: if (is_string($value)) {
89: return fopen('data:text/plain;base64,' . base64_encode($value), 'rb');
90: }
91: if (is_resource($value)) {
92: return $value;
93: }
94: throw new Exception(sprintf('Unable to convert %s into binary.', gettype($value)));
95: }
96:
97: /**
98: * Get the correct PDO binding type for Binary data.
99: *
100: * @param mixed $value The value being bound.
101: * @param \Cake\Database\Driver $driver The driver.
102: * @return int
103: */
104: public function toStatement($value, Driver $driver)
105: {
106: return PDO::PARAM_LOB;
107: }
108:
109: /**
110: * Marshalls flat data into PHP objects.
111: *
112: * Most useful for converting request data into PHP objects
113: * that make sense for the rest of the ORM/Database layers.
114: *
115: * @param mixed $value The value to convert.
116: *
117: * @return mixed Converted value.
118: */
119: public function marshal($value)
120: {
121: return $value;
122: }
123: }
124: