xref: /plugin/sqlite/Tools.php (revision 8da7d8059f7b9860b1f87a4aab15e87bf96c4064)
1*8da7d805SAndreas Gohr<?php
2*8da7d805SAndreas Gohr
3*8da7d805SAndreas Gohrnamespace dokuwiki\plugin\sqlite;
4*8da7d805SAndreas Gohr
5*8da7d805SAndreas Gohrclass Tools {
6*8da7d805SAndreas Gohr
7*8da7d805SAndreas Gohr    /**
8*8da7d805SAndreas Gohr     * Split sql queries on semicolons, unless when semicolons are quoted
9*8da7d805SAndreas Gohr     *
10*8da7d805SAndreas Gohr     * Usually you don't need this. It's only really needed if you need individual results for
11*8da7d805SAndreas Gohr     * multiple queries. For example in the admin interface.
12*8da7d805SAndreas Gohr     *
13*8da7d805SAndreas Gohr     * @param string $sql
14*8da7d805SAndreas Gohr     * @return string[] sql queries
15*8da7d805SAndreas Gohr     */
16*8da7d805SAndreas Gohr    public static function SQLstring2array($sql) {
17*8da7d805SAndreas Gohr        $statements = array();
18*8da7d805SAndreas Gohr        $len = strlen($sql);
19*8da7d805SAndreas Gohr
20*8da7d805SAndreas Gohr        // Simple state machine to "parse" sql into single statements
21*8da7d805SAndreas Gohr        $in_str = false;
22*8da7d805SAndreas Gohr        $in_com = false;
23*8da7d805SAndreas Gohr        $statement = '';
24*8da7d805SAndreas Gohr        for($i=0; $i<$len; $i++){
25*8da7d805SAndreas Gohr            $prev = $i ? $sql[$i-1] : "\n";
26*8da7d805SAndreas Gohr            $char = $sql[$i];
27*8da7d805SAndreas Gohr            $next = $i < ($len - 1) ? $sql[$i+1] : '';
28*8da7d805SAndreas Gohr
29*8da7d805SAndreas Gohr            // in comment? ignore everything until line end
30*8da7d805SAndreas Gohr            if($in_com){
31*8da7d805SAndreas Gohr                if($char == "\n"){
32*8da7d805SAndreas Gohr                    $in_com = false;
33*8da7d805SAndreas Gohr                }
34*8da7d805SAndreas Gohr                continue;
35*8da7d805SAndreas Gohr            }
36*8da7d805SAndreas Gohr
37*8da7d805SAndreas Gohr            // handle strings
38*8da7d805SAndreas Gohr            if($in_str){
39*8da7d805SAndreas Gohr                if($char == "'"){
40*8da7d805SAndreas Gohr                    if($next == "'"){
41*8da7d805SAndreas Gohr                        // current char is an escape for the next
42*8da7d805SAndreas Gohr                        $statement .= $char . $next;
43*8da7d805SAndreas Gohr                        $i++;
44*8da7d805SAndreas Gohr                        continue;
45*8da7d805SAndreas Gohr                    }else{
46*8da7d805SAndreas Gohr                        // end of string
47*8da7d805SAndreas Gohr                        $statement .= $char;
48*8da7d805SAndreas Gohr                        $in_str = false;
49*8da7d805SAndreas Gohr                        continue;
50*8da7d805SAndreas Gohr                    }
51*8da7d805SAndreas Gohr                }
52*8da7d805SAndreas Gohr                // still in string
53*8da7d805SAndreas Gohr                $statement .= $char;
54*8da7d805SAndreas Gohr                continue;
55*8da7d805SAndreas Gohr            }
56*8da7d805SAndreas Gohr
57*8da7d805SAndreas Gohr            // new comment?
58*8da7d805SAndreas Gohr            if($char == '-' && $next == '-' && $prev == "\n"){
59*8da7d805SAndreas Gohr                $in_com = true;
60*8da7d805SAndreas Gohr                continue;
61*8da7d805SAndreas Gohr            }
62*8da7d805SAndreas Gohr
63*8da7d805SAndreas Gohr            // new string?
64*8da7d805SAndreas Gohr            if($char == "'"){
65*8da7d805SAndreas Gohr                $in_str = true;
66*8da7d805SAndreas Gohr                $statement .= $char;
67*8da7d805SAndreas Gohr                continue;
68*8da7d805SAndreas Gohr            }
69*8da7d805SAndreas Gohr
70*8da7d805SAndreas Gohr            // the real delimiter
71*8da7d805SAndreas Gohr            if($char == ';'){
72*8da7d805SAndreas Gohr                $statements[] = trim($statement);
73*8da7d805SAndreas Gohr                $statement = '';
74*8da7d805SAndreas Gohr                continue;
75*8da7d805SAndreas Gohr            }
76*8da7d805SAndreas Gohr
77*8da7d805SAndreas Gohr            // some standard query stuff
78*8da7d805SAndreas Gohr            $statement .= $char;
79*8da7d805SAndreas Gohr        }
80*8da7d805SAndreas Gohr        if($statement) $statements[] = trim($statement);
81*8da7d805SAndreas Gohr
82*8da7d805SAndreas Gohr        return $statements;
83*8da7d805SAndreas Gohr    }
84*8da7d805SAndreas Gohr}
85