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