import mtweb.0.4.1
[mtweb] / web / app / data / impl / xml / mw_xml_data_handler.php
1 <?php
2
3   class mw_xml_data_handler
4   {
5     var $xml_data;
6     var $data_path;
7     var $data_path_handler;
8     var $last_index;
9
10     function mw_xml_data_handler($xml_data, $data_path)
11     { $this->xml_data = $xml_data;
12       $this->data_path = $data_path.(substr($data_path, -1) != "/" ? "/" : "");
13     }
14
15     function get_data($data_id)
16     { if(file_exists($this->xml_data->host().$this->xml_data->base().$this->data_path.$data_id.".xml"))
17       { return $this->xml_data->get_data($this->data_path, $data_id);
18       }
19       return false;
20     }
21
22     function open_data($FETCH = true)
23     { clearstatcache();
24       $INDEX_OK = false;
25       if($this->xml_data->host() && $this->xml_data->base() && $this->data_path)
26       { if(is_dir($this->xml_data->host().$this->xml_data->base().$this->data_path) && is_writable($this->xml_data->host().$this->xml_data->base().$this->data_path))
27         { if(!file_exists($this->xml_data->host().$this->xml_data->base().$this->data_path.".index"))
28           { if($fh = @fopen($this->xml_data->host().$this->xml_data->base().$this->data_path.".index", "w+"))
29             { if(@fwrite($fh, "0"))
30               { $this->last_index = 0;
31                 @fclose($fh);
32                 $INDEX_OK = true;
33               }
34               else @fclose($fh);
35             }
36           }
37           else
38           { if(($this->buffer = @file_get_contents($this->xml_data->host().$this->xml_data->base().$this->data_path.".index")) !== false)
39             { if(preg_match("/^[0-9]+$/", $this->buffer))
40               { $this->last_index = (int)$this->buffer;
41                 $INDEX_OK = true;
42               }
43             }
44           }
45         }
46       }
47       if($INDEX_OK)
48       { if($FETCH)
49         { if($this->data_path_handler = @opendir($this->xml_data->host().$this->xml_data->base().$this->data_path))
50           { return true;
51           }
52           else
53           { $this->close_data();
54             return null;
55           }
56         }
57         else return true;
58       }
59       else
60       { $this->close_data();
61         return null;
62       }
63     }
64
65     function fetch_assoc()
66     { if($this->data_path_handler)
67       { $FORMAT_OK = false;
68         while(!$FORMAT_OK && ($data_file = @readdir($this->data_path_handler)) !== false)
69         { if(substr($data_file, 0, 1) != "." && substr($data_file, -4) == ".xml") $FORMAT_OK = true;
70         }
71         if($FORMAT_OK) return $this->xml_data->get_data($this->data_path, substr($data_file, 0, -4));
72       }
73       return false;
74     }
75
76     function add_data($data)
77     { $index = $this->inc_index();
78       if(isset($index))
79       { if(is_array($data)) return $this->xml_data->add_data($this->data_path, $index, $data);
80       }
81       return null;
82     }
83
84     function inc_index()
85     { clearstatcache();
86       if(isset($this->last_index))
87       { $index = $this->last_index + 1;
88         if($fh = @fopen($this->xml_data->host().$this->xml_data->base().$this->data_path.".index", "w+"))
89         { if(@fwrite($fh, (string)$index))
90           { $this->last_index = $index;
91             @fclose($fh);
92             return $index;
93           }
94           else @fclose($fh);
95         }
96       }
97       return null;
98     }
99
100     function set_data($data_file, $data)
101     { if(preg_match("/^[0-9]+\.xml$/", $data_file))
102       { if(is_writable($this->xml_data->host().$this->xml_data->base().$this->data_path.$data_file))
103         { if(is_array($data))
104           { return $this->xml_data->set_data($this->data_path, substr($data_file, 0, -4), $data);
105           }
106         }
107       }
108       return null;
109     }
110
111     function del_data($data_file)
112     { if(preg_match("/^[0-9]+\.xml$/", $data_file))
113       { if(is_file($this->xml_data->host().$this->xml_data->base().$this->data_path.$data_file))
114         { return $this->xml_data->del_data($this->data_path, substr($data_file, 0, -4));
115         }
116       }
117       return null;
118     }
119
120     function close_data()
121     { $this->data_path= null;
122       if($this->data_path_handler) @closedir($this->data_path_handler);
123       $this->last_index = null;
124     }
125
126   }
127
128 ?>