Passed
Branch master (8a55cf)
by Igor
12:47 queued 09:06
created

Bindings::process()   B

Complexity

Conditions 9
Paths 65

Size

Total Lines 45

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 9

Importance

Changes 0
Metric Value
dl 0
loc 45
ccs 22
cts 22
cp 1
rs 7.6444
c 0
b 0
f 0
cc 9
nc 65
nop 1
crap 9
1
<?php
2
3
namespace ClickHouseDB\Query\Degeneration;
4
5
use DateTimeInterface;
6
7
class Bindings implements \ClickHouseDB\Query\Degeneration
8
{
9
    /**
10
     * @var array
11
     */
12
    protected $bindings = [];
13
    /**
14
     * @param array $bindings
15
     */
16 41
    public function bindParams(array $bindings)
17
    {
18 41
        $this->bindings = [];
19 41
        foreach ($bindings as $column => $value) {
20 12
            $this->bindParam($column, $value);
21
        }
22 41
    }
23
24
    /**
25
     * @param string $column
26
     * @param mixed $value
27
     */
28 12
    public function bindParam($column, $value)
29
    {
30 12
        if ($value instanceof DateTimeInterface) {
31
            $value = $value->format('Y-m-d H:i:s');
32
        }
33
34 12
        $this->bindings[$column] = $value;
35 12
    }
36
37
    /**
38
     * Escape an string
39
     * Can overwrite use CodeIgniter->escape_str()  https://github.com/bcit-ci/CodeIgniter/blob/develop/system/database/DB_driver.php#L920
40
     *
41
     * @param string $value
42
     * @return string
43
     */
44 9
    private function escapeString($value)
45
    {
46
//        $non_displayables = array(
47
//            '/%0[0-8bcef]/',            // url encoded 00-08, 11, 12, 14, 15
48
//            '/%1[0-9a-f]/',             // url encoded 16-31
49
//            '/[\x00-\x08]/',            // 00-08
50
//            '/\x0b/',                   // 11
51
//            '/\x0c/',                   // 12
52
//            '/[\x0e-\x1f]/'             // 14-31
53
//        );
54
//        foreach ( $non_displayables as $regex ) $data = preg_replace( $regex, '', $data );
55 9
        return addslashes($value);
56
    }
57
58
    /**
59
     * Escape an array
60
     *
61
     * @param array $values
62
     * @return array
63
     */
64 3
    private function escapeArray($values)
65
    {
66 3
        $escapedValues = [];
67 3
        foreach ($values as $value) {
68 3
            if (is_numeric($value)) {
69 2
                $escapedValues[] = $value;
70 2
            } elseif (is_string($value)) {
71 2
                $escapedValues[] = $this->escapeString($value);
72
            } elseif (is_array($value)) {
73 3
                $escapedValues[] = $this->escapeArray($value);
74
            }
75
        }
76
        
77 3
        return $escapedValues;
78
    }
79
80
81
    /**
82
     * Compile Bindings
83
     *
84
     * @param string $sql
85
     * @return mixed
86
     */
87 41
    public function process($sql)
88
    {
89
        // Can try use
90
        // CodeIgniter->bind()
91
        // https://github.com/bcit-ci/CodeIgniter/blob/develop/system/database/DB_driver.php#L920
92
93 41
        arsort($this->bindings);
94
95
96 41
        foreach ($this->bindings as $key => $value) {
97
98
99 12
            $valueSet = null;
100 12
            $valueSetText = null;
101
102 12
            if (null === $value || $value === false) {
103 1
                $valueSetText = "";
104
            }
105
106 12
            if (is_array($value)) {
107 3
                $escapedValue = $this->escapeArray($value);
108 3
                $valueSetText = "'" . implode("','", $escapedValue) . "'";
109 3
                $valueSet = implode(", ", $escapedValue);
110
            }
111
112 12
            if (is_numeric($value)) {
113 8
                $valueSetText = $value;
114 8
                $valueSet = $value;
115
            }
116
117 12
            if (is_string($value)) {
118 8
                $valueSet = $value;
119 8
                $valueSetText = "'" . $this->escapeString($value) . "'";
120
            }
121
122 12
            if ($valueSetText !== null) {
123 12
                $sql = str_ireplace(':' . $key, $valueSetText, $sql);
124
            }
125
126 12
            if ($valueSet !== null) {
127 12
                $sql = str_ireplace('{' . $key . '}', $valueSet, $sql);
128
            }
129
        }
130
131 41
        return ($sql);
132
    }
133
134
}
135