4 * PukiWiki - Yet another WikiWikiWeb clone.
8 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò´ÉÍý¤¹¤ë
10 * @package org.pukiwiki
14 * @version $Id: backup.php,v 1.12 2006/02/02 13:27:57 henoheno Exp $
16 * 2002-2006 PukiWiki Developers Team
17 * 2001-2002 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']);
60 unset($backups[$age]);
62 $strout = preg_replace("/([^\n])\n*$/", "$1\n", $strout);
64 // Escape 'lines equal to PKWK_SPLITTER', by inserting a space
65 $body = preg_replace('/^(' . preg_quote(PKWK_SPLITTER) . "\s\d+)$/", '$1 ', get_source($page));
66 $body = PKWK_SPLITTER . ' ' . get_filetime($page) . "\n" . join('', $body);
67 $body = preg_replace("/\n*$/", "\n", $body);
69 $fp = _backup_fopen($page, 'wb')
70 or die_message('Cannot open ' . htmlspecialchars(_backup_get_filename($page)) .
71 '<br />Maybe permission is not writable or filename is too long');
72 _backup_fputs($fp, $strout);
73 _backup_fputs($fp, $body);
80 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼èÆÀ¤¹¤ë
81 * $age = 0¤Þ¤¿¤Ï¾Êά : Á´¤Æ¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¡¼¥¿¤òÇÛÎó¤Ç¼èÆÀ¤¹¤ë
82 * $age > 0 : »ØÄꤷ¤¿À¤Âå¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¡¼¥¿¤ò¼èÆÀ¤¹¤ë
85 * @param String $page ¥Ú¡¼¥¸Ì¾
86 * @param Integer $age ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÀ¤ÂåÈÖ¹æ ¾Êά»þ¤ÏÁ´¤Æ
88 * @return String ¥Ð¥Ã¥¯¥¢¥Ã¥× ($age != 0)
89 * Array ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÇÛÎó ($age == 0)
91 function get_backup($page, $age = 0)
93 $lines = _backup_file($page);
94 if (! is_array($lines)) return array();
97 $retvars = $match = array();
98 $regex_splitter = '/^' . preg_quote(PKWK_SPLITTER) . '\s(\d+)$/';
99 foreach($lines as $index => $line) {
100 if (preg_match($regex_splitter, $line, $match)) {
101 // A splitter, tells new data of backup will come
103 if ($age > 0 && $_age > $age)
104 return $retvars[$age];
107 $retvars[$_age] = array('time'=>$match[1], 'data'=>array());
109 // The first ... the last line of the data
110 $retvars[$_age]['data'][] = $line;
112 unset($lines[$index]);
119 * _backup_get_filename
120 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ¤¹¤ë
123 * @param String $page ¥Ú¡¼¥¸Ì¾
125 * @return String ¥Ð¥Ã¥¯¥¢¥Ã¥×¤Î¥Õ¥¡¥¤¥ë̾
127 function _backup_get_filename($page)
129 return BACKUP_DIR . encode($page) . BACKUP_EXT;
133 * _backup_file_exists
134 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¤«
137 * @param String $page ¥Ú¡¼¥¸Ì¾
139 * @return Boolean TRUE:¤¢¤ë FALSE:¤Ê¤¤
141 function _backup_file_exists($page)
143 return file_exists(_backup_get_filename($page));
147 * _backup_get_filetime
148 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤òÆÀ¤ë
151 * @param String $page ¥Ú¡¼¥¸Ì¾
153 * @return Integer ¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï(GMT)
156 function _backup_get_filetime($page)
158 return _backup_file_exists($page) ?
159 filemtime(_backup_get_filename($page)) - LOCALZONE : 0;
164 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë
167 * @param String $page ¥Ú¡¼¥¸Ì¾
169 * @return Boolean FALSE:¼ºÇÔ
171 function _backup_delete($page)
173 return unlink(_backup_get_filename($page));
176 /////////////////////////////////////////////////
178 if (extension_loaded('zlib')) {
179 // ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à´Ø¿ô
181 define('BACKUP_EXT', '.gz');
185 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò³«¤¯
188 * @param String $page ¥Ú¡¼¥¸Ì¾
189 * @param String $mode ¥â¡¼¥É
191 * @return Boolean FALSE:¼ºÇÔ
193 function _backup_fopen($page, $mode)
195 return gzopen(_backup_get_filename($page), $mode);
200 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë½ñ¤¹þ¤à
203 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
204 * @param String $str ʸ»úÎó
206 * @return Boolean FALSE:¼ºÇÔ ¤½¤Î¾:½ñ¤¹þ¤ó¤À¥Ð¥¤¥È¿ô
208 function _backup_fputs($zp, $str)
210 return gzputs($zp, $str);
215 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
218 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
220 * @return Boolean FALSE:¼ºÇÔ
222 function _backup_fclose($zp)
229 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¼èÆÀ¤¹¤ë
232 * @param String $page ¥Ú¡¼¥¸Ì¾
234 * @return Array ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ
236 function _backup_file($page)
238 return _backup_file_exists($page) ?
239 gzfile(_backup_get_filename($page)) :
243 /////////////////////////////////////////////////
246 // ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à´Ø¿ô
247 define('BACKUP_EXT', '.txt');
251 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò³«¤¯
254 * @param String $page ¥Ú¡¼¥¸Ì¾
255 * @param String $mode ¥â¡¼¥É
257 * @return Boolean FALSE:¼ºÇÔ
259 function _backup_fopen($page, $mode)
261 return fopen(_backup_get_filename($page), $mode);
266 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë½ñ¤¹þ¤à
269 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
270 * @param String $str ʸ»úÎó
272 * @return Boolean FALSE:¼ºÇÔ ¤½¤Î¾:½ñ¤¹þ¤ó¤À¥Ð¥¤¥È¿ô
274 function _backup_fputs($zp, $str)
276 return fputs($zp, $str);
281 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
284 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
286 * @return Boolean FALSE:¼ºÇÔ
288 function _backup_fclose($zp)
295 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¼èÆÀ¤¹¤ë
298 * @param String $page ¥Ú¡¼¥¸Ì¾
300 * @return Array ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ
302 function _backup_file($page)
304 return _backup_file_exists($page) ?
305 file(_backup_get_filename($page)) :