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