OSDN Git Service

Convert character code of the source code to UTF-8 from EUC-JP
[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.13 2011/01/25 15:01:01 henoheno Exp $
15  * Copyright (C)
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
19  **/
20
21 /**
22  * make_backup
23  * バックアップを作成する
24  *
25  * @access    public
26  * @param     String    $page        ページ名
27  * @param     Boolean   $delete      TRUE:バックアップを削除する
28  *
29  * @return    Void
30  */
31
32 function make_backup($page, $delete = FALSE)
33 {
34         global $cycle, $maxage;
35         global $do_backup, $del_backup;
36
37         if (PKWK_READONLY || ! $do_backup) return;
38
39         if ($del_backup && $delete) {
40                 _backup_delete($page);
41                 return;
42         }
43
44         if (! is_page($page)) return;
45
46         $lastmod = _backup_get_filetime($page);
47         if ($lastmod == 0 || UTIME - $lastmod > 60 * 60 * $cycle)
48         {
49                 $backups = get_backup($page);
50                 $count   = count($backups) + 1;
51
52                 // 直後に1件追加するので、(最大件数 - 1)を超える要素を捨てる
53                 if ($count > $maxage)
54                         array_splice($backups, 0, $count - $maxage);
55
56                 $strout = '';
57                 foreach($backups as $age=>$data) {
58                         $strout .= PKWK_SPLITTER . ' ' . $data['time'] . "\n"; // Splitter format
59                         $strout .= join('', $data['data']);
60                         unset($backups[$age]);
61                 }
62                 $strout = preg_replace("/([^\n])\n*$/", "$1\n", $strout);
63
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);
68
69                 $fp = _backup_fopen($page, 'wb')
70                         or die_message('Cannot open ' . htmlsc(_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);
74                 _backup_fclose($fp);
75         }
76 }
77
78 /**
79  * get_backup
80  * バックアップを取得する
81  * $age = 0または省略 : 全てのバックアップデータを配列で取得する
82  * $age > 0           : 指定した世代のバックアップデータを取得する
83  *
84  * @access    public
85  * @param     String    $page        ページ名
86  * @param     Integer   $age         バックアップの世代番号 省略時は全て
87  *
88  * @return    String    バックアップ       ($age != 0)
89  *            Array     バックアップの配列 ($age == 0)
90  */
91 function get_backup($page, $age = 0)
92 {
93         $lines = _backup_file($page);
94         if (! is_array($lines)) return array();
95
96         $_age = 0;
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
102                         ++$_age;
103                         if ($age > 0 && $_age > $age)
104                                 return $retvars[$age];
105
106                         // Allocate
107                         $retvars[$_age] = array('time'=>$match[1], 'data'=>array());
108                 } else {
109                         // The first ... the last line of the data
110                         $retvars[$_age]['data'][] = $line;
111                 }
112                 unset($lines[$index]);
113         }
114
115         return $retvars;
116 }
117
118 /**
119  * _backup_get_filename
120  * バックアップファイル名を取得する
121  *
122  * @access    private
123  * @param     String    $page        ページ名
124  *
125  * @return    String    バックアップのファイル名
126  */
127 function _backup_get_filename($page)
128 {
129         return BACKUP_DIR . encode($page) . BACKUP_EXT;
130 }
131
132 /**
133  * _backup_file_exists
134  * バックアップファイルが存在するか
135  *
136  * @access    private
137  * @param     String    $page        ページ名
138  *
139  * @return    Boolean   TRUE:ある FALSE:ない
140  */
141 function _backup_file_exists($page)
142 {
143         return file_exists(_backup_get_filename($page));
144 }
145
146 /**
147  * _backup_get_filetime
148  * バックアップファイルの更新時刻を得る
149  *
150  * @access    private
151  * @param     String    $page        ページ名
152  *
153  * @return    Integer   ファイルの更新時刻(GMT)
154  */
155
156 function _backup_get_filetime($page)
157 {
158         return _backup_file_exists($page) ?
159                 filemtime(_backup_get_filename($page)) - LOCALZONE : 0;
160 }
161
162 /**
163  * _backup_delete
164  * バックアップファイルを削除する
165  *
166  * @access    private
167  * @param     String    $page        ページ名
168  *
169  * @return    Boolean   FALSE:失敗
170  */
171 function _backup_delete($page)
172 {
173         return unlink(_backup_get_filename($page));
174 }
175
176 /////////////////////////////////////////////////
177
178 if (extension_loaded('zlib')) {
179         // ファイルシステム関数
180         // zlib関数を使用
181         define('BACKUP_EXT', '.gz');
182
183 /**
184  * _backup_fopen
185  * バックアップファイルを開く
186  *
187  * @access    private
188  * @param     String    $page        ページ名
189  * @param     String    $mode        モード
190  *
191  * @return    Boolean   FALSE:失敗
192  */
193         function _backup_fopen($page, $mode)
194         {
195                 return gzopen(_backup_get_filename($page), $mode);
196         }
197
198 /**
199  * _backup_fputs
200  * バックアップファイルに書き込む
201  *
202  * @access    private
203  * @param     Integer   $zp          ファイルポインタ
204  * @param     String    $str         文字列
205  *
206  * @return    Boolean   FALSE:失敗 その他:書き込んだバイト数
207  */
208         function _backup_fputs($zp, $str)
209         {
210                 return gzputs($zp, $str);
211         }
212
213 /**
214  * _backup_fclose
215  * バックアップファイルを閉じる
216  *
217  * @access    private
218  * @param     Integer   $zp          ファイルポインタ
219  *
220  * @return    Boolean   FALSE:失敗
221  */
222         function _backup_fclose($zp)
223         {
224                 return gzclose($zp);
225         }
226
227 /**
228  * _backup_file
229  * バックアップファイルの内容を取得する
230  *
231  * @access    private
232  * @param     String    $page        ページ名
233  *
234  * @return    Array     ファイルの内容
235  */
236         function _backup_file($page)
237         {
238                 return _backup_file_exists($page) ?
239                         gzfile(_backup_get_filename($page)) :
240                         array();
241         }
242 }
243 /////////////////////////////////////////////////
244 else
245 {
246         // ファイルシステム関数
247         define('BACKUP_EXT', '.txt');
248
249 /**
250  * _backup_fopen
251  * バックアップファイルを開く
252  *
253  * @access    private
254  * @param     String    $page        ページ名
255  * @param     String    $mode        モード
256  *
257  * @return    Boolean   FALSE:失敗
258  */
259         function _backup_fopen($page, $mode)
260         {
261                 return fopen(_backup_get_filename($page), $mode);
262         }
263
264 /**
265  * _backup_fputs
266  * バックアップファイルに書き込む
267  *
268  * @access    private
269  * @param     Integer   $zp          ファイルポインタ
270  * @param     String    $str         文字列
271  *
272  * @return    Boolean   FALSE:失敗 その他:書き込んだバイト数
273  */
274         function _backup_fputs($zp, $str)
275         {
276                 return fputs($zp, $str);
277         }
278
279 /**
280  * _backup_fclose
281  * バックアップファイルを閉じる
282  *
283  * @access    private
284  * @param     Integer   $zp          ファイルポインタ
285  *
286  * @return    Boolean   FALSE:失敗
287  */
288         function _backup_fclose($zp)
289         {
290                 return fclose($zp);
291         }
292
293 /**
294  * _backup_file
295  * バックアップファイルの内容を取得する
296  *
297  * @access    private
298  * @param     String    $page        ページ名
299  *
300  * @return    Array     ファイルの内容
301  */
302         function _backup_file($page)
303         {
304                 return _backup_file_exists($page) ?
305                         file(_backup_get_filename($page)) :
306                         array();
307         }
308 }
309 ?>