diff FileCacheSet.inc @ 69:dd4ddedca4c5

Add convenience header ScriptIncludeCache Split CacheTimeCheck and FileCacheSet
author Tom Fredrik "BFG" Klaussen <bfg@blenning.no>
date Thu, 11 Oct 2012 23:32:14 +0200
parents
children 62b9d7a35658
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FileCacheSet.inc	Thu Oct 11 23:32:14 2012 +0200
@@ -0,0 +1,119 @@
+<?php
+$baseDir = dirname(__FILE__);
+
+include_once 'Logger.inc';
+$cache = ScriptIncludeCache::instance(__FILE__);
+$cache->cache_time("${baseDir}/Logger.inc");
+
+class FileCacheSet {
+  private $newest = 0;
+  private $files = array();
+  private $parentCaches = array();
+
+  protected function __construct($parent = null) {
+    if ($parent) {
+      $this->addParent($parent);
+    }
+  }
+
+  protected function addParent($parent)
+  {
+    array_push($this->parentCaches, $parent);
+  }
+
+  /**
+   * List a set of files which contributes to this pages cacheset.
+   *
+   * @param $humanReadable If the timestamp should be humand readable.
+   *
+   * @return an associative array of file, and timestamp
+   */
+  function cacheSet($humanReadable = False)
+  {
+    $retVal = array();
+    foreach ($this->parentCaches as $parent) {
+      $retVal = array_merge($retVal, $parent->cacheSet($humanReadable));
+    }
+    foreach($this->files as $file) {
+      $mtime = filemtime($file);
+      if ($humanReadable)
+	$mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
+
+      $retVal[$file] = $mtime;
+    }
+    return $retVal;
+  }
+
+  /**
+   * Include a file in the cacheset
+   *
+   * @param $path the path of the file
+   */
+  function cache_time($path)
+  {
+    if (!file_exists($path)) {
+      Logger::warn("${path} does not exist");
+      errorPage("Resource is not available");
+    }
+
+    array_push($this->files, $path);
+    $mtime = filemtime($path);
+    if ($mtime > $this->newest) {
+      $this->newest = $mtime;
+    }
+  }
+
+  function getNewest()
+  {
+    $newest = 0;
+    foreach ($this->parentCaches as $parent) {
+      $newest = max($newest, $parent->getNewest());
+    }
+    $newest = max($newest, $this->newest);
+    return $newest;
+  }
+}
+
+class ScriptIncludeCache extends FileCacheSet
+{
+  private static $myInstance = 0;
+
+  protected function __construct($filename = False)
+  {
+    parent::__construct();
+    if ($filename)
+      $this->cache_time($filename);
+    $this->cache_time(__FILE__);
+  }
+
+  /**
+   * Generates a singleton instance of this CacheTimeCheck
+   *
+   * @param $filename an optional file to include in the cacheset
+   *
+   * @return a CacheTimeCheck object
+   */
+  function instance($filename = False)
+  {
+    if (! self::$myInstance)
+      self::$myInstance = new self($filename);
+    elseif ($filename)
+      self::$myInstance->cache_time($filename);
+    return self::$myInstance;
+  }
+
+  /**
+   * Convenience function to include a file, and add it to the cacheset.
+   *
+   * @param $path path of the file
+   * @param $basedir a directory to prepend to the path
+   */
+  function includeOnce($path, $basedir = false)
+  {
+    if ($basedir)
+      $path = $basedir . "/" . $path;
+    $this->cache_time($path);
+    include_once($path);
+  }
+}
+?>
\ No newline at end of file