OSDN Git Service

PKWK_READONLY prohibits writing
[pukiwiki/pukiwiki.git] / lib / backup.php
1 <?php
2 /**
3  *
4  * PukiWiki - Yet another WikiWikiWeb clone.
5  *
6  * backup.php
7  *
8  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò´ÉÍý¤¹¤ë
9  *
10  * @package org.pukiwiki
11  * @access  public
12  * @author
13  * @create
14  * @version $Id: backup.php,v 1.5 2004/10/30 07:42:49 henoheno Exp $
15  **/
16
17 /**
18  * make_backup
19  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºîÀ®¤¹¤ë
20  *
21  * @access    public
22  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
23  * @param     Boolean   $delete      TRUE:¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºï½ü¤¹¤ë
24  *
25  * @return    Void
26  */
27 function make_backup($page, $delete = FALSE)
28 {
29         global $cycle, $maxage;
30         global $do_backup, $del_backup;
31
32         if (! $do_backup) return;
33
34         if ($del_backup && $delete) {
35                 _backup_delete($page);
36                 return;
37         }
38
39         if (! is_page($page)) return;
40
41         $lastmod = _backup_get_filetime($page);
42         if ($lastmod == 0 || UTIME - $lastmod > 60 * 60 * $cycle)
43         {
44                 $backups = get_backup($page);
45                 $count   = count($backups) + 1;
46
47                 // Ä¾¸å¤Ë1·ïÄɲ乤ë¤Î¤Ç¡¢(ºÇÂç·ï¿ô - 1)¤òĶ¤¨¤ëÍ×ÁǤò¼Î¤Æ¤ë
48                 if ($count > $maxage)
49                         array_splice($backups, 0, $count - $maxage);
50
51                 $strout = '';
52                 foreach($backups as $age=>$data) {
53                         $strout .= PKWK_SPLITTER . ' ' . $data['time'] . "\n"; // Splitter format
54                         $strout .= join('', $data['data']);
55                 }
56                 $strout = preg_replace("/([^\n])\n*$/", "$1\n", $strout);
57
58                 // Escape 'lines equal to PKWK_SPLITTER', by inserting a space
59                 $body = preg_replace('/^(' . preg_quote(PKWK_SPLITTER) . "\s\d+)$/", '$1 ', get_source($page));
60                 $body = PKWK_SPLITTER . ' ' . get_filetime($page) . "\n" . join('', $body);
61                 $body = preg_replace("/\n*$/", "\n", $body);
62
63                 $fp = _backup_fopen($page, 'wb')
64                         or die_message('cannot write file ' . htmlspecialchars($realfilename) .
65                         '<br />maybe permission is not writable or filename is too long');
66                 _backup_fputs($fp, $strout);
67                 _backup_fputs($fp, $body);
68                 _backup_fclose($fp);
69         }
70 }
71
72 /**
73  * get_backup
74  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼èÆÀ¤¹¤ë
75  * $age = 0¤Þ¤¿¤Ï¾Êά : Á´¤Æ¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¡¼¥¿¤òÇÛÎó¤Ç¼èÆÀ¤¹¤ë
76  * $age > 0           : »ØÄꤷ¤¿À¤Âå¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¡¼¥¿¤ò¼èÆÀ¤¹¤ë
77  *
78  * @access    public
79  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
80  * @param     Integer   $age         ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÀ¤ÂåÈֹ栾Êά»þ¤ÏÁ´¤Æ
81  *
82  * @return    String    ¥Ð¥Ã¥¯¥¢¥Ã¥×       ($age != 0)
83  *            Array     ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÇÛÎó ($age == 0)
84  */
85 function get_backup($page, $age = 0)
86 {
87         $lines = _backup_file($page);
88         if (! is_array($lines)) return array();
89
90         $_age = 0;
91         $retvars = $match = array();
92         $regex_splitter = '/^' . preg_quote(PKWK_SPLITTER) . '\s(\d+)$/';
93         foreach($lines as $line) {
94                 if (preg_match($regex_splitter, $line, $match)) {
95                         ++$_age;
96                         if ($age > 0 && $_age > $age)
97                                 return $retvars[$age];
98
99                         $retvars[$_age] = array('time'=>$match[1], 'data'=>array());
100                 } else {
101                         $retvars[$_age]['data'][] = $line;
102                 }
103         }
104
105         return $retvars;
106 }
107
108 /**
109  * _backup_get_filename
110  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ¤¹¤ë
111  *
112  * @access    private
113  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
114  *
115  * @return    String    ¥Ð¥Ã¥¯¥¢¥Ã¥×¤Î¥Õ¥¡¥¤¥ë̾
116  */
117 function _backup_get_filename($page)
118 {
119         return BACKUP_DIR . encode($page) . BACKUP_EXT;
120 }
121
122 /**
123  * _backup_file_exists
124  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¤«
125  *
126  * @access    private
127  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
128  *
129  * @return    Boolean   TRUE:¤¢¤ë FALSE:¤Ê¤¤
130  */
131 function _backup_file_exists($page)
132 {
133         return file_exists(_backup_get_filename($page));
134 }
135
136 /**
137  * _backup_get_filetime
138  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤òÆÀ¤ë
139  *
140  * @access    private
141  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
142  *
143  * @return    Integer   ¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï(GMT)
144  */
145
146 function _backup_get_filetime($page)
147 {
148         return _backup_file_exists($page) ?
149                 filemtime(_backup_get_filename($page)) - LOCALZONE : 0;
150 }
151
152 /**
153  * _backup_delete
154  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë
155  *
156  * @access    private
157  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
158  *
159  * @return    Boolean   FALSE:¼ºÇÔ
160  */
161 function _backup_delete($page)
162 {
163         return unlink(_backup_get_filename($page));
164 }
165
166 /////////////////////////////////////////////////
167
168 if (extension_loaded('zlib')) {
169         // ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à´Ø¿ô
170         // zlib´Ø¿ô¤ò»ÈÍÑ
171         define('BACKUP_EXT', '.gz');
172
173 /**
174  * _backup_fopen
175  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò³«¤¯
176  *
177  * @access    private
178  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
179  * @param     String    $mode        ¥â¡¼¥É
180  *
181  * @return    Boolean   FALSE:¼ºÇÔ
182  */
183         function _backup_fopen($page, $mode)
184         {
185                 return gzopen(_backup_get_filename($page), $mode);
186         }
187
188 /**
189  * _backup_fputs
190  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤à
191  *
192  * @access    private
193  * @param     Integer   $zp          ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
194  * @param     String    $str         Ê¸»úÎó
195  *
196  * @return    Boolean   FALSE:¼ºÇÔ ¤½¤Î¾:½ñ¤­¹þ¤ó¤À¥Ð¥¤¥È¿ô
197  */
198         function _backup_fputs($zp, $str)
199         {
200                 return gzputs($zp, $str);
201         }
202
203 /**
204  * _backup_fclose
205  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
206  *
207  * @access    private
208  * @param     Integer   $zp          ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
209  *
210  * @return    Boolean   FALSE:¼ºÇÔ
211  */
212         function _backup_fclose($zp)
213         {
214                 return gzclose($zp);
215         }
216
217 /**
218  * _backup_file
219  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¼èÆÀ¤¹¤ë
220  *
221  * @access    private
222  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
223  *
224  * @return    Array     ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ
225  */
226         function _backup_file($page)
227         {
228                 return _backup_file_exists($page) ?
229                         gzfile(_backup_get_filename($page)) :
230                         array();
231         }
232 }
233 /////////////////////////////////////////////////
234 else
235 {
236         // ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à´Ø¿ô
237         define('BACKUP_EXT', '.txt');
238
239 /**
240  * _backup_fopen
241  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò³«¤¯
242  *
243  * @access    private
244  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
245  * @param     String    $mode        ¥â¡¼¥É
246  *
247  * @return    Boolean   FALSE:¼ºÇÔ
248  */
249         function _backup_fopen($page, $mode)
250         {
251                 return fopen(_backup_get_filename($page), $mode);
252         }
253
254 /**
255  * _backup_fputs
256  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤à
257  *
258  * @access    private
259  * @param     Integer   $zp          ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
260  * @param     String    $str         Ê¸»úÎó
261  *
262  * @return    Boolean   FALSE:¼ºÇÔ ¤½¤Î¾:½ñ¤­¹þ¤ó¤À¥Ð¥¤¥È¿ô
263  */
264         function _backup_fputs($zp, $str)
265         {
266                 return fputs($zp, $str);
267         }
268
269 /**
270  * _backup_fclose
271  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
272  *
273  * @access    private
274  * @param     Integer   $zp          ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
275  *
276  * @return    Boolean   FALSE:¼ºÇÔ
277  */
278         function _backup_fclose($zp)
279         {
280                 return fclose($zp);
281         }
282
283 /**
284  * _backup_file
285  * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¼èÆÀ¤¹¤ë
286  *
287  * @access    private
288  * @param     String    $page        ¥Ú¡¼¥¸Ì¾
289  *
290  * @return    Array     ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ
291  */
292         function _backup_file($page)
293         {
294                 return _backup_file_exists($page) ?
295                         file(_backup_get_filename($page)) :
296                         array();
297         }
298 }
299 ?>