upgrade 0.11.2 pour XML, MySql et SQLite
[mtweb] / mw / env / modules / mw_env_data_upgrade.php
index ff70f6a..1d65551 100644 (file)
@@ -3,30 +3,67 @@
   class mw_env_data_upgrade extends mw_env{
 
     var $data_upgrades;
+    var $UPGRADE_REQUIRED;
+
+    function data_upgrades(){
+      return $this->data_upgrades;
+    }
 
     function init_data_upgrades(){
-      $data_upgrade = new mw_data_upgrade($this);
       $impl_dir = ($this->bdd("sgbd") == "xml" ? "xml" : "sql")."/";
       $versions_dir = $this->path("mw_dir")."app/data/upgrades/".$impl_dir;
-      if(!is_dir($versions_dir)){
-        return false;
+      if(is_dir($versions_dir)){
+        $data_upgrade = new mw_data_upgrade($this, "mtweb");
+        if(!$data_upgrade->load_versions($versions_dir)){
+          return "erreur lors de la lecture des versions";
+        }
+        if(!isset($this->data_upgrades)) $this->data_upgrades = array();
+        $this->data_upgrades["mtweb"] = $data_upgrade;
+
       }
-      if(!$data_upgrade->load_versions("mtweb", $versions_dir)){
-        return false;
+      if(($plugins = $this->plugins("ASC")) === false){
+        return "impossible de lire les upgrades pour les plugins";
+      }
+      foreach($plugins as $plugin_name => $plugin){
+        if(
+             $plugin["installed"]
+          && $plugin["enabled"]
+        ){
+          $versions_dir = $this->path("mw_dir")."plugins/".$plugin_name."/app/data/upgrades/".$impl_dir;
+          if(!is_dir($versions_dir)){
+            continue;
+          }
+          $data_upgrade = new mw_data_upgrade($this, $plugin_name);
+          if(!$data_upgrade->load_versions($versions_dir)){
+            return "erreur lors de la lecture des versions pour le plugin ".$plugin_name;
+          }
+          if(!isset($this->data_upgrades)) $this->data_upgrades = array();
+          $this->data_upgrades[$plugin_name] = $data_upgrade;
+        }
       }
       if(!isset($this->data_upgrades)) $this->data_upgrades = array();
-      $this->data_upgrades[] = $data_upgrade;
       return true;
     }
 
-    function data_upgrade_required(){
-      if(!isset($this->data_upgrades)) return false;
-      foreach($this->data_upgrades as $data_upgrade){
-        if($data_upgrade->upgrade_required()){
-          return true;
+    function data_upgrade_required($RELOAD = false){
+      if(!isset($this->data_upgrades)){
+        if(($res = $this->init_data_upgrades()) !== true){
+          return $res;
         }
       }
-      return false;
+      if(!isset($this->data_upgrades)){
+        return "impossible de charger les upgrades";
+      }
+      if($RELOAD || !isset($this->UPGRADE_REQUIRED)){
+        $this->UPGRADE_REQUIRED = false;
+        foreach($this->data_upgrades as $data_upgrade){
+          if($data_upgrade->upgrade_required()){
+            $this->UPGRADE_REQUIRED = true;
+            break;
+          }
+        }
+      }
+      return $this->UPGRADE_REQUIRED;
     }
 
     function do_data_upgrade(){
 
   class mw_data_upgrade{
 
+    var $application_name;
     var $versions;
     var $env;
 
-    function mw_data_upgrade($env){
+    function mw_data_upgrade($env, $application_name){
       $this->env = $env;
+      $this->application_name = $application_name;
     }
 
     function env(){
       return isset($this->env) ? $this->env : false;
     }
 
-    function load_versions($application_name, $versions_dir){
+    function load_versions($versions_dir){
       if($dh = opendir($versions_dir)){
         $versions_dir .= $versions_dir && substr($versions_dir, -1) != "/" ? "/" : "";
         while(($file = readdir($dh)) !== false){
                substr($file, 0, 1) != "."
             && !is_dir($versions_dir.$file)
             && strcmp(substr($file, -4), ".php") == 0
-          ) $this->load_version($application_name, $versions_dir, $file);
+          ) $this->load_version($versions_dir, $file);
         }
         closedir($dh);
       }
       return true;
     }
 
-    function load_version($application_name, $versions_dir, $version_file){
+    function load_version($versions_dir, $version_file){
       if(
            !$version_file
         || !file_exists($versions_dir.$version_file)
       $class_name = substr($version_file, 0, -4);
       if(!class_exists($class_name)) require_once $versions_dir.$version_file;
       if(!class_exists($class_name)) return false;
-      $version = new $class_name($this->env(), $application_name);
+      $version = new $class_name($this->env(), $this->application_name);
       return $this->add_version($version);
     }
 
 
     function upgrade_required(){
       if(!isset($this->versions)) return false;
-      foreach($this->versions as $version_number => $version){
+      foreach($this->versions as $version){
         if($version->upgrade_required()) return true;
       }
       return false;
 
     function do_upgrade(){
       if(!isset($this->versions)) return true;
-      foreach($this->versions as $version_number => $version){
+      foreach($this->versions as $version){
         if($version->upgrade_required() && ($res = $version->do_upgrade()) !== true){
           return $res." (dans ".get_class($version).")";
         }
         if(!$version->set_data_version()){
-          return "impossible de mettre a jour la version des donnees pour ".$version->application_name();
+          return "impossible de mettre a jour la version des donnees pour ".$this->application_name." ".$version->version();
         }
       }
       return true;
 
     function upgrade_required(){
       if(!isset($this->application_name)) return false;
+      if(!$this->version()) return false;
       $env = $this->env();
       $data = $env->data();
-      if(!($env_version = $env->version($this->application_name))) return false;
       if(!($data_version = $data->version($this->application_name))) return true;
-      return version_compare($data_version, $env_version) < 0;
+      return version_compare($data_version, $this->version()) < 0;
     }
 
     function do_upgrade(){
 
     function set_data_version(){
       if(!isset($this->application_name)) return false;
+      if(!$this->version()) return false;
       $env = $this->env();
       $data = $env->data();
       return $data->set_version($this->application_name, $this->version());