1f780e48af
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33440 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
88 lines
2.5 KiB
Python
88 lines
2.5 KiB
Python
#----------------------------------------------------------------------------
|
|
# 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
|
|
|