<?php // MYSQL default bugs:bugs ini_set('memory_limit','5120M'); set_time_limit(0); function remove_comments(&$output){ $lines = explode("\n",$output); $output = ""; // try to keep mem. use down $linecount = count($lines); $in_comment = false; for($i = 0; $i < $linecount; $i++){ if(preg_match("/^\/\*/",preg_quote($lines[$i]))){ $in_comment = true; } if(!$in_comment){ $output .= $lines[$i] . "\n"; } if(preg_match("/\*\/$/",preg_quote($lines[$i]))){ $in_comment = false; } } unset($lines); return $output; } function remove_remarks($sql){ $lines = explode("\n", $sql); // try to keep mem. use down $sql = ""; $linecount = count($lines); $output = ""; for ($i = 0; $i < $linecount; $i++){ if (($i != ($linecount - 1)) || (strlen($lines[$i]) > 0)){ if (isset($lines[$i][0]) && $lines[$i][0] != "#"){ $output .= $lines[$i] . "\n"; }else{ $output .= "\n"; } // Trading a bit of speed for lower mem. use here. $lines[$i] = ""; } } return $output; } function split_sql_file($sql, $delimiter){ // Split up our string into "possible" SQL statements. $tokens = explode($delimiter, $sql); // try to save mem. $sql = ""; $output = array(); // we don't actually care about the matches preg gives us. $matches = array(); // this is faster than calling count($oktens) every time thru the loop. $token_count = count($tokens); for ($i = 0; $i < $token_count; $i++){ // Don't wanna add an empty string as the last thing in the array. if(($i != ($token_count - 1)) || (strlen($tokens[$i] > 0))){ // This is the total number of single quotes in the token. $total_quotes = preg_match_all("/'/", $tokens[$i], $matches); // Counts single quotes that are preceded by an odd number of backslashes, // which means they're escaped quotes. $escaped_quotes = preg_match_all("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$i], $matches); $unescaped_quotes = $total_quotes - $escaped_quotes; // If the number of unescaped quotes is even, then the delimiter did NOT occur inside a string literal. if(($unescaped_quotes % 2) == 0){ // It's a complete sql statement. $output[] = $tokens[$i]; // save memory. $tokens[$i] = ""; }else{ // incomplete sql statement. keep adding tokens until we have a complete one. // $temp will hold what we have so far. $temp = $tokens[$i] . $delimiter; // save memory.. $tokens[$i] = ""; // Do we have a complete statement yet? $complete_stmt = false; for ($j = $i + 1; (!$complete_stmt && ($j < $token_count)); $j++){ // This is the total number of single quotes in the token. $total_quotes = preg_match_all("/'/", $tokens[$j], $matches); // Counts single quotes that are preceded by an odd number of backslashes, // which means they're escaped quotes. $escaped_quotes = preg_match_all("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$j], $matches); $unescaped_quotes = $total_quotes - $escaped_quotes; if(($unescaped_quotes % 2) == 1){ // odd number of unescaped quotes. In combination with the previous incomplete // statement(s), we now have a complete statement. (2 odds always make an even) $output[] = $temp . $tokens[$j]; // save memory. $tokens[$j] = ""; $temp = ""; // exit the loop. $complete_stmt = true; // make sure the outer loop continues at the right point. $i = $j; }else{ // even number of unescaped quotes. We still don't have a complete statement. // (1 odd and 1 even always make an odd) $temp .= $tokens[$j] . $delimiter; // save memory. $tokens[$j] = ""; } } // for.. } // else } } return $output; } // TODO - Add API handling. $method = $_SERVER['REQUEST_METHOD']; if(isset($_GET['type'])){ if(isset($_GET['id'])){ $id = $_GET['id']; switch($_GET['type']){ case 'install': if($id == "run"){ $path = realpath(dirname(__FILE__)); if(isset($_GET['dbuser'])&&isset($_GET['dbpass'])&&isset($_GET['dbname'])&&isset($_GET['dbhost'])&&isset($_GET['dbtemplate'])&&isset($_GET['email'])){ $dbuser = $_GET['dbuser']; $dbpass = $_GET['dbpass']; $dbname = $_GET['dbname']; $dbhost = $_GET['dbhost']; $email = $_GET['email']; $dbms_schema = $_GET['dbtemplate'].'.sql'; $sql_query = @fread(@fopen($dbms_schema, 'r'), @filesize($dbms_schema)) or die("Can't access template: ".$_GET['dbtemplate'].".sql"); $sql_query = remove_comments($sql_query); $sql_query = remove_remarks($sql_query); $sql_query = split_sql_file($sql_query, ';'); file_put_contents('../config.default.json',"{\"host\":\"{$dbhost}\",\"user\":\"{$dbuser}\",\"password\":\"{$dbpass}\",\"database\":\"{$dbname}\",\"expire\":86400,\"email\":\"{$email}\"}"); require_once('../php/database.php'); foreach($sql_query as $sql){ query($sql) or die('Error in query: '.get_sql()->error); } echo 'pass'; }else{ echo "Please don't leave any fields blank"; } }elseif($id=='config'){ echo file_get_contents('index.template.html'); }elseif($id='cleanup'){ $files = scandir($path); foreach($files as $file){ if($file != '.' && $file != '..'){ @unlink($path.'/'.$file); } } @rmdir($path); }else{ die('Invalid id'); } break; default: require_once('../api.php'); } }else{ die("id missing"); } }else{ die("type missing"); } ?>