]> 4ch.mooo.com Git - test.git/blob - lib/fileio/ifs.php
new file: ChangeLog
[test.git] / lib / fileio / ifs.php
1 <?php\r
2 /**\r
3  * FileIO Index File System\r
4  *\r
5  * 把遠端圖檔的各種屬性作本機快取及記錄,方便程式取用\r
6  *\r
7  * @package PMCLibrary\r
8  * @version $Id: ifs.php 393 2007-04-30 11:25:29Z scribe $\r
9  * @date $Date: 2007-04-30 19:25:29 +0800 (星期一, 30 四月 2007) $\r
10  */\r
11 \r
12 class IndexFS{\r
13         var $logfile, $backend, $index, $modified;\r
14 \r
15         /* 建構元 */\r
16         function IndexFS($logfile){\r
17                 $this->logfile = $logfile; // 索引記錄檔位置\r
18         }\r
19 \r
20         /* 初始化 */\r
21         function init(){\r
22                 switch($this->backend){\r
23                         case 'log':\r
24                                 touch($this->logfile); chmod($this->logfile, 0666); // 建立索引檔\r
25                                 break;\r
26                         case 'sqlite2':\r
27                                 $execText = 'CREATE TABLE IndexFS (\r
28                                 "imgName" VARCHAR(20)  NOT NULL PRIMARY KEY,\r
29                                 "imgSize" INTEGER  NOT NULL,\r
30                                 "imgURL" VARCHAR(255)  NOT NULL\r
31                                 ); CREATE INDEX IDX_IndexFS_imgName ON IndexFS(imgName);';\r
32                                 sqlite_exec($this->index, $execText);\r
33                                 break;\r
34                 }\r
35         }\r
36 \r
37         /* 開啟索引檔並讀入 */\r
38         function openIndex(){\r
39                 if(extension_loaded('SQLite')){\r
40                         $this->backend = 'sqlite2';\r
41                         $this->index = sqlite_open($this->logfile, 0666);\r
42                         if(sqlite_num_rows(sqlite_query($this->index, "SELECT name FROM sqlite_master WHERE name LIKE 'IndexFS'"))===0) $this->init();\r
43                 }else{\r
44                         $this->backend = 'log';\r
45                         $this->modified = false;\r
46                         if(!file_exists($this->logfile)){ $this->init(); return; }\r
47                         if(filesize($this->logfile)==0) return;\r
48                         $indexlog = file($this->logfile); $indexlog_count = count($indexlog); // 讀入索引檔並計算目前筆數\r
49                         $this->index = array();\r
50                         for($i = 0; $i < $indexlog_count; $i++){\r
51                                 if(!($trimline = rtrim($indexlog[$i]))) continue; // 本行無意義\r
52                                 $field = explode("\t\t", $trimline);\r
53                                 $this->index[$field[0]] = array('imgSize' => $field[1], 'imgURL' => $field[2]);\r
54                                 // 索引格式: 檔名 檔案大小    對應路徑\r
55                         }\r
56                         unset($indexlog);\r
57                 }\r
58         }\r
59 \r
60         /* 索引是否存在 */\r
61         function beRecord($id){\r
62                 switch($this->backend){\r
63                         case 'log':\r
64                                 return isset($this->index[$id]);\r
65                         case 'sqlite2':\r
66                                 return (sqlite_fetch_array(sqlite_query($this->index, 'SELECT imgName FROM IndexFS WHERE imgName = "'.sqlite_escape_string($id).'"'), SQLITE_ASSOC) ? true : false);\r
67                 }\r
68         }\r
69 \r
70         /* 取得一筆索引 */\r
71         function getRecord($id){\r
72                 switch($this->backend){\r
73                         case 'log':\r
74                                 return isset($this->index[$id]) ? $this->index[$id] : false;\r
75                         case 'sqlite2':\r
76                                 return sqlite_fetch_array(sqlite_query($this->index, 'SELECT * FROM IndexFS WHERE imgName = "'.sqlite_escape_string($id).'"'), SQLITE_ASSOC);\r
77                 }\r
78         }\r
79 \r
80         /* 新增一筆索引 */\r
81         function addRecord($id, $imgSize, $imgURL){\r
82                 switch($this->backend){\r
83                         case 'log':\r
84                                 $this->modified = true;\r
85                                 $this->index[$id] = array('imgSize' => $imgSize, 'imgURL' => $imgURL); // 加入索引之中\r
86                                 break;\r
87                         case 'sqlite2':\r
88                                 sqlite_exec($this->index, 'INSERT INTO IndexFS (imgName, imgSize, imgURL) VALUES ("'.sqlite_escape_string($id).'", '.sqlite_escape_string($imgSize).', "'.sqlite_escape_string($imgURL).'");');\r
89                                 break;\r
90                 }\r
91         }\r
92 \r
93         /* 刪除一筆索引 */\r
94         function delRecord($id){\r
95                 switch($this->backend){\r
96                         case 'log':\r
97                                 if(isset($this->index[$id])){ unset($this->index[$id]); $this->modified = true; return true; }\r
98                                 return false;\r
99                         case 'sqlite2':\r
100                                 return sqlite_exec($this->index, 'DELETE FROM IndexFS WHERE imgName = "'.sqlite_escape_string($id).'";');\r
101                 }\r
102         }\r
103 \r
104         /* 儲存索引變更 */\r
105         function saveIndex(){\r
106                 if($this->backend=='log' && $this->modified){ // 如果有修改索引就回存\r
107                         $indexlog = '';\r
108                         if(count($this->index)) foreach($this->index as $ikey => $ival){ $indexlog .= $ikey."\t\t".$ival['imgSize']."\t\t".$ival['imgURL']."\n"; } // 有資料才跑迴圈\r
109                         $fp = fopen($this->logfile, 'w');\r
110                         fwrite($fp, $indexlog);\r
111                         fclose($fp);\r
112                 }elseif($this->backend=='sqlite2'){\r
113                         sqlite_close($this->index);\r
114                 }\r
115         }\r
116 }\r
117 ?>