Browse Source

actually check for failures properly in the dbupdater

Andrew Dolgov 4 years ago
parent
commit
977cea1438
9 changed files with 44 additions and 11 deletions
  1. 3 0
      classes/db.php
  2. 7 2
      classes/db/mysql.php
  3. 7 2
      classes/db/mysqli.php
  4. 7 2
      classes/db/pgsql.php
  5. 12 2
      classes/dbupdater.php
  6. 2 2
      classes/handler/public.php
  7. 1 0
      classes/idb.php
  8. 4 0
      include/db.php
  9. 1 1
      update.php

+ 3 - 0
classes/db.php

@@ -94,5 +94,8 @@ class Db implements IDb {
 		return $this->adapter->last_error();
 	}
 
+	function last_query_error() {
+		return $this->adapter->last_query_error();
+	}
 }
 ?>

+ 7 - 2
classes/db/mysql.php

@@ -1,6 +1,7 @@
 <?php
 class Db_Mysql implements IDb {
 	private $link;
+	private $last_error;
 
 	function connect($host, $user, $pass, $db, $port) {
 		$this->link = mysql_connect($host, $user, $pass);
@@ -28,10 +29,10 @@ class Db_Mysql implements IDb {
 	function query($query, $die_on_error = true) {
 		$result = @mysql_query($query, $this->link);
 		if (!$result) {
-			$error = @mysql_error($this->link);
+			$this->last_error = @mysql_error($this->link);
 
 			@mysql_query("ROLLBACK", $this->link);
-			user_error("Query $query failed: " . ($this->link ? $error : "No connection"),
+			user_error("Query $query failed: " . ($this->link ? $this->last_error : "No connection"),
 				$die_on_error ? E_USER_ERROR : E_USER_WARNING);
 		}
 		return $result;
@@ -62,6 +63,10 @@ class Db_Mysql implements IDb {
 		return mysql_error();
 	}
 
+	function last_query_error() {
+		return $this->last_error;
+	}
+
 	function init() {
 		$this->query("SET time_zone = '+0:0'");
 

+ 7 - 2
classes/db/mysqli.php

@@ -1,6 +1,7 @@
 <?php
 class Db_Mysqli implements IDb {
 	private $link;
+	private $last_error;
 
 	function connect($host, $user, $pass, $db, $port) {
 		if ($port)
@@ -26,10 +27,10 @@ class Db_Mysqli implements IDb {
 	function query($query, $die_on_error = true) {
 		$result = @mysqli_query($this->link, $query);
 		if (!$result) {
-			$error = @mysqli_error($this->link);
+			$this->last_error = @mysqli_error($this->link);
 
 			@mysqli_query($this->link, "ROLLBACK");
-			user_error("Query $query failed: " . ($this->link ? $error : "No connection"),
+			user_error("Query $query failed: " . ($this->link ? $this->last_error : "No connection"),
 				$die_on_error ? E_USER_ERROR : E_USER_WARNING);
 		}
 
@@ -66,6 +67,10 @@ class Db_Mysqli implements IDb {
 		return mysqli_error();
 	}
 
+	function last_query_error() {
+		return $this->last_error;
+	}
+
 	function init() {
 		$this->query("SET time_zone = '+0:0'");
 

+ 7 - 2
classes/db/pgsql.php

@@ -1,6 +1,7 @@
 <?php
 class Db_Pgsql implements IDb {
 	private $link;
+	private $last_error;
 
 	function connect($host, $user, $pass, $db, $port) {
 		$string = "dbname=$db user=$user";
@@ -38,11 +39,11 @@ class Db_Pgsql implements IDb {
 		$result = @pg_query($this->link, $query);
 
 		if (!$result) {
-			$error = @pg_last_error($this->link);
+			$this->last_error = @pg_last_error($this->link);
 
 			@pg_query($this->link, "ROLLBACK");
 			$query = htmlspecialchars($query); // just in case
-			user_error("Query $query failed: " . ($this->link ? $error : "No connection"),
+			user_error("Query $query failed: " . ($this->link ? $this->last_error : "No connection"),
 				$die_on_error ? E_USER_ERROR : E_USER_WARNING);
 		}
 		return $result;
@@ -73,6 +74,10 @@ class Db_Pgsql implements IDb {
 		return pg_last_error($this->link);
 	}
 
+	function last_query_error() {
+		return $this->last_error;
+	}
+
 	function init() {
 		$this->query("set client_encoding = 'UTF-8'");
 		pg_set_client_encoding("UNICODE");

+ 12 - 2
classes/dbupdater.php

@@ -30,7 +30,7 @@ class DbUpdater {
 		}
 	}
 
-	function performUpdateTo($version) {
+	function performUpdateTo($version, $html_output = true) {
 		if ($this->getSchemaVersion() == $version - 1) {
 
 			$lines = $this->getSchemaLines($version);
@@ -41,7 +41,17 @@ class DbUpdater {
 
 				foreach ($lines as $line) {
 					if (strpos($line, "--") !== 0 && $line) {
-						db_query($line);
+						if (!db_query($line, false)) {
+							if ($html_output) {
+								print_notice("Query: $line");
+								print_error("Error: " . db_last_query_error());
+							} else {
+								_debug("Query: $line");
+								_debug("Error: " . db_last_query_error());
+							}
+
+							return false;
+						}
 					}
 				}
 

+ 2 - 2
classes/handler/public.php

@@ -980,7 +980,7 @@ class Handler_Public extends Handler {
 						for ($i = $updater->getSchemaVersion() + 1; $i <= SCHEMA_VERSION; $i++) {
 							print "<li>Performing update up to version $i...";
 
-							$result = $updater->performUpdateTo($i);
+							$result = $updater->performUpdateTo($i, true);
 
 							if (!$result) {
 								print "<span class='err'>FAILED!</span></li></ul>";
@@ -990,7 +990,7 @@ class Handler_Public extends Handler {
 								<input type=\"submit\" value=\"".__("Return to Tiny Tiny RSS")."\">
 								</form>";
 
-								break;
+								return;
 							} else {
 								print "<span class='ok'>OK!</span></li>";
 							}

+ 1 - 0
classes/idb.php

@@ -9,5 +9,6 @@ interface IDb {
 	function close();
 	function affected_rows($result);
 	function last_error();
+	function last_query_error();
 }
 ?>

+ 4 - 0
include/db.php

@@ -29,6 +29,10 @@ function db_last_error() {
 	return Db::get()->last_error();
 }
 
+function db_last_query_error() {
+	return Db::get()->last_query_error();
+}
+
 function db_quote($str){
 	return Db::get()->quote($str);
 }

+ 1 - 1
update.php

@@ -325,7 +325,7 @@
 			for ($i = $updater->getSchemaVersion() + 1; $i <= SCHEMA_VERSION; $i++) {
 				_debug("performing update up to version $i...");
 
-				$result = $updater->performUpdateTo($i);
+				$result = $updater->performUpdateTo($i, false);
 
 				_debug($result ? "OK!" : "FAILED!");