From 83bdfa838a4a153bcb55c25047111b9da72abf8d Mon Sep 17 00:00:00 2001 From: winkey Date: Sun, 6 Nov 2011 19:05:46 +0000 Subject: [PATCH] add layer config item expired to "expire" tiles based on a timestamp test the mtime of each tile against the layer config expired setting and rebuild if nessasary Disk cache ONLY! --- tilecache/TileCache/Caches/Disk.py | 35 ++++++++++++++++++++++++++++++ tilecache/TileCache/Layer.py | 22 ++++++++++++++++--- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/tilecache/TileCache/Caches/Disk.py b/tilecache/TileCache/Caches/Disk.py index 23e6c0e..c7f0141 100644 --- a/tilecache/TileCache/Caches/Disk.py +++ b/tilecache/TileCache/Caches/Disk.py @@ -46,6 +46,33 @@ def access(self, path, type='read'): else: return os.access(path, os.W_OK) + ########################################################################### + ## + ## @brief test a tile to see if it has expired + ## + ## @param path the full path to the tile to test + ## @param TileCache::Layer the layer + ## + ## @return true if expire time on the layer is less than the tiles mtime, + ## or false in any other case + ## + ########################################################################### + + def isExpired(self, path, layer): + + if layer.expired != None: + + try: + mtime = os.stat(path).st_mtime + except Exception, E: + raise Exception( "isExpired %s %s\n", (path, E) ) + return False + + if mtime < layer.expired: + return True + + return False + def getKey (self, tile): components = ( self.basedir, tile.layer.name, @@ -72,8 +99,16 @@ def getKey (self, tile): ########################################################################### def get (self, tile): + filename = self.getKey(tile) if self.access(filename, 'read'): + + ##### test if the tile has expired ##### + + if self.isExpired(filename, tile.layer) and not self.readonly: + os.unlink(filename) + return None + if self.sendfile: return filename else: diff --git a/tilecache/TileCache/Layer.py b/tilecache/TileCache/Layer.py index 430580d..e94802c 100644 --- a/tilecache/TileCache/Layer.py +++ b/tilecache/TileCache/Layer.py @@ -1,6 +1,6 @@ # BSD Licensed, Copyright (c) 2006-2010 TileCache Contributors -import os, sys +import os, sys, time from warnings import warn from Client import WMS from Service import TileCacheException @@ -100,7 +100,8 @@ class Layer (object): "watermarkimage", "watermarkopacity", "extent_type", "tms_type", "units", "mime_type", "paletted", - "spherical_mercator", "metadata") + "spherical_mercator", "metadata", + "expired") config_properties = [ {'name':'spherical_mercator', 'description':'Layer is in spherical mercator. (Overrides bbox, maxresolution, SRS, Units)', 'type': 'boolean'}, @@ -109,6 +110,7 @@ class Layer (object): {'name':'bbox', 'description':'Bounding box of the layer grid', 'default':'-180,-90,180,90'}, {'name':'srs', 'description':'Spatial Reference System for the layer', 'default':'EPSG:4326'}, {'name':'data_extent', 'description':'Bounding box of the layer data. (Same SRS as the layer grid.)', 'default':"", 'type': 'map'}, + {'name':'expired', 'description':'Timestamp of latest change to source data.', 'default':""} ] def __init__ (self, name, layers = None, bbox = (-180, -90, 180, 90), @@ -118,7 +120,8 @@ def __init__ (self, name, layers = None, bbox = (-180, -90, 180, 90), extension = "png", mime_type = None, cache = None, debug = True, watermarkimage = None, watermarkopacity = 0.2, spherical_mercator = False, - extent_type = "strict", units = "degrees", tms_type = "", **kwargs ): + extent_type = "strict", units = "degrees", tms_type = "", + expired = None, **kwargs ): """Take in parameters, usually from a config file, and create a Layer. >>> l = Layer("Name", bbox="-12,17,22,36", debug="no") @@ -201,6 +204,19 @@ def __init__ (self, name, layers = None, bbox = (-180, -90, 180, 90), self.watermarkopacity = float(watermarkopacity) self.metadata = {} + + if expired == None: + self.expired = None + + else: + try: + os.environ['TZ'] = 'UTC' + time.tzset() + mytime = time.strptime(expired, "%Y-%m-%dT%H:%M:%SZ") + self.expired = time.mktime(mytime) + except: + sys.stderr.write("invalid expired timestamp format on layer %s\n" % name) + self.expired = None; prefix_len = len("metadata_") for key in kwargs: