Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
76 / 76
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
Field
100.00% covered (success)
100.00%
76 / 76
100.00% covered (success)
100.00%
4 / 4
23
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 __get
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 setTypeName
100.00% covered (success)
100.00%
30 / 30
100.00% covered (success)
100.00%
1 / 1
1
 setFlags
100.00% covered (success)
100.00%
34 / 34
100.00% covered (success)
100.00%
1 / 1
18
1<?php declare(strict_types=1);
2/*
3 * This file is part of Aplus Framework Database Library.
4 *
5 * (c) Natan Felles <natanfelles@gmail.com>
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10namespace Framework\Database\Result;
11
12use Error;
13
14/**
15 * Class Field.
16 *
17 * @property-read string $name The name of the column
18 * @property-read string $orgname Original column name if an alias was specified
19 * @property-read string $table The name of the table this field belongs to (if not calculated)
20 * @property-read string $orgtable Original table name if an alias was specified
21 * @property-read string $def The default value for this field, represented as a string
22 * @property-read string $db
23 * @property-read string $catalog
24 * @property-read int $maxLength The maximum width of the field for the result set
25 * @property-read int $length The width of the field, as specified in the table definition
26 * @property-read int $charsetnr The character set number for the field
27 * @property-read int $flags An integer representing the bit-flags for the field
28 * @property-read int $type The data type used for this field
29 * @property-read int $decimals The number of decimals used (for integer fields)
30 * @property-read string|null $typeName The data type name
31 * @property-read bool $flagBinary Tell if it has the MYSQLI_BINARY_FLAG bit-flag
32 * @property-read bool $flagBlob Tell if it has the MYSQLI_BLOB_FLAG bit-flag
33 * @property-read bool $flagEnum Tell if it has the MYSQLI_ENUM_FLAG bit-flag
34 * @property-read bool $flagGroup Tell if it has the MYSQLI_GROUP_FLAG bit-flag
35 * @property-read bool $flagNum Tell if it has the MYSQLI_NUM_FLAG bit-flag
36 * @property-read bool $flagSet Tell if it has the MYSQLI_SET_FLAG bit-flag
37 * @property-read bool $flagTimestamp Tell if it has the MYSQLI_TIMESTAMP_FLAG bit-flag
38 * @property-read bool $flagUnsigned Tell if it has the MYSQLI_UNSIGNED_FLAG bit-flag
39 * @property-read bool $flagZerofill Tell if it has the MYSQLI_ZEROFILL_FLAG bit-flag
40 * @property-read bool $flagAutoIncrement Tell if it has the MYSQLI_AUTO_INCREMENT_FLAG bit-flag
41 * @property-read bool $flagMultipleKey Tell if it has the MYSQLI_MULTIPLE_KEY_FLAG bit-flag
42 * @property-read bool $flagNotNull Tell if it has the MYSQLI_NOT_NULL_FLAG bit-flag
43 * @property-read bool $flagPartKey Tell if it has the MYSQLI_PART_KEY_FLAG bit-flag
44 * @property-read bool $flagPriKey Tell if it has the MYSQLI_PRI_KEY_FLAG bit-flag
45 * @property-read bool $flagUniqueKey Tell if it has the MYSQLI_UNIQUE_KEY_FLAG bit-flag
46 * @property-read bool $flagNoDefaultValue Tell if it has the MYSQLI_NO_DEFAULT_VALUE_FLAG bit-flag
47 * @property-read bool $flagOnUpdateNow Tell if it has the MYSQLI_ON_UPDATE_NOW_FLAG bit-flag
48 *
49 * @package database
50 */
51class Field
52{
53    protected string $name;
54    protected string $orgname;
55    protected string $table;
56    protected string $orgtable;
57    protected string $def;
58    protected string $db;
59    protected string $catalog;
60    protected int $maxLength;
61    protected int $length;
62    protected int $charsetnr;
63    protected int $flags;
64    protected int $type;
65    protected int $decimals;
66    protected ?string $typeName;
67    protected bool $flagBinary = false;
68    protected bool $flagBlob = false;
69    protected bool $flagEnum = false;
70    protected bool $flagGroup = false;
71    protected bool $flagNum = false;
72    protected bool $flagSet = false;
73    protected bool $flagTimestamp = false;
74    protected bool $flagUnsigned = false;
75    protected bool $flagZerofill = false;
76    protected bool $flagAutoIncrement = false;
77    protected bool $flagMultipleKey = false;
78    protected bool $flagNotNull = false;
79    protected bool $flagPartKey = false;
80    protected bool $flagPriKey = false;
81    protected bool $flagUniqueKey = false;
82    protected bool $flagNoDefaultValue = false;
83    protected bool $flagOnUpdateNow = false;
84
85    public function __construct(\stdClass $field)
86    {
87        foreach ((array) $field as $key => $value) {
88            $key = \ucwords($key, '_');
89            $key = \strtr($key, ['_' => '']);
90            $key[0] = \strtolower($key[0]);
91            $this->{$key} = $value;
92        }
93        $this->setTypeName();
94        $this->setFlags();
95    }
96
97    public function __get(string $name) : mixed
98    {
99        if (\property_exists($this, $name)) {
100            return $this->{$name};
101        }
102        throw new Error(
103            'Undefined property: ' . static::class . '::$' . $name
104        );
105    }
106
107    protected function setTypeName() : void
108    {
109        $this->typeName = match ($this->type) {
110            \MYSQLI_TYPE_BIT => 'bit',
111            \MYSQLI_TYPE_BLOB => 'blob',
112            \MYSQLI_TYPE_CHAR => 'char',
113            \MYSQLI_TYPE_DATE => 'date',
114            \MYSQLI_TYPE_DATETIME => 'datetime',
115            \MYSQLI_TYPE_DECIMAL => 'decimal',
116            \MYSQLI_TYPE_DOUBLE => 'double',
117            \MYSQLI_TYPE_ENUM => 'enum',
118            \MYSQLI_TYPE_FLOAT => 'float',
119            \MYSQLI_TYPE_GEOMETRY => 'geometry',
120            \MYSQLI_TYPE_INT24 => 'int24',
121            //\MYSQLI_TYPE_INTERVAL => 'interval',
122            \MYSQLI_TYPE_JSON => 'json',
123            \MYSQLI_TYPE_LONG => 'long',
124            \MYSQLI_TYPE_LONG_BLOB => 'long_blob',
125            \MYSQLI_TYPE_LONGLONG => 'longlong',
126            \MYSQLI_TYPE_MEDIUM_BLOB => 'medium_blob',
127            \MYSQLI_TYPE_NEWDATE => 'newdate',
128            \MYSQLI_TYPE_NEWDECIMAL => 'newdecimal',
129            \MYSQLI_TYPE_NULL => 'null',
130            \MYSQLI_TYPE_SET => 'set',
131            \MYSQLI_TYPE_SHORT => 'short',
132            \MYSQLI_TYPE_STRING => 'string',
133            \MYSQLI_TYPE_TIME => 'time',
134            \MYSQLI_TYPE_TIMESTAMP => 'timestamp',
135            //\MYSQLI_TYPE_TINY => 'tiny',
136            \MYSQLI_TYPE_TINY_BLOB => 'tiny_blob',
137            \MYSQLI_TYPE_VAR_STRING => 'var_string',
138            \MYSQLI_TYPE_YEAR => 'year',
139            default => null
140        };
141    }
142
143    protected function setFlags() : void
144    {
145        if ($this->flags & \MYSQLI_BINARY_FLAG) {
146            $this->flagBinary = true;
147        }
148        if ($this->flags & \MYSQLI_BLOB_FLAG) {
149            $this->flagBlob = true;
150        }
151        if ($this->flags & \MYSQLI_ENUM_FLAG) {
152            $this->flagEnum = true;
153        }
154        if ($this->flags & \MYSQLI_GROUP_FLAG) {
155            $this->flagGroup = true;
156        }
157        if ($this->flags & \MYSQLI_NUM_FLAG) {
158            $this->flagNum = true;
159        }
160        if ($this->flags & \MYSQLI_SET_FLAG) {
161            $this->flagSet = true;
162        }
163        if ($this->flags & \MYSQLI_TIMESTAMP_FLAG) {
164            $this->flagTimestamp = true;
165        }
166        if ($this->flags & \MYSQLI_UNSIGNED_FLAG) {
167            $this->flagUnsigned = true;
168        }
169        if ($this->flags & \MYSQLI_ZEROFILL_FLAG) {
170            $this->flagZerofill = true;
171        }
172        if ($this->flags & \MYSQLI_AUTO_INCREMENT_FLAG) {
173            $this->flagAutoIncrement = true;
174        }
175        if ($this->flags & \MYSQLI_MULTIPLE_KEY_FLAG) {
176            $this->flagMultipleKey = true;
177        }
178        if ($this->flags & \MYSQLI_NOT_NULL_FLAG) {
179            $this->flagNotNull = true;
180        }
181        if ($this->flags & \MYSQLI_PART_KEY_FLAG) {
182            $this->flagPartKey = true;
183        }
184        if ($this->flags & \MYSQLI_PRI_KEY_FLAG) {
185            $this->flagPriKey = true;
186        }
187        if ($this->flags & \MYSQLI_UNIQUE_KEY_FLAG) {
188            $this->flagUniqueKey = true;
189        }
190        if ($this->flags & \MYSQLI_NO_DEFAULT_VALUE_FLAG) {
191            $this->flagNoDefaultValue = true;
192        }
193        if ($this->flags & \MYSQLI_ON_UPDATE_NOW_FLAG) {
194            $this->flagOnUpdateNow = true;
195        }
196    }
197}