OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / widgets / wiki_main / include / 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 1141 2008-10-27 06:10:58Z fishbone $
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 ' . 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);
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         WikiPage::setPageBackupVisible($page, false);
176 }
177
178 /////////////////////////////////////////////////
179
180 if (extension_loaded('zlib')) {
181         // ファイルシステム関数
182         // zlib関数を使用
183         define('BACKUP_EXT', '.gz');
184
185 /**
186  * _backup_fopen
187  * バックアップファイルを開く
188  *
189  * @access    private
190  * @param     String    $page        ページ名
191  * @param     String    $mode        モード
192  *
193  * @return    Boolean   FALSE:失敗
194  */
195         function _backup_fopen($page, $mode)
196         {
197                 return gzopen(_backup_get_filename($page), $mode);
198         }
199
200 /**
201  * _backup_fputs
202  * バックアップファイルに書き込む
203  *
204  * @access    private
205  * @param     Integer   $zp          ファイルポインタ
206  * @param     String    $str         文字列
207  *
208  * @return    Boolean   FALSE:失敗 その他:書き込んだバイト数
209  */
210         function _backup_fputs($zp, $str)
211         {
212                 return gzputs($zp, $str);
213         }
214
215 /**
216  * _backup_fclose
217  * バックアップファイルを閉じる
218  *
219  * @access    private
220  * @param     Integer   $zp          ファイルポインタ
221  *
222  * @return    Boolean   FALSE:失敗
223  */
224         function _backup_fclose($zp)
225         {
226                 return gzclose($zp);
227         }
228
229 /**
230  * _backup_file
231  * バックアップファイルの内容を取得する
232  *
233  * @access    private
234  * @param     String    $page        ページ名
235  *
236  * @return    Array     ファイルの内容
237  */
238         function _backup_file($page)
239         {
240                 return _backup_file_exists($page) ?
241                         gzfile(_backup_get_filename($page)) :
242                         array();
243         }
244 }
245 /////////////////////////////////////////////////
246 else
247 {
248         // ファイルシステム関数
249         define('BACKUP_EXT', '.txt');
250
251 /**
252  * _backup_fopen
253  * バックアップファイルを開く
254  *
255  * @access    private
256  * @param     String    $page        ページ名
257  * @param     String    $mode        モード
258  *
259  * @return    Boolean   FALSE:失敗
260  */
261         function _backup_fopen($page, $mode)
262         {
263                 return fopen(_backup_get_filename($page), $mode);
264         }
265
266 /**
267  * _backup_fputs
268  * バックアップファイルに書き込む
269  *
270  * @access    private
271  * @param     Integer   $zp          ファイルポインタ
272  * @param     String    $str         文字列
273  *
274  * @return    Boolean   FALSE:失敗 その他:書き込んだバイト数
275  */
276         function _backup_fputs($zp, $str)
277         {
278                 return fputs($zp, $str);
279         }
280
281 /**
282  * _backup_fclose
283  * バックアップファイルを閉じる
284  *
285  * @access    private
286  * @param     Integer   $zp          ファイルポインタ
287  *
288  * @return    Boolean   FALSE:失敗
289  */
290         function _backup_fclose($zp)
291         {
292                 return fclose($zp);
293         }
294
295 /**
296  * _backup_file
297  * バックアップファイルの内容を取得する
298  *
299  * @access    private
300  * @param     String    $page        ページ名
301  *
302  * @return    Array     ファイルの内容
303  */
304         function _backup_file($page)
305         {
306                 return _backup_file_exists($page) ?
307                         file(_backup_get_filename($page)) :
308                         array();
309         }
310 }
311 ?>