Passed
Push — master ( e44b52...03dc43 )
by Sergei
05:09 queued 02:01
created

DbStringHelper::isReadQuery()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Db\Helper;
6
7
use function addslashes;
8
use function is_float;
9
use function mb_strrpos;
10
use function mb_strtolower;
11
use function mb_substr;
12
use function preg_match;
13
use function preg_replace;
14
use function rtrim;
15
use function str_replace;
16
use function trim;
17
18
/**
19
 * String manipulation methods.
20
 */
21
final class DbStringHelper
22
{
23
    /**
24
     * Returns the trailing name part of a path.
25
     *
26
     * This method is similar to the php function `basename()` except that it will treat both \ and / as directory
27
     * separators, independent of the operating system.
28
     *
29
     * This method was mainly created to work on php namespaces. When working with real file paths, PHP's `basename()`
30
     * should work fine for you.
31
     *
32
     * Note: this method isn't aware of the actual filesystem, or path components such as "..".
33
     *
34
     * @param string $path A path string.
35
     *
36
     * @return string The trailing name part of the given path.
37
     *
38
     * @link https://www.php.net/manual/en/function.basename.php
39
     */
40
    public static function baseName(string $path): string
41
    {
42
        $path = rtrim(str_replace('\\', '/', $path), '/');
43
        $position = mb_strrpos($path, '/');
44
45
        if ($position !== false) {
46
            return mb_substr($path, $position + 1);
47
        }
48
49
        return $path;
50
    }
51
52
    /**
53
     * Returns a value indicating whether an SQL statement is for read purpose.
54
     *
55
     * @param string $sql The SQL statement.
56
     *
57
     * @return bool Whether an SQL statement is for read purpose.
58
     */
59
    public static function isReadQuery(string $sql): bool
60
    {
61
        $pattern = '/^\s*(SELECT|SHOW|DESCRIBE)\b/i';
62
63
        return preg_match($pattern, $sql) === 1;
64
    }
65
66
    /**
67
     * Returns string representation of a number value without a thousand separators and with dot as decimal separator.
68
     *
69
     * @param float|string $value The number value to be normalized.
70
     */
71
    public static function normalizeFloat(float|string $value): string
72
    {
73
        if (is_float($value)) {
74
            $value = (string) $value;
75
        }
76
77
        $value = str_replace([' ', ','], ['', '.'], $value);
78
        return preg_replace('/\.(?=.*\.)/', '', $value);
79
    }
80
81
    /**
82
     * Converts a PascalCase name into an ID in lowercase.
83
     *
84
     * Words in the ID may be concatenated using '_'. For example, 'PostTag' will be converted to 'post_tag'.
85
     *
86
     * @param string $input The string to be converted.
87
     *
88
     * @return string The resulting ID.
89
     */
90
    public static function pascalCaseToId(string $input): string
91
    {
92
        $separator = '_';
93
        $result = preg_replace('/(?<=\p{L})(?<!\p{Lu})(\p{Lu})/u', addslashes($separator) . '\1', $input);
94
        return mb_strtolower(trim($result, $separator));
95
    }
96
}
97