4 * PukiWiki - Yet another WikiWikiWeb clone.
8 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò´ÉÍý¤¹¤ë
10 * @package org.pukiwiki
14 * @version $Id: backup.php,v 1.5 2004/10/30 07:42:49 henoheno Exp $
19 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºîÀ®¤¹¤ë
22 * @param String $page ¥Ú¡¼¥¸Ì¾
23 * @param Boolean $delete TRUE:¥Ð¥Ã¥¯¥¢¥Ã¥×¤òºï½ü¤¹¤ë
27 function make_backup($page, $delete = FALSE)
29 global $cycle, $maxage;
30 global $do_backup, $del_backup;
32 if (! $do_backup) return;
34 if ($del_backup && $delete) {
35 _backup_delete($page);
39 if (! is_page($page)) return;
41 $lastmod = _backup_get_filetime($page);
42 if ($lastmod == 0 || UTIME - $lastmod > 60 * 60 * $cycle)
44 $backups = get_backup($page);
45 $count = count($backups) + 1;
47 // ľ¸å¤Ë1·ïÄɲ乤ë¤Î¤Ç¡¢(ºÇÂç·ï¿ô - 1)¤òĶ¤¨¤ëÍ×ÁǤò¼Î¤Æ¤ë
49 array_splice($backups, 0, $count - $maxage);
52 foreach($backups as $age=>$data) {
53 $strout .= PKWK_SPLITTER . ' ' . $data['time'] . "\n"; // Splitter format
54 $strout .= join('', $data['data']);
56 $strout = preg_replace("/([^\n])\n*$/", "$1\n", $strout);
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);
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);
74 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼èÆÀ¤¹¤ë
75 * $age = 0¤Þ¤¿¤Ï¾Êά : Á´¤Æ¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¡¼¥¿¤òÇÛÎó¤Ç¼èÆÀ¤¹¤ë
76 * $age > 0 : »ØÄꤷ¤¿À¤Âå¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¡¼¥¿¤ò¼èÆÀ¤¹¤ë
79 * @param String $page ¥Ú¡¼¥¸Ì¾
80 * @param Integer $age ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÀ¤ÂåÈÖ¹æ ¾Êά»þ¤ÏÁ´¤Æ
82 * @return String ¥Ð¥Ã¥¯¥¢¥Ã¥× ($age != 0)
83 * Array ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎÇÛÎó ($age == 0)
85 function get_backup($page, $age = 0)
87 $lines = _backup_file($page);
88 if (! is_array($lines)) return array();
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)) {
96 if ($age > 0 && $_age > $age)
97 return $retvars[$age];
99 $retvars[$_age] = array('time'=>$match[1], 'data'=>array());
101 $retvars[$_age]['data'][] = $line;
109 * _backup_get_filename
110 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ¤¹¤ë
113 * @param String $page ¥Ú¡¼¥¸Ì¾
115 * @return String ¥Ð¥Ã¥¯¥¢¥Ã¥×¤Î¥Õ¥¡¥¤¥ë̾
117 function _backup_get_filename($page)
119 return BACKUP_DIR . encode($page) . BACKUP_EXT;
123 * _backup_file_exists
124 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¤«
127 * @param String $page ¥Ú¡¼¥¸Ì¾
129 * @return Boolean TRUE:¤¢¤ë FALSE:¤Ê¤¤
131 function _backup_file_exists($page)
133 return file_exists(_backup_get_filename($page));
137 * _backup_get_filetime
138 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤òÆÀ¤ë
141 * @param String $page ¥Ú¡¼¥¸Ì¾
143 * @return Integer ¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï(GMT)
146 function _backup_get_filetime($page)
148 return _backup_file_exists($page) ?
149 filemtime(_backup_get_filename($page)) - LOCALZONE : 0;
154 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òºï½ü¤¹¤ë
157 * @param String $page ¥Ú¡¼¥¸Ì¾
159 * @return Boolean FALSE:¼ºÇÔ
161 function _backup_delete($page)
163 return unlink(_backup_get_filename($page));
166 /////////////////////////////////////////////////
168 if (extension_loaded('zlib')) {
169 // ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à´Ø¿ô
171 define('BACKUP_EXT', '.gz');
175 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò³«¤¯
178 * @param String $page ¥Ú¡¼¥¸Ì¾
179 * @param String $mode ¥â¡¼¥É
181 * @return Boolean FALSE:¼ºÇÔ
183 function _backup_fopen($page, $mode)
185 return gzopen(_backup_get_filename($page), $mode);
190 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë½ñ¤¹þ¤à
193 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
194 * @param String $str ʸ»úÎó
196 * @return Boolean FALSE:¼ºÇÔ ¤½¤Î¾:½ñ¤¹þ¤ó¤À¥Ð¥¤¥È¿ô
198 function _backup_fputs($zp, $str)
200 return gzputs($zp, $str);
205 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
208 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
210 * @return Boolean FALSE:¼ºÇÔ
212 function _backup_fclose($zp)
219 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¼èÆÀ¤¹¤ë
222 * @param String $page ¥Ú¡¼¥¸Ì¾
224 * @return Array ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ
226 function _backup_file($page)
228 return _backup_file_exists($page) ?
229 gzfile(_backup_get_filename($page)) :
233 /////////////////////////////////////////////////
236 // ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à´Ø¿ô
237 define('BACKUP_EXT', '.txt');
241 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ò³«¤¯
244 * @param String $page ¥Ú¡¼¥¸Ì¾
245 * @param String $mode ¥â¡¼¥É
247 * @return Boolean FALSE:¼ºÇÔ
249 function _backup_fopen($page, $mode)
251 return fopen(_backup_get_filename($page), $mode);
256 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤Ë½ñ¤¹þ¤à
259 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
260 * @param String $str ʸ»úÎó
262 * @return Boolean FALSE:¼ºÇÔ ¤½¤Î¾:½ñ¤¹þ¤ó¤À¥Ð¥¤¥È¿ô
264 function _backup_fputs($zp, $str)
266 return fputs($zp, $str);
271 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
274 * @param Integer $zp ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿
276 * @return Boolean FALSE:¼ºÇÔ
278 function _backup_fclose($zp)
285 * ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¼èÆÀ¤¹¤ë
288 * @param String $page ¥Ú¡¼¥¸Ì¾
290 * @return Array ¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ
292 function _backup_file($page)
294 return _backup_file_exists($page) ?
295 file(_backup_get_filename($page)) :