Browse Source

Make installation work

Nathaniel van Diepen 11 years ago
parent
commit
28bb505e83
5 changed files with 225 additions and 17 deletions
  1. 131 1
      install/api.php
  2. 0 4
      install/index.php
  3. 49 0
      install/index.template.html
  4. 16 11
      install/install.sql
  5. 29 1
      js/install.js

+ 131 - 1
install/api.php

@@ -1,5 +1,110 @@
 <?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'])){
@@ -7,7 +112,32 @@
 			$id = $_GET['id'];
 			switch($_GET['type']){
 				case 'install':
-					
+					if($id == "run"){
+						if(isset($_GET['dbuser'])&&isset($_GET['dbpass'])&&isset($_GET['dbname'])&&isset($_GET['dbhost'])&&isset($_GET['dbtemplate'])){
+							$dbuser = $_GET['dbuser'];
+							$dbpass = $_GET['dbpass'];
+							$dbname = $_GET['dbname'];
+							$dbhost = $_GET['dbhost'];
+							$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, ';');
+							mysql_connect($dbhost,$dbuser,$dbpass) or die("Can't connect to ".$dbhost);
+							mysql_select_db($dbname) or die('error database selection');
+							foreach($sql_query as $sql){
+								mysql_query($sql) or die('error in query');
+							}
+							file_put_contents('../config.php',"<?php\n\t\$host='{$dbhost}';\n\t\$user = '{$dbuser}';\n\t\$pass = '{$dbpass}';\n\t\$name = '{$dbname}';\n?>");
+							echo 'pass';
+						}else{
+							echo "Please don't leave any fields blank";
+						}
+					}elseif($id=='config'){
+						echo file_get_contents('index.template.html');
+					}else{
+						die('Invalid id');
+					}
 				break;
 				default:
 					require_once('../api.php');

+ 0 - 4
install/index.php

@@ -8,9 +8,5 @@
 		<script src="../js/install.js"></script>
 	</head>
 	<body>
-		<!-- TODO add containers for content -->
-		<?php
-			print_r($_GET);
-		?>
 	</body>
 </html>

+ 49 - 0
install/index.template.html

@@ -0,0 +1,49 @@
+<style>
+	#config{
+		display: table;
+	}
+	#config>div{
+		display: table-row;
+	}
+	#config>div>span{
+		display: table-cell;
+	}
+</style>
+<form id="config">
+	<h2>
+		Database
+	</h2>
+	<div>
+		<span>
+			Host:
+		</span>
+		<span>
+			<input name="dbhost" type="string"/>
+		</span>
+	</div>
+	<div>
+		<span>
+			DB Name:
+		</span>
+		<span>
+			<input name="dbname" type="string"/>
+		</span>
+	</div>
+	<div>
+		<span>
+			Username:
+		</span>
+		<span>
+			<input name="dbuser" type="string"/>
+		</span>
+	</div>
+	<div>
+		<span>
+			Password:
+		</span>
+		<span>
+			<input name="dbpass" type="password"/>
+		</span>
+	</div>
+</form>
+<button value="Install" id="install">Install</button>

+ 16 - 11
install/install.template.sql → install/install.sql

@@ -1,3 +1,13 @@
+-- phpMyAdmin SQL Dump
+-- version 4.0.4.1
+-- http://www.phpmyadmin.net
+--
+-- Host: 127.0.0.1
+-- Generation Time: Oct 06, 2013 at 10:22 PM
+-- Server version: 5.6.11
+-- PHP Version: 5.5.3
+
+SET FOREIGN_KEY_CHECKS=0;
 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
 SET time_zone = "+00:00";
 
@@ -7,18 +17,12 @@ SET time_zone = "+00:00";
 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
 /*!40101 SET NAMES utf8 */;
 
---
--- Database: `$DATABASENAME`
---
-CREATE DATABASE IF NOT EXISTS `$DATABASENAME` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
-USE `$DATABASENAME`;
-
 -- --------------------------------------------------------
 
 --
 -- Table structure for table `issues`
 --
--- Creation: Oct 04, 2013 at 03:32 AM
+-- Creation: Oct 06, 2013 at 08:17 PM
 --
 
 DROP TABLE IF EXISTS `issues`;
@@ -47,7 +51,7 @@ CREATE TABLE IF NOT EXISTS `issues` (
 --
 -- Table structure for table `messages`
 --
--- Creation: Oct 05, 2013 at 02:24 AM
+-- Creation: Oct 06, 2013 at 08:21 PM
 --
 
 DROP TABLE IF EXISTS `messages`;
@@ -82,7 +86,7 @@ CREATE TABLE IF NOT EXISTS `messages` (
 --
 -- Table structure for table `rels`
 --
--- Creation: Oct 06, 2013 at 06:52 PM
+-- Creation: Oct 06, 2013 at 08:21 PM
 --
 
 DROP TABLE IF EXISTS `rels`;
@@ -112,7 +116,7 @@ CREATE TABLE IF NOT EXISTS `rels` (
 --
 -- Table structure for table `scrums`
 --
--- Creation: Oct 04, 2013 at 03:33 AM
+-- Creation: Oct 06, 2013 at 08:17 PM
 --
 
 DROP TABLE IF EXISTS `scrums`;
@@ -136,7 +140,7 @@ CREATE TABLE IF NOT EXISTS `scrums` (
 --
 -- Table structure for table `users`
 --
--- Creation: Oct 04, 2013 at 03:23 AM
+-- Creation: Oct 06, 2013 at 08:17 PM
 --
 
 DROP TABLE IF EXISTS `users`;
@@ -184,6 +188,7 @@ ALTER TABLE `rels`
 --
 ALTER TABLE `scrums`
   ADD CONSTRAINT `scrums_ibfk_1` FOREIGN KEY (`u_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+SET FOREIGN_KEY_CHECKS=1;
 
 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

+ 29 - 1
js/install.js

@@ -1 +1,29 @@
-// TODO - Add initial page loading and handlers
+(function($,History){
+	var State = History.getState();
+	$(document).ready(function(){
+		if($.isEmptyObject(State.data)){
+			History.pushState({
+				type: 'install',
+				id: 'config'
+			},'Bugs','config');
+		}
+		$(window).on('statechange',function(){
+			State = History.getState();
+			$.get('api.php',State.data,function(d){
+				$('body').html(d);
+				$('#install').click(function(){
+					$('#install').attr('disabled','disabled');
+					$.get('api.php?'+$("#config").serialize()+'&dbtemplate=install&type=install&id=run',function(d){
+						if(d != "pass"){
+							alert(d);
+							$('#install').removeAttr('disabled');
+						}else{
+							alert('Installation successful!');
+							location = '..';
+						}
+					},'text')
+				});
+			},'html');
+		}).trigger('statechange');
+	});
+})(jQuery,History);