OSDN Git Service

database operation cleanup. (tested on MySQL3.23.55/Windows2000 and PostgreSQL7.2...
[pukiwiki/pukiwiki.git] / file.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: file.php,v 1.14 2003/03/10 11:30:50 panda Exp $
6 //
7
8 // ¥½¡¼¥¹¤ò¼èÆÀ
9 function get_source($page)
10 {
11         if (!is_page($page)) {
12                 return array();
13         }
14         return str_replace("\r",'',file(get_filename($page)));
15 }
16
17 // ¥Ú¡¼¥¸¤Î¹¹¿·»þ¹ï¤òÆÀ¤ë
18 function get_filetime($page)
19 {
20         return filemtime(get_filename($page)) - LOCALZONE;
21 }
22
23 // ¥Ú¡¼¥¸¤Î¥Õ¥¡¥¤¥ë̾¤òÆÀ¤ë
24 function get_filename($page)
25 {
26         return DATA_DIR.encode($page).'.txt';
27 }
28
29 // ¥Ú¡¼¥¸¤Î½ÐÎÏ
30 function page_write($page,$postdata)
31 {
32         $postdata = make_str_rules($postdata);
33         
34         // º¹Ê¬¥Õ¥¡¥¤¥ë¤ÎºîÀ®
35         $oldpostdata = is_page($page) ? join('',get_source($page)) : '';
36         $diffdata = do_diff($oldpostdata,$postdata);
37         file_write(DIFF_DIR,$page,$diffdata);
38         
39         // ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎºîÀ®
40         make_backup($page,$postdata == '');
41         
42         // ¥Õ¥¡¥¤¥ë¤Î½ñ¤­¹þ¤ß
43         file_write(DATA_DIR,$page,$postdata);
44         
45         // is_page¤Î¥­¥ã¥Ã¥·¥å¤ò¥¯¥ê¥¢¤¹¤ë¡£
46         is_page($page,TRUE);
47         
48         // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·
49         links_update($page);
50 }
51
52 // ¥æ¡¼¥¶ÄêµÁ¥ë¡¼¥ë(¥½¡¼¥¹¤òÃÖ´¹¤¹¤ë)
53 function make_str_rules($str)
54 {
55         global $str_rules;
56         
57         $arr = explode("\n",$str);
58         
59         // ÆüÉÕ¡¦»þ¹ïÃÖ´¹½èÍý
60         foreach ($arr as $str)
61         {
62                 if ($str != '' and $str{0} != ' ' and $str{0} != "\t")
63                 {
64                         foreach ($str_rules as $rule => $replace)
65                         {
66                                 $str = preg_replace("/$rule/",$replace,$str);
67                         }
68                 }
69                 $retvars[] = $str;
70         }
71         
72         return join("\n",$retvars);
73 }
74
75 // ¥Õ¥¡¥¤¥ë¤Ø¤Î½ÐÎÏ
76 function file_write($dir,$page,$str)
77 {
78         global $post,$update_exec;
79         global $_msg_invalidiwn;
80         
81         if (!is_pagename($page))
82         {
83                 die_message(
84                         str_replace('$1',htmlspecialchars($page),
85                                 str_replace('$2','WikiName',$_msg_invalidiwn)
86                         )
87                 );
88         }
89         $page = strip_bracket($page);
90         $timestamp = FALSE;
91         $file = $dir.encode($page).'.txt';
92         
93         if ($dir == DATA_DIR and $str == '' and file_exists($file)) {
94                 unlink($file);
95         }
96         if ($str != '') {
97                 $str = preg_replace("/\r/",'',$str);
98                 $str = rtrim($str)."\n";
99                 
100                 if (!empty($post['notimestamp']) and file_exists($file)) {
101                         $timestamp = filemtime($file) - LOCALZONE;
102                 }
103                 
104                 $fp = fopen($file,'w')
105                         or die_message('cannot write page file or diff file or other'.htmlspecialchars($page).'<br>maybe permission is not writable or filename is too long');
106                 flock($fp,LOCK_EX);
107                 fputs($fp,$str);
108                 flock($fp,LOCK_UN);
109                 fclose($fp);
110                 if ($timestamp) {
111                         touch($file,$timestamp + LOCALZONE);
112                 }
113         }
114         
115         if (!$timestamp) {
116                 put_lastmodified();
117         }
118         
119         if ($update_exec and $dir == DATA_DIR) {
120                 system($update_exec.' > /dev/null &');
121         }
122 }
123
124 // ºÇ½ª¹¹¿·¥Ú¡¼¥¸¤Î¹¹¿·
125 function put_lastmodified()
126 {
127         global $script,$post,$maxshow,$whatsnew,$non_list,$autolink;
128
129         $pages = get_existpages();
130         $recent_pages = array();
131         foreach($pages as $page)
132         {
133                 if ($page != $whatsnew and !preg_match("/$non_list/",$page))
134                 {
135                         $recent_pages[$page] = get_filetime($page);
136                 }
137         }
138         
139         //»þ¹ï¹ß½ç¤Ç¥½¡¼¥È
140         arsort($recent_pages,SORT_NUMERIC);
141         
142         // create recent.dat (for recent.inc.php)
143         $fp = fopen(CACHE_DIR.'recent.dat','w')
144                 or die_message('cannot write cache file '.CACHE_DIR.'recent.dat<br>maybe permission is not writable or filename is too long');
145         flock($fp,LOCK_EX);
146         foreach ($recent_pages as $page=>$time)
147         {
148                 fputs($fp,"$time\t$page\n");
149         }
150         flock($fp,LOCK_UN);
151         fclose($fp);
152
153         // create RecentChanges
154         $fp = fopen(get_filename($whatsnew),'w')
155                 or die_message('cannot write page file '.htmlspecialchars($whatsnew).'<br>maybe permission is not writable or filename is too long');
156         flock($fp,LOCK_EX);
157         foreach (array_splice($recent_pages,0,$maxshow) as $page=>$time)
158         {
159                 $s_lastmod = htmlspecialchars(format_date($time));
160                 $s_page = htmlspecialchars($page);
161                 fputs($fp, "-$s_lastmod - [[$s_page]]\n");
162         }
163         fputs($fp,"#norelated\n"); // :)
164         flock($fp,LOCK_UN);
165         fclose($fp);
166         
167         // for autolink
168         if ($autolink)
169         {
170                 list($pattern,$forceignorelist) = get_autolink_pattern($pages);
171                 
172                 $fp = fopen(CACHE_DIR.'autolink.dat','w')
173                         or die_message('cannot write autolink file '.CACHE_DIR.'/autolink.dat<br>maybe permission is not writable');
174                 flock($fp,LOCK_EX);
175                 fputs($fp,$pattern."\n");
176                 fputs($fp,join("\t",$forceignorelist));
177                 flock($fp,LOCK_UN);
178                 fclose($fp);
179         }
180 }
181
182 // »ØÄꤵ¤ì¤¿¥Ú¡¼¥¸¤Î·Ð²á»þ¹ï
183 function get_pg_passage($page,$sw=TRUE)
184 {
185         global $show_passage;
186         static $pg_passage;
187         
188         if (!$show_passage) {
189                 return '';
190         }
191         
192         if (!isset($pg_passage)) {
193                 $pg_passage = array();
194         }
195         
196         if (!array_key_exists($page,$pg_passage)) {
197                 $pg_passage[$page] = (is_page($page) and $time = get_filetime($page)) ? get_passage($time) : '';
198         }
199         
200         return $sw ? "<small>{$pg_passage[$page]}</small>" : " {$pg_passage[$page]}";
201 }
202
203 // Last-Modified ¥Ø¥Ã¥À
204 function header_lastmod()
205 {
206         global $lastmod;
207         
208         if ($lastmod and is_page($page)) {
209                 header('Last-Modified: '.date('D, d M Y H:i:s',get_filetime($page)).' GMT');
210         }
211 }
212
213 // Á´¥Ú¡¼¥¸Ì¾¤òÇÛÎó¤Ë
214 function get_existpages($dir=DATA_DIR,$ext='.txt')
215 {
216         $aryret = array();
217         
218         $pattern = '^([0-9A-F]+)';
219         if ($ext != '') {
220                 $pattern .= preg_quote($ext,'/').'$';
221         }
222         $dp = @opendir($dir)
223                 or die_message($dir. ' is not found or not readable.');
224         while ($file = readdir($dp)) {
225                 if (preg_match("/$pattern/",$file,$matches)) {
226                         $aryret[] = decode($matches[1]);
227                 }
228         }
229         closedir($dp);
230         return $aryret;
231 }
232 //¥Õ¥¡¥¤¥ë̾¤Î°ìÍ÷¤òÇÛÎó¤Ë(¥¨¥ó¥³¡¼¥ÉºÑ¤ß¡¢³ÈÄ¥»Ò¤ò»ØÄê)
233 function get_existfiles($dir,$ext)
234 {
235         $aryret = array();
236         
237         $pattern = '^[0-9A-F]+'.preg_quote($ext,'/').'$';
238         $dp = @opendir($dir)
239                 or die_message($dir. ' is not found or not readable.');
240         while ($file = readdir($dp)) {
241                 if (preg_match("/$pattern/",$file)) {
242                         $aryret[] = $dir.$file;
243                 }
244         }
245         closedir($dp);
246         return $aryret;
247 }       
248 function links_update($page)
249 {
250         global $vars;
251
252         // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·
253         if (exist_plugin_action('links')) {
254                 // ¤Á¤ç¤Ã¤È¸È©
255                 $tmp = $vars['page'];
256                 $vars['page'] = $page;
257                 do_plugin_action('links');
258                 $vars['page'] = $tmp;
259         }
260 }
261 //¤¢¤ë¥Ú¡¼¥¸¤Î´ØÏ¢¥Ú¡¼¥¸¤òÆÀ¤ë
262 function links_get_related($page)
263 {
264         global $vars,$related;
265         static $links;
266         
267         if (!isset($links))
268         {
269                 $links = array();
270         }
271         
272         if (array_key_exists($page,$links))
273         {
274                 return $links[$page];
275         }
276         
277         // ²Äǽ¤Ê¤émake_link()¤ÇÀ¸À®¤·¤¿´ØÏ¢¥Ú¡¼¥¸¤ò¼è¤ê¹þ¤à
278         $links[$page] = ($page == $vars['page']) ? $related : array();
279         
280         // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é´ØÏ¢¥Ú¡¼¥¸¤òÆÀ¤ë
281         $links[$page] += links_get_related_db($vars['page']);
282         
283         return $links[$page];
284 }
285 // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é´ØÏ¢¥Ú¡¼¥¸¤òÆÀ¤ë
286 function links_get_related_db($page)
287 {
288         $links = array();
289         
290         if (defined('LINK_DB'))
291         {
292                 $a_page = addslashes($page);
293                 
294                 // $page¤¬»²¾È¤·¤Æ¤¤¤ë¥Ú¡¼¥¸
295                 $sql = <<<EOD
296 SELECT refpage.name,refpage.lastmod
297  FROM page
298   LEFT JOIN link ON page.id = page_id
299    LEFT JOIN page AS refpage ON ref_id = refpage.id
300     WHERE page.name = '$a_page' and refpage.lastmod > 0;
301 EOD;
302                 $rows = db_query($sql);
303                 // $page¤ò»²¾È¤·¤Æ¤¤¤ë¥Ú¡¼¥¸
304                 $sql = <<<EOD
305 SELECT DISTINCT refpage.name,refpage.lastmod
306  FROM page
307   LEFT JOIN link ON page.id = ref_id
308    LEFT JOIN page AS refpage ON page_id = refpage.id
309     WHERE page.name = '$a_page';
310 EOD;
311                 $rows += db_query($sql);
312                 
313                 foreach ($rows as $row)
314                 {
315                         if (empty($row['name']) or substr($row['name'],0,1) == ':')
316                         {
317                                 continue;
318                         }
319                         $links[$row['name']] = $row['lastmod'];
320                 }
321         }
322         else
323         {
324                 $ref_name = CACHE_DIR.encode($page).'.ref';
325                 if (file_exists($ref_name))
326                 {
327                         foreach (file($ref_name) as $line)
328                         {
329                                 list($_page,$time) = explode("\t",rtrim($line));
330                                 $links[$_page] = $time;
331                         }
332                 }
333         }
334         return $links;
335 }
336 ?>