From b4c47f7e7b4c8220e07115f27c373df20503d576 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 4 Apr 2013 19:15:14 +0400 Subject: [PATCH] add command-line db schema updater --- classes/dbupdater.php | 65 ++++++++++++++++++++++++++++++++++++++ classes/handler/public.php | 9 ++++++ update.php | 33 ++++++++++++++++++- 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 classes/dbupdater.php diff --git a/classes/dbupdater.php b/classes/dbupdater.php new file mode 100644 index 00000000..a9a71327 --- /dev/null +++ b/classes/dbupdater.php @@ -0,0 +1,65 @@ +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; + } + } + +} ?> diff --git a/classes/handler/public.php b/classes/handler/public.php index b8a32cd2..3d3d6727 100644 --- a/classes/handler/public.php +++ b/classes/handler/public.php @@ -835,6 +835,15 @@ class Handler_Public extends Handler { print ""; print ""; + } + + function dbupdate() { + + + + + + } } diff --git a/update.php b/update.php index e57aef90..e1afb6bd 100755 --- a/update.php +++ b/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?> -- 2.39.2