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