implementation sgbd herite de mw_sgbd
[mtweb] / mw / env / sgbd / 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       $mw_xml_data_file = $this->env->path("mw_dir")."env/sgbd/xml/mw_xml_data.php";
40       $mw_xml_data_handler_file = $this->env->path("mw_dir")."env/sgbd/xml/mw_xml_data_handler.php";
41       if(
42             !file_exists($mw_xml_data_file)
43         ||  !file_exists($mw_xml_data_handler_file)
44       ){
45         return false;
46       }
47       if(!class_exists("mw_xml_data")) require_once $mw_xml_data_file;
48       if(!class_exists("mw_xml_data_handler")) require_once $mw_xml_data_handler_file;
49       if(
50             !class_exists("mw_xml_data")
51         ||  !class_exists("mw_xml_data_handler")
52       ){
53         return false;
54       }
55       $this->xml_data = new mw_xml_data($this->host, $this->base);
56       return true;
57     }
58
59     public function connect($host, $base, $user, $password){
60       if($host.$base && is_dir($host.$base) && is_writable($host.$base)){
61         $this->xml_data = new mw_xml_data($this->host, $this->base);
62         return true;
63       }
64       return null;
65     }
66
67     public function select_db($base){
68       $this->base = $base.($base && substr($base, -1) != "/" ? "/" : "");
69       return $this->connect($this->host, $this->base, $this->user, $this->password);
70     }
71
72     public function data_exists($data_path){
73       return is_dir($this->host.$this->base.$data_path);
74     }
75
76     public function create_data($data_path){
77       if(!is_dir($this->host.$this->base.$data_path)) @mkdir($this->host.$this->base.$data_path);
78       if(is_dir($this->host.$this->base.$data_path)){
79         if($dh = $this->open_data($data_path, false)){
80           $this->close_data($dh);
81           return true;
82         }
83       }
84       return null;
85     }
86
87     public function get_data($data_path, $data_id){
88       $dh = ++$this->last_data_handler;
89       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
90       if($this->data_handlers[$dh]->open_data(false)){
91         $res = $this->data_handlers[$dh]->get_data($data_id);
92         $this->close_data($dh);
93         return $res;
94       }
95       return null;
96     }
97
98     public function open_data($data_path, $FETCH = true){
99       $dh = ++$this->last_data_handler;
100       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
101       if($this->data_handlers[$dh]->open_data($FETCH)){
102         return $dh;
103       }
104       $this->close_data($dh);
105       return null;
106     }
107
108     public function fetch_data($dh){
109       if(isset($this->data_handlers[$dh])){
110         return $this->data_handlers[$dh]->fetch_assoc();
111       }
112       return false;
113     }
114
115     public function add_data($data_path, $data, $index = null){
116       $dh = ++$this->last_data_handler;
117       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
118       if($this->data_handlers[$dh]->open_data(false)){
119         $res = $this->data_handlers[$dh]->add_data($data, $index);
120         if($res) $res = $this->last_index($dh);
121         $this->close_data($dh);
122         return $res;
123       }
124       return null;
125     }
126
127     public function last_index($dh){
128       if(isset($this->data_handlers[$dh])){
129         return $this->data_handlers[$dh]->last_index;
130       }
131       return null;
132     }
133
134     public function set_data($data_path, $data_id, $data){
135       $dh = ++$this->last_data_handler;
136       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
137       if($this->data_handlers[$dh]->open_data(false)){
138         $res = $this->data_handlers[$dh]->set_data($data_id.".xml", $data);
139         $this->close_data($dh);
140         return $res;
141       }
142       return null;
143     }
144
145     public function del_data($data_path, $data_id){
146       $dh = ++$this->last_data_handler;
147       $this->data_handlers[$dh] = new mw_xml_data_handler($this->xml_data, $data_path);
148       if($this->data_handlers[$dh]->open_data(false)){
149         $res = $this->data_handlers[$dh]->del_data($data_id.".xml");
150         $this->close_data($dh);
151         return $res;
152       }
153       return null;
154     }
155
156     public function close_data($dh){
157       if(isset($this->data_handlers[$dh])){
158         $this->data_handlers[$dh]->close_data();
159         unset($this->data_handlers[$dh]);
160       }
161     }
162
163     public function remove_data($data_path){
164       $OK = strlen($data_path) > 0;
165       if($OK && is_dir($this->host.$this->base.$data_path) && is_writable($this->host.$this->base.$data_path)){
166         $data_path .= substr($data_path, -1) == "/" ? "" : "/";
167         if($dh = opendir($this->host.$this->base.$data_path)){
168           while($OK && ($file = readdir($dh)) !== false){
169             if(is_dir($this->host.$this->base.$data_path.$file)){
170               if($file != "." && $file != "..") $OK = $this->remove_data($data_path.$file);
171             }
172             else $OK = @unlink($this->host.$this->base.$data_path.$file);
173           }
174           closedir($dh);
175         }
176         else $OK = null;
177       }
178       else $OK = null;
179       if($OK) @rmdir($this->host.$this->base.$data_path);
180       return $OK;
181     }
182
183   }