Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
37 / 37 |
|
100.00% |
28 / 28 |
CRAP | |
100.00% |
1 / 1 |
MydbOptions | |
100.00% |
37 / 37 |
|
100.00% |
28 / 28 |
36 | |
100.00% |
1 / 1 |
getNonInteractiveTimeout | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setNonInteractiveTimeout | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getServerSideSelectTimeout | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setServerSideSelectTimeout | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getConnectTimeout | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setConnectTimeout | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getErrorReporting | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setErrorReporting | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getReadTimeout | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setReadTimeout | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getNetworkBufferSize | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setNetworkBufferSize | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
3 | |||
getNetworkReadBuffer | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setNetworkReadBuffer | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
3 | |||
getClientErrorLevel | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setClientErrorLevel | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
3 | |||
getTimeZone | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setTimeZone | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
isAutocommit | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setAutocommit | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getCharset | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setCharset | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
isPersistent | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setPersistent | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
isReadonly | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setReadonly | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
getTransactionIsolationLevel | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
3 | |||
setTransactionIsolationLevel | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | /** |
3 | * This file is part of the sshilko/php-sql-mydb package. |
4 | * |
5 | * (c) Sergei Shilko <contact@sshilko.com> |
6 | * |
7 | * MIT License |
8 | * |
9 | * For the full copyright and license information, please view the LICENSE |
10 | * file that was distributed with this source code. |
11 | * @license https://opensource.org/licenses/mit-license.php MIT |
12 | */ |
13 | |
14 | declare(strict_types = 1); |
15 | |
16 | namespace sql; |
17 | |
18 | use sql\MydbException\OptionException; |
19 | use const E_ALL; |
20 | use const E_NOTICE; |
21 | use const E_WARNING; |
22 | |
23 | /** |
24 | * @author Sergei Shilko <contact@sshilko.com> |
25 | * @license https://opensource.org/licenses/mit-license.php MIT |
26 | * @see https://github.com/sshilko/php-sql-mydb |
27 | */ |
28 | class MydbOptions implements MydbOptionsInterface |
29 | { |
30 | protected const NET_CMD_BUFFER_SIZE_MIN = 4096; |
31 | |
32 | protected const NET_CMD_BUFFER_SIZE_MAX = 16384; |
33 | |
34 | protected const NET_READ_BUFFER_MIN = 8192; |
35 | |
36 | protected const NET_READ_BUFFER_MAX = 131072; |
37 | |
38 | /** |
39 | * The execution timeout ONLY APPLIES TO "SELECT" statements, seconds |
40 | * X > 0, enabled |
41 | * X = 0, not enabled. |
42 | * |
43 | * @see https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_execution_time |
44 | */ |
45 | protected int $serverSideSelectTimeout = 89; |
46 | |
47 | /** |
48 | * MySql client connection timeout, seconds |
49 | */ |
50 | protected int $connectTimeout = 5; |
51 | |
52 | protected int $errorReporting = E_ALL & ~E_WARNING & ~E_NOTICE; |
53 | |
54 | /** |
55 | * The timeout in seconds for each attempt to read from the server. |
56 | * @see https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html |
57 | * @see https://github.com/php/php-src/blob/12ab4cbd00e0dae52a5db98dda6da885acb408f6/ |
58 | * ext/mysqli/mysqli.c#L654 |
59 | * @see https://github.com/php/php-src/blob/a03c1ed7aa2325d91595dcf9371297ab45543517/ |
60 | * ext/mysqli/tests/mysqli_constants.phpt#L24 |
61 | */ |
62 | protected int $readTimeout = 90; |
63 | |
64 | /** |
65 | * Internal network buffer of mysqlnd.net_cmd_buffer_size bytes for every connection |
66 | * |
67 | * Scope: connection. |
68 | * |
69 | * Number of network command buffer extensions while sending commands from PHP to MySQL. |
70 | * |
71 | * mysqlnd allocates an internal command/network buffer of mysqlnd.net_cmd_buffer_size (php.ini) bytes |
72 | * for every connection. |
73 | * If a MySQL Client Server protocol command, for example, COM_QUERY ("normal" query), |
74 | * does not fit into the buffer, mysqlnd will grow the buffer to what is needed for sending the command. |
75 | * Whenever the buffer gets extended for one connection command_buffer_too_small will be incremented by one. |
76 | * |
77 | * If mysqlnd has to grow the buffer beyond its initial size of mysqlnd.net_cmd_buffer_size (php.ini) bytes |
78 | * for almost every connection, you should consider to increase the default size to avoid re-allocations. |
79 | * |
80 | * The default can set either through the php.ini setting mysqlnd.net_cmd_buffer_size |
81 | * or using mysqli_options(MYSQLI_OPT_NET_CMD_BUFFER_SIZE, int size). |
82 | * |
83 | * It is recommended to set the buffer size to no less than 4096 bytes because mysqlnd also uses |
84 | * it when reading certain communication packet from MySQL. |
85 | * |
86 | * As of PHP 5.3.2 mysqlnd does not allow setting buffers smaller than 4096 bytes. |
87 | * |
88 | * Default 4096 |
89 | * |
90 | * More memory usage, in exchange for better performance |
91 | * @see mysqlnd.net_cmd_buffer_size |
92 | * @see http://php.net/manual/en/mysqlnd.config.php |
93 | */ |
94 | protected int $networkBufferSize = 6144; |
95 | |
96 | /** |
97 | * More memory for better performance |
98 | * |
99 | * Maximum read chunk size in bytes when reading the body of a MySQL command packet |
100 | * The MySQL client server protocol encapsulates all its commands in packets. |
101 | * The packets consist of a small header and a body with the actual payload |
102 | * |
103 | * If a packet body is larger than mysqlnd.net_read_buffer_size bytes, |
104 | * mysqlnd has to call read() multiple times |
105 | * |
106 | * This buffer controls how many bytes mysqlnd fetches from the PHP streams with one call. |
107 | * If a result set has less than 32kB in size, mysqlnd will call the PHP streams network |
108 | * functions only once, if it is larger more calls are needed |
109 | * |
110 | * Default 32768 |
111 | * |
112 | * @see mysqlnd.net_read_buffer_size |
113 | * @see http://php.net/manual/en/mysqlnd.config.php |
114 | * @see http://blog.ulf-wendel.de/2007/php-mysqlnd-saves-40-memory-finally-new-tuning-options/ |
115 | */ |
116 | protected int $networkReadBuffer = 49152; |
117 | |
118 | /** |
119 | * Sets mysqli error reporting mode |
120 | * |
121 | * >=8.1.0 The default value is now MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT. |
122 | * < 8.1.0 MYSQLI_REPORT_OFF. |
123 | * |
124 | * MYSQLI_REPORT_OFF Turns reporting off |
125 | * MYSQLI_REPORT_ERROR Report errors from mysqli function calls |
126 | * MYSQLI_REPORT_STRICT Throw mysqli_sql_exception for errors instead of warnings |
127 | * MYSQLI_REPORT_INDEX Report if no index or bad index was used in a query |
128 | * MYSQLI_REPORT_ALL Set all options (report all) |
129 | * |
130 | * @see https://www.php.net/manual/en/function.mysqli-report.php |
131 | */ |
132 | protected int $clientErrorLevel = MydbMysqli::MYSQLI_REPORT_ALL ^ |
133 | MydbMysqli::MYSQLI_REPORT_STRICT ^ |
134 | MydbMysqli::MYSQLI_REPORT_INDEX; |
135 | |
136 | /** |
137 | * Transaction isolation is one of the foundations of database processing. |
138 | * Isolation is the I in the acronym ACID; the isolation level is the setting that fine-tunes |
139 | * the balance between performance and reliability, consistency, and reproducibility of results |
140 | * when multiple transactions are making changes and performing queries at the same time. |
141 | * |
142 | * @see https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html |
143 | */ |
144 | protected ?string $transactionIsolationLevel = null; |
145 | |
146 | /** |
147 | * Set session time zone |
148 | * |
149 | * SET time_zone = timezone; |
150 | * |
151 | * - As the value 'SYSTEM', indicating that the server time zone is the same as the system time zone. |
152 | * - As a string, an offset from UTC of the form [H]H:MM, prefixed with a + or -, such as '+10:00', '-6:00' |
153 | * Prior to MySQL 8.0.19, this value had to be in the range '-12:59' to '+13:00' |
154 | * - As a named time zone, such as 'Europe/Helsinki', 'US/Eastern', 'MET', or 'UTC'. |
155 | * |
156 | * @see https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html |
157 | */ |
158 | protected string $timeZone = 'UTC'; |
159 | |
160 | /** |
161 | * The number of seconds the server waits for activity |
162 | * on a non-interactive TCP/IP or UNIX File connection before closing it |
163 | */ |
164 | protected int $nonInteractiveTimeout = 7200; |
165 | |
166 | /** |
167 | * Recommended defaults: |
168 | * false for rw connection |
169 | * true for ro connection |
170 | * true for async connection |
171 | */ |
172 | protected bool $autocommit = false; |
173 | |
174 | protected string $charset = 'utf8mb4'; |
175 | |
176 | /** |
177 | * Transaction block will also carry over to the next script |
178 | * which uses that connection if script execution ends before the transaction block does |
179 | * |
180 | * @see http://php.net/manual/en/features.persistent-connections.php |
181 | */ |
182 | protected bool $persistent = false; |
183 | |
184 | /** |
185 | * Readonly connection |
186 | */ |
187 | protected bool $readonly = false; |
188 | |
189 | public function getNonInteractiveTimeout(): int |
190 | { |
191 | return $this->nonInteractiveTimeout; |
192 | } |
193 | |
194 | public function setNonInteractiveTimeout(int $nonInteractiveTimeout): void |
195 | { |
196 | $this->nonInteractiveTimeout = $nonInteractiveTimeout; |
197 | } |
198 | |
199 | public function getServerSideSelectTimeout(): int |
200 | { |
201 | return $this->serverSideSelectTimeout; |
202 | } |
203 | |
204 | public function setServerSideSelectTimeout(int $seconds): void |
205 | { |
206 | $this->serverSideSelectTimeout = $seconds; |
207 | } |
208 | |
209 | public function getConnectTimeout(): int |
210 | { |
211 | return $this->connectTimeout; |
212 | } |
213 | |
214 | public function setConnectTimeout(int $seconds): void |
215 | { |
216 | $this->connectTimeout = $seconds; |
217 | } |
218 | |
219 | public function getErrorReporting(): int |
220 | { |
221 | return $this->errorReporting; |
222 | } |
223 | |
224 | public function setErrorReporting(int $errorReporting): void |
225 | { |
226 | $this->errorReporting = $errorReporting; |
227 | } |
228 | |
229 | public function getReadTimeout(): int |
230 | { |
231 | return $this->readTimeout; |
232 | } |
233 | |
234 | public function setReadTimeout(int $seconds): void |
235 | { |
236 | $this->readTimeout = $seconds; |
237 | } |
238 | |
239 | public function getNetworkBufferSize(): int |
240 | { |
241 | return $this->networkBufferSize; |
242 | } |
243 | |
244 | /** |
245 | * @param int $bytes bytes |
246 | * @throws \sql\MydbException\OptionException |
247 | */ |
248 | public function setNetworkBufferSize(int $bytes): void |
249 | { |
250 | if ($bytes < self::NET_CMD_BUFFER_SIZE_MIN || $bytes > self::NET_CMD_BUFFER_SIZE_MAX) { |
251 | throw new OptionException(); |
252 | } |
253 | $this->networkBufferSize = $bytes; |
254 | } |
255 | |
256 | public function getNetworkReadBuffer(): int |
257 | { |
258 | return $this->networkReadBuffer; |
259 | } |
260 | |
261 | /** |
262 | * @throws \sql\MydbException\OptionException |
263 | */ |
264 | public function setNetworkReadBuffer(int $bytes): void |
265 | { |
266 | if ($bytes < self::NET_READ_BUFFER_MIN || $bytes > self::NET_READ_BUFFER_MAX) { |
267 | throw new OptionException(); |
268 | } |
269 | $this->networkReadBuffer = $bytes; |
270 | } |
271 | |
272 | public function getClientErrorLevel(): int |
273 | { |
274 | return $this->clientErrorLevel; |
275 | } |
276 | |
277 | /** |
278 | * @throws \sql\MydbException\OptionException |
279 | */ |
280 | public function setClientErrorLevel(int $mysqliReport): void |
281 | { |
282 | if ($mysqliReport > 255 || $mysqliReport < 0) { |
283 | throw new OptionException(); |
284 | } |
285 | $this->clientErrorLevel = $mysqliReport; |
286 | } |
287 | |
288 | public function getTimeZone(): string |
289 | { |
290 | return $this->timeZone; |
291 | } |
292 | |
293 | public function setTimeZone(string $timeZone): void |
294 | { |
295 | $this->timeZone = $timeZone; |
296 | } |
297 | |
298 | public function isAutocommit(): bool |
299 | { |
300 | return $this->autocommit; |
301 | } |
302 | |
303 | public function setAutocommit(bool $autocommit): void |
304 | { |
305 | $this->autocommit = $autocommit; |
306 | } |
307 | |
308 | public function getCharset(): string |
309 | { |
310 | return $this->charset; |
311 | } |
312 | |
313 | public function setCharset(string $charset): void |
314 | { |
315 | $this->charset = $charset; |
316 | } |
317 | |
318 | public function isPersistent(): bool |
319 | { |
320 | return $this->persistent; |
321 | } |
322 | |
323 | public function setPersistent(bool $persistent): void |
324 | { |
325 | $this->persistent = $persistent; |
326 | } |
327 | |
328 | public function isReadonly(): bool |
329 | { |
330 | return $this->readonly; |
331 | } |
332 | |
333 | public function setReadonly(bool $readonly): void |
334 | { |
335 | $this->readonly = $readonly; |
336 | } |
337 | |
338 | public function getTransactionIsolationLevel(): ?string |
339 | { |
340 | $userLevel = $this->transactionIsolationLevel; |
341 | if (null === $userLevel && $this->isReadonly()) { |
342 | /** |
343 | * Optimal defaults for readonly connection |
344 | */ |
345 | return self::TRANSACTION_ISOLATION_LEVEL_READ_COMMITTED; |
346 | } |
347 | |
348 | return $userLevel; |
349 | } |
350 | |
351 | public function setTransactionIsolationLevel(string $isolationLevel): void |
352 | { |
353 | $this->transactionIsolationLevel = $isolationLevel; |
354 | } |
355 | } |