+++ /dev/null
-#----------------------------------------------------------------------------
-# Name: cachedloader.py
-# Purpose:
-#
-# Author: Joel Hare
-#
-# Created: 8/31/04
-# CVS-ID: $Id$
-# Copyright: (c) 2004-2005 ActiveGrid, Inc.
-# License: wxWindows License
-#----------------------------------------------------------------------------
-
-import copy
-import os.path
-import string
-import cStringIO
-
-import time
-
-# TODO: Instantiate the database and create a pool
-
-
-class CachedLoader(object):
- def __init__(self):
- self.cache = {}
- self.baseLoadDir = None
-
- def fullPath(self, fileName):
- if os.path.isabs(fileName):
- absPath = fileName
- elif self.baseLoadDir:
- absPath = os.path.join(self.baseLoadDir, fileName)
- else:
- absPath = os.path.abspath(fileName)
- return absPath
-
- def setPrototype(self, fileName, loadedFile):
- absPath = self.fullPath(fileName)
- mtime = time.time() + 31536000.0 # Make sure prototypes aren't replaced by files on disk
- self.cache[absPath] = (mtime, loadedFile)
-
- def update(self, loader):
- self.cache.update(loader.cache)
-
- def clear(self):
- self.cache.clear()
-
- def delete(self, fileName):
- absPath = self.fullPath(fileName)
- del self.cache[absPath]
-
- def needsLoad(self, fileName):
- absPath = self.fullPath(fileName)
- try:
- cached = self.cache[absPath]
- cachedTime = cached[0]
- if cachedTime >= os.path.getmtime(absPath):
- return False
- except KeyError:
- pass
- return True
-
- def load(self, fileName, loader):
- absPath = self.fullPath(fileName)
- loadedFile = None
- try:
- cached = self.cache[absPath]
- except KeyError:
- cached = None
-
- if cached:
- cachedTime = cached[0]
- # ToDO We might need smarter logic for checking if a file needs to be reloaded
- # ToDo We need a way to disable checking if this is a production server
- if cachedTime >= os.path.getmtime(absPath):
- loadedFile = cached[1]
-
- if not loadedFile:
- targetFile = file(absPath)
- try:
- mtime = os.path.getmtime(absPath)
- loadedFile = loader(targetFile)
- self.cache[absPath] = (mtime, loadedFile)
- finally:
- targetFile.close()
- return loadedFile
-