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