data_upgrades; } function init_data_upgrades(){ $impl_dir = ($this->bdd("sgbd") == "xml" ? "xml" : "sql")."/"; $versions_dir = $this->path("mw_dir")."app/data/upgrades/".$impl_dir; 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(($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(); return true; } function data_upgrade_required($RELOAD = false){ if(!isset($this->data_upgrades)){ if(($res = $this->init_data_upgrades()) !== true){ return $res; } } 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(){ if(!isset($this->data_upgrades)) return false; foreach($this->data_upgrades as $data_upgrade){ if($data_upgrade->upgrade_required() && ($res = $data_upgrade->do_upgrade()) !== true){ return $res; } } return true; } } class mw_data_upgrade{ var $application_name; var $versions; var $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($versions_dir){ if($dh = opendir($versions_dir)){ $versions_dir .= $versions_dir && substr($versions_dir, -1) != "/" ? "/" : ""; while(($file = readdir($dh)) !== false){ if( substr($file, 0, 1) != "." && !is_dir($versions_dir.$file) && strcmp(substr($file, -4), ".php") == 0 ) $this->load_version($versions_dir, $file); } closedir($dh); } else return false; return true; } function load_version($versions_dir, $version_file){ if( !$version_file || !file_exists($versions_dir.$version_file) || (substr($version_file, 0, 1) == ".") || is_dir($versions_dir.$version_file) || (substr($version_file, -4) != ".php") ) return false; $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(), $this->application_name); return $this->add_version($version); } function add_version($version){ if(!$version->version()) return false; if(!isset($this->versions)) $this->versions = array(); $tmp = array(); $INSERTED = false; foreach($this->versions as $_version){ if(version_compare($version->version(), $_version->version()) == 0){ $INSERTED = true; } elseif(version_compare($version->version(), $_version->version()) < 0){ $tmp[] = $version; $tmp[] = $_version; $INSERTED = true; } else{ $tmp[] = $_version; } } if(!$INSERTED) $tmp[] = $version; $this->versions = $tmp; return true; } function upgrade_required(){ if(!isset($this->versions)) return false; 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){ 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 ".$this->application_name." ".$version->version(); } } return true; } } class mw_data_version{ var $env; var $application_name; function version(){ return false; } function application_name(){ return $this->application_name; } function mw_data_version($env, $application_name){ $this->env = $env; $this->application_name = $application_name; } function env(){ return isset($this->env) ? $this->env : false; } function upgrade_required(){ if(!isset($this->application_name)) return false; if(!$this->version()) return false; $env = $this->env(); $data = $env->data(); if(!($data_version = $data->version($this->application_name))) return true; return version_compare($data_version, $this->version()) < 0; } function do_upgrade(){ return true; } 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()); } }