From 34f57b50ac2cd84edd5e164ea93e3b78d54db76d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 8 Aug 2004 16:21:18 +0000 Subject: [PATCH] backported the rework from HEAD, to fixe the postgres probs --- felamimail/inc/class.socaching.inc.php | 257 +++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 felamimail/inc/class.socaching.inc.php diff --git a/felamimail/inc/class.socaching.inc.php b/felamimail/inc/class.socaching.inc.php new file mode 100644 index 0000000000..f8749d6135 --- /dev/null +++ b/felamimail/inc/class.socaching.inc.php @@ -0,0 +1,257 @@ + True, + 'action' => True + ); + var $cache_table = 'phpgw_felamimail_cache'; + var $folder_table = 'phpgw_felamimail_folderstatus'; + var $hostname,$accountname,$foldername,$accountid,$host_account_folder; // set by the constructor + + function socaching($_hostname, $_accountname, $_foldername, $_accountid) + { + $this->hostname = $_hostname; + $this->accountname = $_accountname; + $this->foldername = $_foldername; + $this->accountid = $_accountid; + + $this->host_account_folder = array( + 'accountid' => $this->accountid, + 'hostname' => $this->hostname, + 'foldername' => $this->foldername, + 'accountname' => $this->accountname, + ); + + $this->db = $GLOBALS['phpgw']->db; + $this->db->set_app('felamimail'); + } + + function addToCache($_data) + { + // we need to truncate the to_address field, as it can be easyly longer then the + // allowed size of atm. 120 chars, DB's other then mysql, give an SQL error + if (!$this->to_address_size) + { + $table_def = $this->db->get_table_definitions('',$this->cache_table); + $this->to_address_size = $table_def['fd']['to_address']['precision']; + unset($table_def); + } + $this->db->insert($this->cache_table,array_merge($this->host_account_folder,array( + 'uid' => $_data['uid'], + 'date' => $_data['date'], + 'subject' => $_data['subject'], + 'sender_name' => $_data['sender_name'], + 'sender_address' => $_data['sender_address'], + 'to_name' => $_data['to_name'], + 'to_address' => substr($_data['to_address'],0,$this->to_address_size), + 'size' => $_data['size'], + 'attachments' => $_data['attachments'], + )),False,__LINE__,__FILE__); + } + + /** + * create sql from the filter array + * + * @param array $_filter values/searchpattern for 'from', 'to' or 'subject' + * @return string SQL to be AND'ed into a query + */ + function getFilterSQL($_filter) + { + $filter = ''; + + if(is_array($_filter)) + { + foreach($_filter as $key => $value) + { + $value = $this->db->quote('%'.$value.'%'); + + if($filter != '') $filter .= 'OR '; + + switch($key) + { + case 'from': + $filter .= "(sender_name LIKE $value OR sender_address LIKE $value) "; + break; + case 'to': + $filter .= "(to_name LIKE $value OR to_address LIKE $value) "; + break; + case 'subject': + $filter .= "subject LIKE $value "; + break; + } + } + if($filter != '') $filter = "($filter) "; + } + return $filter; + } + + function getHeaders($_firstMessage='', $_numberOfMessages='', $_sort='', $_filter='') + { + $where = $this->host_account_folder; + $filter = $this->getFilterSQL($_filter); + if ($filter) $where[] = $filter; + + $this->db->select($this->cache_table,'uid,date,subject,sender_name,sender_address,to_name,to_address,size,attachments', + $where,__LINE__,__FILE__,$_firstMessage,$this->getSortSQL($_sort),False,$_numberOfMessages); + + while($this->db->next_record()) + { + $retValue[] = array( + 'uid' => $this->db->f('uid'), + 'sender_name' => $this->db->f('sender_name'), + 'sender_address'=> $this->db->f('sender_address'), + 'to_name' => $this->db->f('to_name'), + 'to_address' => $this->db->f('to_address'), + 'attachments' => $this->db->f('attachments'), + 'date' => $this->db->f('date') + ); + } + return $retValue; + } + + /** + * get folder status + * @return array/int array with the currently cached infos or 0 if nothing cached for this folder so far + */ + function getImapStatus() + { + $this->db->select($this->folder_table,'messages,recent,unseen,uidnext,uidvalidity', + $this->host_account_folder,__LINE__,__FILE__); + + if ($this->db->next_record()) + { + return array( + 'messages' => $this->db->f('messages'), + 'recent' => $this->db->f('recent'), + 'unseen' => $this->db->f('unseen'), + 'uidnext' => $this->db->f('uidnext'), + 'uidvalidity' => $this->db->f('uidvalidity') + ); + } + return 0; + } + + /** + * Numbers of messages in cache currently, by using the given filter + * @param array $filter see getFilterSQL + * @return int + */ + function getMessageCounter($_filter) + { + $where = $this->host_account_folder; + $filter = $this->getFilterSQL($_filter); + if ($filter) $where[] = $filter; + + $this->db->select($this->cache_table,'count(*)',$where,__LINE__,__FILE__); + + return $this->db->next_record() ? $this->db->f(0) : 0; + } + + /** + * get the next message + */ + function getNextMessage($_uid, $_sort='', $_filter='') + { + $where = $this->host_account_folder; + $filter = $this->getFilterSQL($_filter); + if ($filter) $where[] = $filter; + + $this->db->select($this->cache_table,'uid', + $where,__LINE__,__FILE__,FALSE,$this->getSortSQL($_sort)); + + while($this->db->next_record()) + { + // we found the current message + if($this->db->f('uid') == $_uid) + { + // jump to the next messages + if($this->db->next_record()) + { + $retValue['next'] = $this->db->f('uid'); + } + // we are done + if($retValue) return $retValue; + + // we should never get here + return false; + } + else + { + // we found (maybe!) the previous message + $retValue['previous'] = $this->db->f('uid'); + } + } + + // we should never get here + return false; + } + + function getSortSQL($_sort) + { + switch($_sort) + { + case "0": + $sort = "ORDER BY date DESC"; + break; + case "1": + $sort = "ORDER BY date ASC"; + break; + case "2": + $sort = "ORDER BY sender_address DESC"; + break; + case "3": + $sort = "ORDER BY sender_address ASC"; + break; + case "4": + $sort = "ORDER BY subject DESC"; + break; + case "5": + $sort = "ORDER BY subject ASC"; + break; + case "6": + $sort = "ORDER BY size DESC"; + break; + case "7": + $sort = "ORDER BY size ASC"; + break; + default: + $sort = "ORDER BY date DESC"; + } + return $sort; + } + + function removeFromCache($_uid) + { + $this->db->delete($this->cache_table,array_merge($this->host_account_folder,array( + 'uid' => $_uid, + )),__LINE__,__FILE__); + } + + function updateImapStatus($_status, $firstUpdate) + { + $this->db->insert($this->folder_table,array( + 'messages' => $_status->messages, + 'recent' => $_status->recent, + 'unseen' => $_status->unseen, + 'uidnext' => $_status->uidnext, + 'uidvalidity' => $_status->uidvalidity, + ),$this->host_account_folder,__LINE__,__FILE__); + } + } +?> \ No newline at end of file