diff options
Diffstat (limited to 'forum/utils/cache.php')
-rw-r--r-- | forum/utils/cache.php | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/forum/utils/cache.php b/forum/utils/cache.php new file mode 100644 index 0000000..42e4ca0 --- /dev/null +++ b/forum/utils/cache.php @@ -0,0 +1,147 @@ +<?php /* -*- Mode: php; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + +include_once($UTIL_DIR . "/convert.php"); +include_once($UTIL_DIR . "/forums.php"); + +class CacheEntry { + public $values = array(); + public $id; + + public function write($fp) + { + fwrite($fp, " <entry id=\"" . + htmlspecialchars($this->id, ENT_QUOTES, "UTF-8") . "\">\n"); + + foreach($this->values as $key => $value) { + fwrite($fp, " <value key=\"" . + htmlspecialchars($key, ENT_QUOTES, "UTF-8") . "\">"); + fwrite($fp, htmlspecialchars($value, ENT_QUOTES, "UTF-8")); + fwrite($fp, "</value>\n"); + } + + fwrite($fp, " </entry>\n"); + } + + public function value($key) + { + if(!isset($this->values[$key])) return ""; + return $this->values[$key]; + } + + public function setValue($key, $value) + { + $this->values[$key] = $value; + } + + public function CacheEntry($id) + { + $this->id = $id; + } +} + +class Cache { + private $file; + public $entries = array(); + + public function rebuild($what = "all") + { + global $FORUMS_DIR, $users; + + + if($what == "all") $this->entries = array(); + + + if($what == "forum_numberofthreads" || $what == "all") { + $entry = new CacheEntry("forum_numberofthreads"); + + $forums = new Forums($FORUMS_DIR . "/forums.xml"); + foreach($forums->forums as $forum) { + $threads = new Threads($FORUMS_DIR . "/" . $forum->fid); + $entry->setValue($forum->fid, sizeof($threads->threads)); + } + $this->add($entry); + } + + + if($what == "forum_lastpost" || $what == "all") { + $entry = new CacheEntry("forum_lastpost"); + + $forums = new Forums($FORUMS_DIR . "/forums.xml"); + foreach($forums->forums as $forum) { + $threads = new Threads($FORUMS_DIR . "/" . $forum->fid); + + foreach($users->users as $user) { + + $unread = false; + foreach($threads->threads as $thread) { + if($thread->lastseen[$user->uid] < $thread->lastpost) { + $unread = true; + break; + } + } + + $entry->setValue($forum->fid . "-" . $user->uid, $unread); + } + + } + $this->add($entry); + } + + + $this->write(); + } + + public function add($entry) { + $key = $entry->id; + $this->entries[$key] = $entry; + } + + public function write() + { + $fp = fopen($this->file, "w"); + + $block = TRUE; + flock($fp, LOCK_EX, $block); // do an exclusive lock + + fwrite($fp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + + fwrite($fp, "<cache>\n"); + foreach($this->entries as $entry) { + $entry->write($fp); + } + fwrite($fp, "</cache>\n"); + + fclose($fp); + } + + public function get($id) + { + return $this->entries[$id]; + } + + private function read() + { + $dom = new DomDocument; + $dom->preserveWhiteSpace = FALSE; + $dom->load($this->file); + $ces = $dom->getElementsByTagName('entry'); + + foreach($ces as $c) { + $entry = new CacheEntry($c->getAttribute('id')); + foreach($c->childNodes as $v) { + if($v->tagName != "value") continue; + $entry->setValue($v->getAttribute('key'), $v->textContent); + } + + $this->add($entry); + } + } + + public function Cache($file) + { + $this->file = $file; + if(file_exists($this->file)) $this->read(); + } + +} +?> |