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 */
15namespace Cake\Database\Type;
16
17use Cake\Database\Driver;
18use Cake\Database\Type;
19use Cake\Database\TypeInterface;
20use Cake\Database\Type\BatchCastingInterface;
21use InvalidArgumentException;
22use PDO;
23
24/**
25 * Integer type converter.
26 *
27 * Use to convert integer data between PHP and the database types.
28 */
29class IntegerType extends Type implements TypeInterface, BatchCastingInterface
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     * Checks if the value is not a numeric value
56     *
57     * @throws \InvalidArgumentException
58     * @param mixed $value Value to check
59     * @return void
60     */
61    protected function checkNumeric($value)
62    {
63        if (!is_numeric($value)) {
64            throw new InvalidArgumentException(sprintf(
65                'Cannot convert value of type `%s` to integer',
66                getTypeName($value)
67            ));
68        }
69    }
70
71    /**
72     * Convert integer data into the database format.
73     *
74     * @param mixed $value The value to convert.
75     * @param \Cake\Database\Driver $driver The driver instance to convert with.
76     * @return int|null
77     */
78    public function toDatabase($value, Driver $driver)
79    {
80        if ($value === null || $value === '') {
81            return null;
82        }
83
84        $this->checkNumeric($value);
85
86        return (int)$value;
87    }
88
89    /**
90     * Convert integer values to PHP integers
91     *
92     * @param mixed $value The value to convert.
93     * @param \Cake\Database\Driver $driver The driver instance to convert with.
94     * @return int|null
95     */
96    public function toPHP($value, Driver $driver)
97    {
98        if ($value === null) {
99            return $value;
100        }
101
102        return (int)$value;
103    }
104
105    /**
106     * {@inheritDoc}
107     *
108     * @return int[]
109     */
110    public function manyToPHP(array $values, array $fields, Driver $driver)
111    {
112        foreach ($fields as $field) {
113            if (!isset($values[$field])) {
114                continue;
115            }
116
117            $this->checkNumeric($values[$field]);
118
119            $values[$field] = (int)$values[$field];
120        }
121
122        return $values;
123    }
124
125    /**
126     * Get the correct PDO binding type for integer data.
127     *
128     * @param mixed $value The value being bound.
129     * @param \Cake\Database\Driver $driver The driver.
130     * @return int
131     */
132    public function toStatement($value, Driver $driver)
133    {
134        return PDO::PARAM_INT;
135    }
136
137    /**
138     * Marshals request data into PHP floats.
139     *
140     * @param mixed $value The value to convert.
141     * @return int|null Converted value.
142     */
143    public function marshal($value)
144    {
145        if ($value === null || $value === '') {
146            return null;
147        }
148        if (is_numeric($value)) {
149            return (int)$value;
150        }
151
152        return null;
153    }
154}
155