Browse Source

CLI update apply db patches

Roman 3 years ago
parent
commit
a18b35f784
3 changed files with 69 additions and 28 deletions
  1. 60 25
      cli.php
  2. 6 3
      core/Objects/User.class.php
  3. 3 0
      core/core.php

+ 60 - 25
cli.php

@@ -21,7 +21,7 @@ function _exit(string $line = "") {
   die();
 }
 
-if (php_sapi_name() !== "cli") {
+if (!is_cli()) {
   _exit("Can only be executed via CLI");
 }
 
@@ -36,11 +36,12 @@ function getDatabaseConfig(): ConnectionData {
   return new $configClass();
 }
 
-function getUser(): User {
+function getUser(): ?User {
   $config = new Configuration();
   $user = new User($config);
   if (!$user->getSQL() || !$user->getSQL()->isConnected()) {
-    _exit("Could not establish database connection");
+    printLine("Could not establish database connection");
+    return null;
   }
 
   return $user;
@@ -50,6 +51,33 @@ function printHelp() {
   // TODO: help
 }
 
+function applyPatch(\Driver\SQL\SQL $sql, string $patchName): bool {
+  $class = str_replace('/', '\\', $patchName);
+  $className = "\\Configuration\\$class";
+  $classPath = getClassPath($className);
+  if (!file_exists($classPath) || !is_readable($classPath)) {
+    printLine("Database script file does not exist or is not readable");
+    return false;
+  }
+
+  include_once $classPath;
+  $obj = new $className();
+  if (!($obj instanceof DatabaseScript)) {
+    printLine("Not a database script");
+    return false;
+  }
+
+  $queries = $obj->createQueries($sql);
+  foreach ($queries as $query) {
+    if (!$query->execute($sql)) {
+      printLine($sql->getLastError());
+      return false;
+    }
+  }
+
+  return true;
+}
+
 function handleDatabase(array $argv) {
   $action = $argv[2] ?? "";
 
@@ -59,27 +87,9 @@ function handleDatabase(array $argv) {
       _exit("Usage: cli.php db migrate <class name>");
     }
 
-    $class = str_replace('/', '\\', $class);
-    $className = "\\Configuration\\$class";
-    $classPath = getClassPath($className);
-    if (!file_exists($classPath) || !is_readable($classPath)) {
-      _exit("Database script file does not exist or is not readable");
-    }
-
-    include_once $classPath;
-    $obj = new $className();
-    if (!($obj instanceof DatabaseScript)) {
-      _exit("Not a database script");
-    }
-
-    $user = getUser();
+    $user = getUser() or die();
     $sql = $user->getSQL();
-    $queries = $obj->createQueries($sql);
-    foreach ($queries as $query) {
-      if (!$query->execute($sql)) {
-        _exit($sql->getLastError());
-      }
-    }
+    applyPatch($sql, $class);
   } else if ($action === "export" || $action === "import") {
 
     // database config
@@ -160,7 +170,7 @@ function handleDatabase(array $argv) {
       proc_close($process);
     }
   } else if ($action === "clean") {
-    $user = getUser();
+    $user = getUser() or die();
     $sql = $user->getSQL();
 
     printLine("Deleting user related data older than 90 days...");
@@ -242,6 +252,7 @@ function onMaintenance(array $argv) {
     _exit("Maintenance disabled");
   } else if ($action === "update") {
 
+    $oldPatchFiles = glob('core/Configuration/Patch/*.php');
     printLine("$ git remote -v");
     exec("git remote -v", $gitRemote, $ret);
     if ($ret !== 0) {
@@ -294,9 +305,26 @@ function onMaintenance(array $argv) {
       printLine("Update could not be applied, check the git output.");
       printLine("Follow the instructions and afterwards turn off the maintenance mode again using:");
       printLine("cli.php maintenance off");
+      printLine("Also don't forget to apply new database patches using: cli.php db migrate");
       die();
     }
 
+    $newPatchFiles = glob('core/Configuration/Patch/*.php');
+    $newPatchFiles = array_diff($newPatchFiles, $oldPatchFiles);
+    if (count($newPatchFiles) > 0) {
+      printLine("Applying new database patches");
+      $user = getUser();
+      if ($user) {
+        $sql = $user->getSQL();
+        foreach ($newPatchFiles as $patchFile) {
+          if (preg_match("/core\/Configuration\/(Patch\/.*)\.class\.php/", $patchFile, $match)) {
+            $patchName = $match[1];
+            applyPatch($sql, $patchName);
+          }
+        }
+      }
+    }
+
     // disable maintenance mode again
     if (!$isMaintenanceEnabled) {
       printLine("Turning off maintenance mode");
@@ -343,7 +371,7 @@ function printTable(array $head, array $body) {
 // TODO: add missing api functions (should be all internal only i guess)
 function onRoutes(array $argv) {
 
-  $user = getUser();
+  $user = getUser() or die();
   $action = $argv[2] ?? "list";
 
   if ($action === "list") {
@@ -427,6 +455,10 @@ function onRoutes(array $argv) {
   }
 }
 
+function onTest($argv) {
+
+}
+
 $argv = $_SERVER['argv'];
 if (count($argv) < 2) {
   _exit("Usage: cli.php <db|routes|settings|maintenance> [options...]");
@@ -446,6 +478,9 @@ switch ($command) {
   case 'maintenance':
     onMaintenance($argv);
     break;
+  case 'test':
+    onTest($argv);
+    break;
   default:
     printLine("Unknown command '$command'");
     printLine();

+ 6 - 3
core/Objects/User.class.php

@@ -22,12 +22,15 @@ class User extends ApiObject {
   private array $groups;
 
   public function __construct($configuration) {
-    session_start();
     $this->configuration = $configuration;
-    $this->setLanguage(Language::DEFAULT_LANGUAGE());
     $this->reset();
     $this->connectDb();
-    $this->parseCookies();
+
+    if (!is_cli()) {
+      session_start();
+      $this->setLanguage(Language::DEFAULT_LANGUAGE());
+      $this->parseCookies();
+    }
   }
 
   public function __destruct() {

+ 3 - 0
core/core.php

@@ -12,6 +12,9 @@ spl_autoload_register(function($class) {
   }
 });
 
+function is_cli(): bool {
+  return php_sapi_name() === "cli";
+}
 
 function getProtocol(): string {
   $isSecure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ||