summaryrefslogtreecommitdiff
path: root/forum/utils/cache.php
diff options
context:
space:
mode:
Diffstat (limited to 'forum/utils/cache.php')
-rw-r--r--forum/utils/cache.php147
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();
+ }
+
+}
+?>