xref: /plugin/sqlite/Tools.php (revision a4f751202b60e163421ac65f9ef5a07695c225d4)
18da7d805SAndreas Gohr<?php
28da7d805SAndreas Gohr
38da7d805SAndreas Gohrnamespace dokuwiki\plugin\sqlite;
48da7d805SAndreas Gohr
58da7d805SAndreas Gohrclass Tools {
68da7d805SAndreas Gohr
78da7d805SAndreas Gohr    /**
88da7d805SAndreas Gohr     * Split sql queries on semicolons, unless when semicolons are quoted
98da7d805SAndreas Gohr     *
108da7d805SAndreas Gohr     * Usually you don't need this. It's only really needed if you need individual results for
118da7d805SAndreas Gohr     * multiple queries. For example in the admin interface.
128da7d805SAndreas Gohr     *
138da7d805SAndreas Gohr     * @param string $sql
148da7d805SAndreas Gohr     * @return string[] sql queries
158da7d805SAndreas Gohr     */
168da7d805SAndreas Gohr    public static function SQLstring2array($sql) {
178da7d805SAndreas Gohr        $statements = array();
188da7d805SAndreas Gohr        $len = strlen($sql);
198da7d805SAndreas Gohr
208da7d805SAndreas Gohr        // Simple state machine to "parse" sql into single statements
218da7d805SAndreas Gohr        $in_str = false;
228da7d805SAndreas Gohr        $in_com = false;
238da7d805SAndreas Gohr        $statement = '';
248da7d805SAndreas Gohr        for($i=0; $i<$len; $i++){
258da7d805SAndreas Gohr            $prev = $i ? $sql[$i-1] : "\n";
268da7d805SAndreas Gohr            $char = $sql[$i];
278da7d805SAndreas Gohr            $next = $i < ($len - 1) ? $sql[$i+1] : '';
288da7d805SAndreas Gohr
298da7d805SAndreas Gohr            // in comment? ignore everything until line end
308da7d805SAndreas Gohr            if($in_com){
318da7d805SAndreas Gohr                if($char == "\n"){
328da7d805SAndreas Gohr                    $in_com = false;
338da7d805SAndreas Gohr                }
348da7d805SAndreas Gohr                continue;
358da7d805SAndreas Gohr            }
368da7d805SAndreas Gohr
378da7d805SAndreas Gohr            // handle strings
388da7d805SAndreas Gohr            if($in_str){
398da7d805SAndreas Gohr                if($char == "'"){
408da7d805SAndreas Gohr                    if($next == "'"){
418da7d805SAndreas Gohr                        // current char is an escape for the next
428da7d805SAndreas Gohr                        $statement .= $char . $next;
438da7d805SAndreas Gohr                        $i++;
448da7d805SAndreas Gohr                        continue;
458da7d805SAndreas Gohr                    }else{
468da7d805SAndreas Gohr                        // end of string
478da7d805SAndreas Gohr                        $statement .= $char;
488da7d805SAndreas Gohr                        $in_str = false;
498da7d805SAndreas Gohr                        continue;
508da7d805SAndreas Gohr                    }
518da7d805SAndreas Gohr                }
528da7d805SAndreas Gohr                // still in string
538da7d805SAndreas Gohr                $statement .= $char;
548da7d805SAndreas Gohr                continue;
558da7d805SAndreas Gohr            }
568da7d805SAndreas Gohr
578da7d805SAndreas Gohr            // new comment?
588da7d805SAndreas Gohr            if($char == '-' && $next == '-' && $prev == "\n"){
598da7d805SAndreas Gohr                $in_com = true;
608da7d805SAndreas Gohr                continue;
618da7d805SAndreas Gohr            }
628da7d805SAndreas Gohr
638da7d805SAndreas Gohr            // new string?
648da7d805SAndreas Gohr            if($char == "'"){
658da7d805SAndreas Gohr                $in_str = true;
668da7d805SAndreas Gohr                $statement .= $char;
678da7d805SAndreas Gohr                continue;
688da7d805SAndreas Gohr            }
698da7d805SAndreas Gohr
708da7d805SAndreas Gohr            // the real delimiter
718da7d805SAndreas Gohr            if($char == ';'){
728da7d805SAndreas Gohr                $statements[] = trim($statement);
738da7d805SAndreas Gohr                $statement = '';
748da7d805SAndreas Gohr                continue;
758da7d805SAndreas Gohr            }
768da7d805SAndreas Gohr
778da7d805SAndreas Gohr            // some standard query stuff
788da7d805SAndreas Gohr            $statement .= $char;
798da7d805SAndreas Gohr        }
808da7d805SAndreas Gohr        if($statement) $statements[] = trim($statement);
818da7d805SAndreas Gohr
82*a4f75120SAndreas Gohr        return array_filter($statements); // remove empty statements
838da7d805SAndreas Gohr    }
848da7d805SAndreas Gohr}
85