public attr / function, constructeurs __construct
[mtweb] / mw / env / modules / mw_env_data_upgrade.php
1 <?php
2
3   class mw_env_data_upgrade extends mw_env{
4
5     public $data_upgrades;
6     public $UPGRADE_REQUIRED;
7
8     public function data_upgrades(){
9       return $this->data_upgrades;
10     }
11
12     public 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     public 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     public 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   // -------------------------------------------------------------------------------------------
82   //                                                                       class mw_data_upgrade
83   //
84
85   class mw_data_upgrade{
86
87     public $application_name;
88     public $versions;
89     public $env;
90
91     public function __construct($env, $application_name){
92       $this->env = $env;
93       $this->application_name = $application_name;
94     }
95
96     public function env(){
97       return isset($this->env) ? $this->env : false;
98     }
99
100     public function load_versions($versions_dir){
101       if($dh = opendir($versions_dir)){
102         $versions_dir .= $versions_dir && substr($versions_dir, -1) != "/" ? "/" : "";
103         while(($file = readdir($dh)) !== false){
104           if(
105                substr($file, 0, 1) != "."
106             && !is_dir($versions_dir.$file)
107             && strcmp(substr($file, -4), ".php") == 0
108           ) $this->load_version($versions_dir, $file);
109         }
110         closedir($dh);
111       }
112       else return false;
113       return true;
114     }
115
116     public function load_version($versions_dir, $version_file){
117       if(
118            !$version_file
119         || !file_exists($versions_dir.$version_file)
120         || (substr($version_file, 0, 1) == ".")
121         || is_dir($versions_dir.$version_file)
122         || (substr($version_file, -4) != ".php")
123       ) return false;
124       $class_name = substr($version_file, 0, -4);
125       if(!class_exists($class_name)) require_once $versions_dir.$version_file;
126       if(!class_exists($class_name)) return false;
127       $version = new $class_name($this->env(), $this->application_name);
128       return $this->add_version($version);
129     }
130
131     public function add_version($version){
132       if(!$version->version()) return false;
133       if(!isset($this->versions)) $this->versions = array();
134       $tmp = array();
135       $INSERTED = false;
136       foreach($this->versions as $_version){
137         if(version_compare($version->version(), $_version->version()) == 0){
138           $INSERTED = true;
139         }
140         elseif(version_compare($version->version(), $_version->version()) < 0){
141           $tmp[] = $version;
142           $tmp[] = $_version;
143           $INSERTED = true;
144         }
145         else{
146           $tmp[] = $_version;
147         }
148       }
149       if(!$INSERTED) $tmp[] = $version;
150       $this->versions = $tmp;
151       return true;
152     }
153
154     public function upgrade_required(){
155       if(!isset($this->versions)) return false;
156       foreach($this->versions as $version){
157         if($version->upgrade_required()) return true;
158       }
159       return false;
160     }
161
162     public function do_upgrade(){
163       if(!isset($this->versions)) return true;
164       foreach($this->versions as $version){
165         if($version->upgrade_required() && ($res = $version->do_upgrade()) !== true){
166           return $res." (dans ".get_class($version).")";
167         }
168         if(!$version->set_data_version()){
169           return "impossible de mettre a jour la version des donnees pour ".$this->application_name." ".$version->version();
170         }
171       }
172       return true;
173     }
174
175   }
176
177   // -------------------------------------------------------------------------------------------
178   //                                                                       class mw_data_version
179   //
180
181   abstract class mw_data_version{
182
183     public $env;
184     public $application_name;
185
186     public function __construct($env, $application_name){
187       $this->env = $env;
188       $this->application_name = $application_name;
189     }
190
191     public function version(){
192       return false;
193     }
194
195     public function application_name(){
196       return $this->application_name;
197     }
198
199     public function env(){
200       return isset($this->env) ? $this->env : false;
201     }
202
203     public function upgrade_required(){
204       if(!isset($this->application_name)) return false;
205       if(!$this->version()) return false;
206       $env = $this->env();
207       $data = $env->data();
208       if(!($data_version = $data->version($this->application_name))) return true;
209       return version_compare($data_version, $this->version()) < 0;
210     }
211
212     public function do_upgrade(){
213       return true;
214     }
215
216     public function set_data_version(){
217       if(!isset($this->application_name)) return false;
218       if(!$this->version()) return false;
219       $env = $this->env();
220       $data = $env->data();
221       return $data->set_version($this->application_name, $this->version());
222     }
223
224   }