335e9741bcb60e2f952cb9af25da7e8d6590c924
[mtweb] / mw / app / data / impl / mw_xml.php
1 <?php
2
3   class mw_xml{
4
5     var $host;
6     var $base;
7     var $user;
8     var $password;
9
10     var $EXTENTION_OK;
11
12     var $xml_data;
13
14     var $data_handlers;
15     var $last_data_handler;
16
17     function mw_xml($params = array()){
18       $this->init_xml_env(
19         isset($params["host"]) ? $params["host"] : "content/data/xml",
20         isset($params["base"]) ? $params["base"] : "mw",
21         isset($params["user"]) ? $params["user"] : "",
22         isset($params["password"]) ? $params["password"] : ""
23       );
24       $this->EXTENTION_OK = true;
25     }
26
27     function extention_ok(&$env){
28       if($this->EXTENTION_OK){
29         if(
30              file_exists($env->app_file("data/impl/xml/mw_xml_data.php"))
31           && file_exists($env->app_file("data/impl/xml/mw_xml_data_handler.php"))
32         ){
33           if(!class_exists("mw_xml_data")) require_once $env->app_file("data/impl/xml/mw_xml_data.php");
34           if(!class_exists("mw_xml_data_handler")) require_once $env->app_file("data/impl/xml/mw_xml_data_handler.php");
35           if(
36                class_exists("mw_xml_data")
37             && class_exists("mw_xml_data_handler")
38           ){
39             $this->xml_data = new mw_xml_data($this->host, $this->base);
40           }
41           else $this->EXTENTION_OK = false;
42         }
43         else $this->EXTENTION_OK = false;
44       }
45       return $this->EXTENTION_OK;
46     }
47
48     function authentication_required() { return false; }
49
50     function sgbd_name() { return "XML"; }
51
52     function init_xml_env($host, $base, $user, $password){
53       $this->host = $host.($host && substr($host, -1) != "/" ? "/" : "");
54       $this->base = $base.($base && substr($base, -1) != "/" ? "/" : "");
55       $this->user = $user;
56       $this->password = $password;
57       $this->data_handlers = array();
58       $this->last_data_handler = 0;
59     }
60
61     function connect($host, $base, $user, $password){
62       if($host.$base && is_dir($host.$base) && is_writable($host.$base)){
63         $this->init_xml_env($host, $base, $user, $password);
64         $this->xml_data = new mw_xml_data($this->host, $this->base);
65         return true;
66       }
67       return null;
68     }
69
70     function select_db($base){
71       $this->base = $base.($base && substr($base, -1) != "/" ? "/" : "");
72       return $this->connect($this->host, $this->base, $this->user, $this->password);
73     }
74
75     function data_exists($data_path){
76       return is_dir($this->host.$this->base.$data_path);
77     }
78
79     function create_data($data_path){
80       if(!is_dir($this->host.$this->base.$data_path)) @mkdir($this->host.$this->base.$data_path);
81       if(is_dir($this->host.$this->base.$data_path)){
82         if($dh = $this->open_data($data_path, false)){
83           $this->close_data($dh);
84           return true;
85         }
86       }
87       return null;
88     }
89
90     function get_data($data_path, $data_id){
91       $dh = ++$this->last_data_handler;
92       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
93       if($this->data_handlers[$dh]->open_data(false)){
94         $res = $this->data_handlers[$dh]->get_data($data_id);
95         $this->close_data($dh);
96         return $res;
97       }
98       return null;
99     }
100
101     function open_data($data_path, $FETCH = true){
102       $dh = ++$this->last_data_handler;
103       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
104       if($this->data_handlers[$dh]->open_data($FETCH)){
105         return $dh;
106       }
107       $this->close_data($dh);
108       return null;
109     }
110
111     function fetch_data($dh){
112       if(isset($this->data_handlers[$dh])){
113         return $this->data_handlers[$dh]->fetch_assoc();
114       }
115       return false;
116     }
117
118     function add_data($data_path, $data, $index = null){
119       $dh = ++$this->last_data_handler;
120       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
121       if($this->data_handlers[$dh]->open_data(false)){
122         $res = $this->data_handlers[$dh]->add_data($data, $index);
123         if($res) $res = $this->last_index($dh);
124         $this->close_data($dh);
125         return $res;
126       }
127       return null;
128     }
129
130     function last_index($dh){
131       if(isset($this->data_handlers[$dh])){
132         return $this->data_handlers[$dh]->last_index;
133       }
134       return null;
135     }
136
137     function set_data($data_path, $data_id, $data){
138       $dh = ++$this->last_data_handler;
139       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
140       if($this->data_handlers[$dh]->open_data(false)){
141         $res = $this->data_handlers[$dh]->set_data($data_id.".xml", $data);
142         $this->close_data($dh);
143         return $res;
144       }
145       return null;
146     }
147
148     function del_data($data_path, $data_id){
149       $dh = ++$this->last_data_handler;
150       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
151       if($this->data_handlers[$dh]->open_data(false)){
152         $res = $this->data_handlers[$dh]->del_data($data_id.".xml");
153         $this->close_data($dh);
154         return $res;
155       }
156       return null;
157     }
158
159     function close_data($dh){
160       if(isset($this->data_handlers[$dh])){
161         $this->data_handlers[$dh]->close_data();
162         unset($this->data_handlers[$dh]);
163       }
164     }
165
166     function remove_data($data_path){
167       $OK = strlen($data_path) > 0;
168       if($OK && is_dir($this->host.$this->base.$data_path) && is_writable($this->host.$this->base.$data_path)){
169         $data_path .= substr($data_path, -1) == "/" ? "" : "/";
170         if($dh = opendir($this->host.$this->base.$data_path)){
171           while($OK && ($file = readdir($dh)) !== false){
172             if(is_dir($this->host.$this->base.$data_path.$file)){
173               if($file != "." && $file != "..") $OK = $this->remove_data($data_path.$file);
174             }
175             else $OK = @unlink($this->host.$this->base.$data_path.$file);
176           }
177           closedir($dh);
178         }
179         else $OK = null;
180       }
181       else $OK = null;
182       if($OK) @rmdir($this->host.$this->base.$data_path);
183       return $OK;
184     }
185
186   }
187
188 ?>