bdd("sgbd") == "xml" ? "xml" : "sql")."/"; $versions_dir = $this->path("mw_dir")."app/data/upgrades/".$impl_dir; if(!is_dir($versions_dir)){ return false; } if(!$data_upgrade->load_versions("mtweb", $versions_dir)){ return false; } 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; } } return false; } 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 $versions; var $env; function mw_data_upgrade($env){ $this->env = $env; } function env(){ return isset($this->env) ? $this->env : false; } function load_versions($application_name, $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($application_name, $versions_dir, $file); } closedir($dh); } else return false; return true; } function load_version($application_name, $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(), $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_number => $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){ 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 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; $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; } function do_upgrade(){ return true; } function set_data_version(){ if(!isset($this->application_name)) return false; $env = $this->env(); $data = $env->data(); return $data->set_version($this->application_name, $this->version()); } }