4 * PukiWiki - Yet another WikiWikiWeb clone.
8 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò´ÉÍý¤¹¤ë
10 * @package org.pukiwiki
14 * @version $Id: backup.php,v 1.7 2005/04/29 09:10:11 henoheno Exp $
16 * 2002-2005 PukiWiki Developers Team
17 * 2001 Originally written by yu-ji
18 * License: GPL v2 or (at your option) any later version
23 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºîÀ®¤¹¤ë
26 * @param String $page ¥Ú¡¼¥¸Ì¾
27 * @param Boolean $delete TRUE:¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºï½ü¤¹¤ë
32 function make_backup($page, $delete = FALSE)
34 global $cycle, $maxage;
35 global $do_backup, $del_backup;
37 if (PKWK_READONLY || ! $do_backup) return;
39 if ($del_backup && $delete) {
40 _backup_delete($page);
44 if (! is_page($page)) return;
46 $lastmod = _backup_get_filetime($page);
47 if ($lastmod == 0 || UTIME - $lastmod > 60 * 60 * $cycle)
49 $backups = get_backup($page);
50 $count = count($backups) + 1;
52 // ľ¸å¤Ë1·ïÄɲ乤ë¤Î¤Ç¡¢(ºÇÂç·ï¿ô - 1)¤òĶ¤¨¤ëÍ×ÁǤò¼Î¤Æ¤ë
54 array_splice($backups, 0, $count - $maxage);
57 foreach($backups as $age=>$data) {
58 $strout .= PKWK_SPLITTER . ' ' . $data['time'] . "\n"; // Splitter format
59 $strout .= join('', $data['data']);
61 $strout = preg_replace("/([^\n])\n*$/", "$1\n", $strout);
63 // Escape 'lines equal to PKWK_SPLITTER', by inserting a space
64 $body = preg_replace('/^(' . preg_quote(PKWK_SPLITTER) . "\s\d+)$/", '$1 ', get_source($page));
65 $body = PKWK_SPLITTER . ' ' . get_filetime($page) . "\n" . join('', $body);
66 $body = preg_replace("/\n*$/", "\n", $body);
68 $fp = _backup_fopen($page, 'wb')
69 or die_message('cannot write file ' . htmlspecialchars($realfilename) .
70 '<br />maybe permission is not writable or filename is too long');
71 _backup_fputs($fp, $strout);
72 _backup_fputs($fp, $body);
79 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼èÆÀ¤¹¤ë
80 * $age = 0¤Þ¤¿¤Ï¾Êά : Á´¤Æ¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¡¼¥¿¤òÇÛÎó¤Ç¼èÆÀ¤¹¤ë
81 * $age > 0 : »ØÄꤷ¤¿À¤Âå¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¡¼¥¿¤ò¼èÆÀ¤¹¤ë
84 * @param String $page ¥Ú¡¼¥¸Ì¾
85 * @param Integer $age ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÀ¤ÂåÈÖ¹æ ¾Êά»þ¤ÏÁ´¤Æ
87 * @return String ¥Ð¥Ã¥¯¥¢¥Ã¥× ($age != 0)
88 * Array ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÇÛÎó ($age == 0)
90 function get_backup($page, $age = 0)
92 $lines = _backup_file($page);
93 if (! is_array($lines)) return array();
96 $retvars = $match = array();
97 $regex_splitter = '/^' . preg_quote(PKWK_SPLITTER) . '\s(\d+)$/';
98 foreach($lines as $line) {
99 if (preg_match($regex_splitter, $line, $match)) {
101 if ($age > 0 && $_age > $age)
102 return $retvars[$age];
104 $retvars[$_age] = array('time'=>$match[1], 'data'=>array());
106 $retvars[$_age]['data'][] = $line;
114 * _backup_get_filename
115 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ¤¹¤ë
118 * @param String $page ¥Ú¡¼¥¸Ì¾
120 * @return String ¥Ð¥Ã¥¯¥¢¥Ã¥×¤Î¥Õ¥¡¥¤¥ë̾
122 function _backup_get_filename($page)
124 return BACKUP_DIR . encode($page) . BACKUP_EXT;
128 * _backup_file_exists
129 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¤«
132 * @param String $page ¥Ú¡¼¥¸Ì¾
134 * @return Boolean TRUE:¤¢¤ë FALSE:¤Ê¤¤
136 function _backup_file_exists($page)
138 return file_exists(_backup_get_filename($page));
142 * _backup_get_filetime
143 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤òÆÀ¤ë
146 * @param String $page ¥Ú¡¼¥¸Ì¾
148 * @return Integer ¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï(GMT)
151 function _backup_get_filetime($page)
153 return _backup_file_exists($page) ?
154 filemtime(_backup_get_filename($page)) - LOCALZONE : 0;
159 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë
162 * @param String $page ¥Ú¡¼¥¸Ì¾
164 * @return Boolean FALSE:¼ºÇÔ
166 function _backup_delete($page)
168 return unlink(_backup_get_filename($page));
171 /////////////////////////////////////////////////
173 if (extension_loaded('zlib')) {
174 // ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à´Ø¿ô
176 define('BACKUP_EXT', '.gz');
180 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò³«¤¯
183 * @param String $page ¥Ú¡¼¥¸Ì¾
184 * @param String $mode ¥â¡¼¥É
186 * @return Boolean FALSE:¼ºÇÔ
188 function _backup_fopen($page, $mode)
190 return gzopen(_backup_get_filename($page), $mode);
195 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë½ñ¤¹þ¤à
198 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
199 * @param String $str ʸ»úÎó
201 * @return Boolean FALSE:¼ºÇÔ ¤½¤Î¾:½ñ¤¹þ¤ó¤À¥Ð¥¤¥È¿ô
203 function _backup_fputs($zp, $str)
205 return gzputs($zp, $str);
210 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
213 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
215 * @return Boolean FALSE:¼ºÇÔ
217 function _backup_fclose($zp)
224 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¼èÆÀ¤¹¤ë
227 * @param String $page ¥Ú¡¼¥¸Ì¾
229 * @return Array ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ
231 function _backup_file($page)
233 return _backup_file_exists($page) ?
234 gzfile(_backup_get_filename($page)) :
238 /////////////////////////////////////////////////
241 // ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à´Ø¿ô
242 define('BACKUP_EXT', '.txt');
246 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò³«¤¯
249 * @param String $page ¥Ú¡¼¥¸Ì¾
250 * @param String $mode ¥â¡¼¥É
252 * @return Boolean FALSE:¼ºÇÔ
254 function _backup_fopen($page, $mode)
256 return fopen(_backup_get_filename($page), $mode);
261 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë½ñ¤¹þ¤à
264 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
265 * @param String $str ʸ»úÎó
267 * @return Boolean FALSE:¼ºÇÔ ¤½¤Î¾:½ñ¤¹þ¤ó¤À¥Ð¥¤¥È¿ô
269 function _backup_fputs($zp, $str)
271 return fputs($zp, $str);
276 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
279 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
281 * @return Boolean FALSE:¼ºÇÔ
283 function _backup_fclose($zp)
290 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¼èÆÀ¤¹¤ë
293 * @param String $page ¥Ú¡¼¥¸Ì¾
295 * @return Array ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ
297 function _backup_file($page)
299 return _backup_file_exists($page) ?
300 file(_backup_get_filename($page)) :