// // This file is part of IlohaMail. IlohaMail is free software released // under the GPL license. See enclosed file COPYING for details, or // see http://www.fsf.org/copyleft/gpl.html // ///////////////////////////////////////////////////////// /******************************************************** PURPOSE: Data handling abstraction class. PRE-CONDITIONS: $USER_DIR - Where user directories reside (e.g. "../users/") POST-CONDITIONS: COMMENTS: For FS based backend, $data will contain all data. ********************************************************/ include_once("../include/sort2darray.inc"); class DataManager_obj{ var $user; var $host; var $storage; //directory for FS backend, table nmae for DB var $location; //file name for FS backend, user's ID for DB backend var $path; var $data; //actually contains var $error; var $is_sharable; function initialize($user, $host, $location, $backend){ global $USER_DIR; $this->error = ""; $storage = $USER_DIR; $location = $location.".dat"; if (!file_exists(realpath($storage))){ $this->error = "Folder: $storage does not exist\n"; return false; } $storage = $storage.ereg_replace("[\\/]", "", $user.".".$host); if (!file_exists(realpath($storage))){ $this->error = "Folder: $storage does not exist\n"; return false; } $this->storage = $storage; $this->location = $location; $this->path = $storage."/".$location; $this->user = $user; $this->host = $host; $this->data = false; return true; } function read(){ $filePath = $this->path; $this->data = false; $fp = fopen($filePath, "a"); //force create file if ($fp) fclose($fp); $lines = file($filePath); if (is_array($lines)){ $i=1; while ( list($key, $line) = each ($lines) ){ $a = explode(",", chop($line)); while ( list($k2, $data) = each($a) ){ list($type, $string) = explode(":", $data); if ($type!="id") $string = base64_decode($string); //$string = base64_decode($string); $this->data[$i][$type] = $string; } $i++; } }else{ $this->error.= "Failed to read from: $filePath.\n"; $this->data = array(); } return $this->data; } function fetch_id($id){ $a = $this->read(); if (is_array($a)){ while(list($k,$entry)=each($a)){ if ($entry["id"]==$id) return $entry; } } $this->error .= "Record $id not found\n"; return false; } function save(){ $filePath = $this->path; $fp = fopen($filePath, "w+"); if ($fp){ reset($this->data); while ( list($key, $foo) = each($this->data)){ $line="id:".$this->data[$key]["id"]; while ( list($k2, $val) = each($this->data[$key])) if ($k2!="id") $line .= ",".$k2.":".base64_encode($val); fputs($fp, $line."\n"); } fclose($fp); return true; }else{ $this->error = "Couldn't open file \"$filePath\" for writing\n"; return false; } } function delete($id){ if (!$this->data) $this->read(); $result = array(); $deleted = false; reset($this->data); while ( list($k,$v) = each($this->data) ){ if ($this->data[$k]["id"] != $id) $result[$k] = $this->data[$k]; else $deleted = true; } if ($deleted){ $this->data = $result; $this->save(); }else{ $this->error = "Delete failed: $id not found\n"; } return $deleted; } function update($id, $array){ if (!$this->data) $this->read(); $updated = false; reset($this->data); while ( list($k,$v) = each($this->data) ){ if ($this->data[$k]["id"]==$id){ $this->data[$k] = $array; $this->data[$k]["id] = $id; $updated = true; } } if ($updated) $this->save(); else $this->error = "Update failed: $id not found\n"; return $updated; } function insert($array){ if (!$this->data) $this->read(); $array["id"] = $this->unique_id(); $this->data[] = $array; return $this->save(); } function sort($field, $order){ if (!$this->data) $this->read(); $sort_a = explode(",", $field); $num_fields = count($sort_a); for ($i=$num_fields;$i>0;$i--){ $this->data = sort2darray($this->data, $sort_a[$i-1], $order); } return $this->data; } function getDistinct($field, $order){ $this->sort($field, $order); $index = array(); $result = array(); while ( list($k,$v) = each($this->data) ){ $value = $this->data[$k][$field]; if (empty($index[$value])){ $index[$value] = 1; $result[] = $value; } } return $result; } function search($array){ } function showError(){ echo nl2br($this->error); } // Because of the way the editing of contacts is handled in the presentation layer, // it is important that this only return positive integers. // JPN // function unique_id(){ return time(); } }