1d655516122f7e502de976663d1f4af71e20f691
[mtweb] / mw / env / modules / mw_env_data_upgrade.php
1 <?php
2
3   class mw_env_data_upgrade extends mw_env{
4
5     var $data_upgrades;
6     var $UPGRADE_REQUIRED;
7
8     function data_upgrades(){
9       return $this->data_upgrades;
10     }
11
12     function init_data_upgrades(){
13       $impl_dir = ($this->bdd("sgbd") == "xml" ? "xml" : "sql")."/";
14       $versions_dir = $this->path("mw_dir")."app/data/upgrades/".$impl_dir;
15       if(is_dir($versions_dir)){
16         $data_upgrade = new mw_data_upgrade($this, "mtweb");
17         if(!$data_upgrade->load_versions($versions_dir)){
18           return "erreur lors de la lecture des versions";
19         }
20         if(!isset($this->data_upgrades)) $this->data_upgrades = array();
21         $this->data_upgrades["mtweb"] = $data_upgrade;
22
23       }
24       if(($plugins = $this->plugins("ASC")) === false){
25         return "impossible de lire les upgrades pour les plugins";
26       }
27       foreach($plugins as $plugin_name => $plugin){
28         if(
29              $plugin["installed"]
30           && $plugin["enabled"]
31         ){
32           $versions_dir = $this->path("mw_dir")."plugins/".$plugin_name."/app/data/upgrades/".$impl_dir;
33           if(!is_dir($versions_dir)){
34             continue;
35           }
36           $data_upgrade = new mw_data_upgrade($this, $plugin_name);
37           if(!$data_upgrade->load_versions($versions_dir)){
38             return "erreur lors de la lecture des versions pour le plugin ".$plugin_name;
39           }
40           if(!isset($this->data_upgrades)) $this->data_upgrades = array();
41           $this->data_upgrades[$plugin_name] = $data_upgrade;
42         }
43       }
44       if(!isset($this->data_upgrades)) $this->data_upgrades = array();
45       return true;
46     }
47
48     function data_upgrade_required($RELOAD = false){
49       if(!isset($this->data_upgrades)){
50         if(($res = $this->init_data_upgrades()) !== true){
51           return $res;
52         }
53       }
54       if(!isset($this->data_upgrades)){
55         return "impossible de charger les upgrades";
56       }
57       if($RELOAD || !isset($this->UPGRADE_REQUIRED)){
58         $this->UPGRADE_REQUIRED = false;
59         foreach($this->data_upgrades as $data_upgrade){
60           if($data_upgrade->upgrade_required()){
61             $this->UPGRADE_REQUIRED = true;
62             break;
63           }
64         }
65       }
66       return $this->UPGRADE_REQUIRED;
67     }
68
69     function do_data_upgrade(){
70       if(!isset($this->data_upgrades)) return false;
71       foreach($this->data_upgrades as $data_upgrade){
72         if($data_upgrade->upgrade_required() && ($res = $data_upgrade->do_upgrade()) !== true){
73           return $res;
74         }
75       }
76       return true;
77     }
78
79   }
80
81   class mw_data_upgrade{
82
83     var $application_name;
84     var $versions;
85     var $env;
86
87     function mw_data_upgrade($env, $application_name){
88       $this->env = $env;
89       $this->application_name = $application_name;
90     }
91
92     function env(){
93       return isset($this->env) ? $this->env : false;
94     }
95
96     function load_versions($versions_dir){
97       if($dh = opendir($versions_dir)){
98         $versions_dir .= $versions_dir && substr($versions_dir, -1) != "/" ? "/" : "";
99         while(($file = readdir($dh)) !== false){
100           if(
101                substr($file, 0, 1) != "."
102             && !is_dir($versions_dir.$file)
103             && strcmp(substr($file, -4), ".php") == 0
104           ) $this->load_version($versions_dir, $file);
105         }
106         closedir($dh);
107       }
108       else return false;
109       return true;
110     }
111
112     function load_version($versions_dir, $version_file){
113       if(
114            !$version_file
115         || !file_exists($versions_dir.$version_file)
116         || (substr($version_file, 0, 1) == ".")
117         || is_dir($versions_dir.$version_file)
118         || (substr($version_file, -4) != ".php")
119       ) return false;
120       $class_name = substr($version_file, 0, -4);
121       if(!class_exists($class_name)) require_once $versions_dir.$version_file;
122       if(!class_exists($class_name)) return false;
123       $version = new $class_name($this->env(), $this->application_name);
124       return $this->add_version($version);
125     }
126
127     function add_version($version){
128       if(!$version->version()) return false;
129       if(!isset($this->versions)) $this->versions = array();
130       $tmp = array();
131       $INSERTED = false;
132       foreach($this->versions as $_version){
133         if(version_compare($version->version(), $_version->version()) == 0){
134           $INSERTED = true;
135         }
136         elseif(version_compare($version->version(), $_version->version()) < 0){
137           $tmp[] = $version;
138           $tmp[] = $_version;
139           $INSERTED = true;
140         }
141         else{
142           $tmp[] = $_version;
143         }
144       }
145       if(!$INSERTED) $tmp[] = $version;
146       $this->versions = $tmp;
147       return true;
148     }
149
150     function upgrade_required(){
151       if(!isset($this->versions)) return false;
152       foreach($this->versions as $version){
153         if($version->upgrade_required()) return true;
154       }
155       return false;
156     }
157
158     function do_upgrade(){
159       if(!isset($this->versions)) return true;
160       foreach($this->versions as $version){
161         if($version->upgrade_required() && ($res = $version->do_upgrade()) !== true){
162           return $res." (dans ".get_class($version).")";
163         }
164         if(!$version->set_data_version()){
165           return "impossible de mettre a jour la version des donnees pour ".$this->application_name." ".$version->version();
166         }
167       }
168       return true;
169     }
170
171   }
172
173   class mw_data_version{
174
175     var $env;
176     var $application_name;
177
178     function version(){
179       return false;
180     }
181
182     function application_name(){
183       return $this->application_name;
184     }
185
186     function mw_data_version($env, $application_name){
187       $this->env = $env;
188       $this->application_name = $application_name;
189     }
190
191     function env(){
192       return isset($this->env) ? $this->env : false;
193     }
194
195     function upgrade_required(){
196       if(!isset($this->application_name)) return false;
197       if(!$this->version()) return false;
198       $env = $this->env();
199       $data = $env->data();
200       if(!($data_version = $data->version($this->application_name))) return true;
201       return version_compare($data_version, $this->version()) < 0;
202     }
203
204     function do_upgrade(){
205       return true;
206     }
207
208     function set_data_version(){
209       if(!isset($this->application_name)) return false;
210       if(!$this->version()) return false;
211       $env = $this->env();
212       $data = $env->data();
213       return $data->set_version($this->application_name, $this->version());
214     }
215
216   }