8a3f0c19266269507b851ecc0b0720025d91f846
[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
7     function init_data_upgrades(){
8       $data_upgrade = new mw_data_upgrade($this);
9       $impl_dir = ($this->bdd("sgbd") == "xml" ? "xml" : "sql")."/";
10       $versions_dir = $this->path("mw_dir")."app/data/upgrades/".$impl_dir;
11       if(!is_dir($versions_dir)){
12         return false;
13       }
14       if(!$data_upgrade->load_versions("mtweb", $versions_dir)){
15         return false;
16       }
17       if(!isset($this->data_upgrades)) $this->data_upgrades = array();
18       $this->data_upgrades[] = $data_upgrade;
19       return true;
20     }
21
22     function data_upgrade_required(){
23       if(!isset($this->data_upgrades)) return false;
24       foreach($this->data_upgrades as $data_upgrade){
25         if($data_upgrade->upgrade_required()){
26           return true;
27         }
28       }
29       return false;
30     }
31
32     function do_data_upgrade(){
33       if(!isset($this->data_upgrades)) return false;
34       foreach($this->data_upgrades as $data_upgrade){
35         if($data_upgrade->upgrade_required() && ($res = $data_upgrade->do_upgrade()) !== true){
36           return $res;
37         }
38       }
39       return true;
40     }
41
42   }
43
44   class mw_data_upgrade{
45
46     var $versions;
47     var $env;
48
49     function mw_data_upgrade($env){
50       $this->env = $env;
51     }
52
53     function env(){
54       return isset($this->env) ? $this->env : false;
55     }
56
57     function load_versions($application_name, $versions_dir){
58       if($dh = opendir($versions_dir)){
59         $versions_dir .= $versions_dir && substr($versions_dir, -1) != "/" ? "/" : "";
60         while(($file = readdir($dh)) !== false){
61           if(
62                substr($file, 0, 1) != "."
63             && !is_dir($versions_dir.$file)
64             && strcmp(substr($file, -4), ".php") == 0
65           ) $this->load_version($application_name, $versions_dir, $file);
66         }
67         closedir($dh);
68       }
69       else return false;
70       return true;
71     }
72
73     function load_version($application_name, $versions_dir, $version_file){
74       if(
75            !$version_file
76         || !file_exists($versions_dir.$version_file)
77         || (substr($version_file, 0, 1) == ".")
78         || is_dir($versions_dir.$version_file)
79         || (substr($version_file, -4) != ".php")
80       ) return false;
81       $class_name = substr($version_file, 0, -4);
82       if(!class_exists($class_name)) require_once $versions_dir.$version_file;
83       if(!class_exists($class_name)) return false;
84       $version = new $class_name($this->env(), $application_name);
85       return $this->add_version($version);
86     }
87
88     function add_version($version){
89       if(!$version->version()) return false;
90       if(!isset($this->versions)) $this->versions = array();
91       $tmp = array();
92       $INSERTED = false;
93       foreach($this->versions as $_version){
94         if(version_compare($version->version(), $_version->version()) == 0){
95           $INSERTED = true;
96         }
97         elseif(version_compare($version->version(), $_version->version()) < 0){
98           $tmp[] = $version;
99           $tmp[] = $_version;
100           $INSERTED = true;
101         }
102         else{
103           $tmp[] = $_version;
104         }
105       }
106       if(!$INSERTED) $tmp[] = $version;
107       $this->versions = $tmp;
108       return true;
109     }
110
111     function upgrade_required(){
112       if(!isset($this->versions)) return false;
113       foreach($this->versions as $version_number => $version){
114         if($version->upgrade_required()) return true;
115       }
116       return false;
117     }
118
119     function do_upgrade(){
120       if(!isset($this->versions)) return true;
121       foreach($this->versions as $version_number => $version){
122         if($version->upgrade_required() && ($res = $version->do_upgrade()) !== true){
123           return $res;
124         }
125       }
126       return true;
127     }
128
129   }
130
131   class mw_data_version{
132
133     var $env;
134     var $application_name;
135
136     function version(){
137       return false;
138     }
139
140     function mw_data_version($env, $application_name){
141       $this->env = $env;
142       $this->application_name = $application_name;
143     }
144
145     function env(){
146       return isset($this->env) ? $this->env : false;
147     }
148
149     function upgrade_required(){
150       if(!isset($this->application_name)) return false;
151       $env = $this->env();
152       $data = $env->data();
153       if(!($env_version = $env->version($this->application_name))) return false;
154       if(!($data_version = $data->version($this->application_name))) return true;
155       return version_compare($data_version, $env_version) < 0;
156     }
157
158     function do_upgrade(){
159       return true;
160     }
161
162   }