Browse Source

add command-line db schema updater

Andrew Dolgov 7 years ago
parent
commit
b4c47f7e7b
3 changed files with 106 additions and 1 deletions
  1. 65 0
      classes/dbupdater.php
  2. 9 0
      classes/handler/public.php
  3. 32 1
      update.php

+ 65 - 0
classes/dbupdater.php

@@ -0,0 +1,65 @@
+<?php
+class DbUpdater {
+
+	private $link;
+	private $db_type;
+	private $need_version;
+
+	function __construct($link, $db_type, $need_version) {
+		$this->link = $link;
+		$this->db_type = $db_type;
+		$this->need_version = (int) $need_version;
+	}
+
+	function getSchemaVersion() {
+		$result = db_query($this->link, "SELECT schema_version FROM ttrss_version");
+		return (int) db_fetch_result($result, 0, "schema_version");
+	}
+
+	function isUpdateRequired() {
+		return $this->getSchemaVersion() < $this->need_version;
+	}
+
+	function getSchemaLines($version) {
+		$filename = "schema/versions/".$this->db_type."/$version.sql";
+
+		if (file_exists($filename)) {
+			return explode(";", preg_replace("/[\r\n]/", "", file_get_contents($filename)));
+		} else {
+			return false;
+		}
+	}
+
+	function performUpdateTo($version) {
+		if ($this->getSchemaVersion() == $version - 1) {
+
+			$lines = $this->getSchemaLines($version);
+
+			if (is_array($lines)) {
+
+				db_query($this->link, "BEGIN");
+
+				foreach ($lines as $line) {
+					if (strpos($line, "--") !== 0 && $line) {
+						db_query($this->link, $line);
+					}
+				}
+
+				$db_version = $this->getSchemaVersion();
+
+				if ($db_version == $version) {
+					db_query($this->link, "COMMIT");
+					return true;
+				} else {
+					db_query($this->link, "ROLLBACK");
+					return false;
+				}
+			} else {
+				return true;
+			}
+		} else {
+			return false;
+		}
+	}
+
+} ?>

+ 9 - 0
classes/handler/public.php

@@ -835,6 +835,15 @@ class Handler_Public extends Handler {
 		print "</body>";
 		print "</html>";
 
+	}
+
+	function dbupdate() {
+
+
+
+
+
+
 	}
 
 }

+ 32 - 1
update.php

@@ -31,6 +31,7 @@
 			"quiet",
 			"log:",
 			"indexes",
+			"update-schema",
 			"convert-filters",
 			"force-update",
 			"list-plugins",
@@ -72,6 +73,7 @@
 		print "  --quiet              - don't output messages to stdout\n";
 		print "  --log FILE           - log messages to FILE\n";
 		print "  --indexes            - recreate missing schema indexes\n";
+		print "  --update-schema      - update database schema\n";
 		print "  --convert-filters    - convert type1 filters to type2\n";
 		print "  --force-update       - force update of all feeds\n";
 		print "  --list-plugins       - list all available plugins\n";
@@ -290,6 +292,35 @@
 
 	}
 
+	if (isset($options["update-schema"])) {
+		_debug("checking for updates (" . DB_TYPE . ")...");
+
+		$updater = new DbUpdater($link, DB_TYPE, SCHEMA_VERSION);
+
+		if ($updater->isUpdateRequired()) {
+			_debug("schema update required, version " . $updater->getSchemaVersion() . " to " . SCHEMA_VERSION);
+			_debug("WARNING: please backup your database before continuing.");
+			_debug("Type 'yes' to continue.");
+
+			if (read_stdin() != 'yes')
+				exit;
+
+			for ($i = $updater->getSchemaVersion() + 1; $i <= SCHEMA_VERSION; $i++) {
+				_debug("performing update up to version $i...");
+
+				$result = $updater->performUpdateTo($i);
+
+				_debug($result ? "OK!" : "FAILED!");
+
+				if (!$result) return;
+
+			}
+		} else {
+			_debug("update not required.");
+		}
+
+	}
+
 	if (isset($options["list-plugins"])) {
 		$tmppluginhost = new PluginHost($link);
 		$tmppluginhost->load_all($tmppluginhost::KIND_ALL);
@@ -322,4 +353,4 @@
 
 	if (file_exists(LOCK_DIRECTORY . "/$lock_filename"))
 		unlink(LOCK_DIRECTORY . "/$lock_filename");
-?>
+g?>