3 * FileIO Index File System
\r
5 * 把遠端圖檔的各種屬性作本機快取及記錄,方便程式取用
\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
13 var $logfile, $backend, $index, $modified;
\r
16 function IndexFS($logfile){
\r
17 $this->logfile = $logfile; // 索引記錄檔位置
\r
22 switch($this->backend){
\r
24 touch($this->logfile); chmod($this->logfile, 0666); // 建立索引檔
\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
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
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
61 function beRecord($id){
\r
62 switch($this->backend){
\r
64 return isset($this->index[$id]);
\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
71 function getRecord($id){
\r
72 switch($this->backend){
\r
74 return isset($this->index[$id]) ? $this->index[$id] : false;
\r
76 return sqlite_fetch_array(sqlite_query($this->index, 'SELECT * FROM IndexFS WHERE imgName = "'.sqlite_escape_string($id).'"'), SQLITE_ASSOC);
\r
81 function addRecord($id, $imgSize, $imgURL){
\r
82 switch($this->backend){
\r
84 $this->modified = true;
\r
85 $this->index[$id] = array('imgSize' => $imgSize, 'imgURL' => $imgURL); // 加入索引之中
\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
94 function delRecord($id){
\r
95 switch($this->backend){
\r
97 if(isset($this->index[$id])){ unset($this->index[$id]); $this->modified = true; return true; }
\r
100 return sqlite_exec($this->index, 'DELETE FROM IndexFS WHERE imgName = "'.sqlite_escape_string($id).'";');
\r
105 function saveIndex(){
\r
106 if($this->backend=='log' && $this->modified){ // 如果有修改索引就回存
\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
112 }elseif($this->backend=='sqlite2'){
\r
113 sqlite_close($this->index);
\r