source: TI02-CSML/trunk/services/3rdParty/tilecache-1.4/TileCache/Cache.py @ 2202

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/services/3rdParty/tilecache-1.4/TileCache/Cache.py@2202
Revision 2202, 3.9 KB checked in by lawrence, 13 years ago (diff)

Adding tilecache to the "interesting" OGC services already implemented
in python.

Line 
1# BSD Licensed, Copyright (c) 2006 MetaCarta, Inc.
2import os, sys, time
3from warnings import warn
4
5class Cache (object):
6    def __init__ (self, timeout = 30.0, **kwargs):
7        self.timeout = float(timeout)
8
9    def lock (self, tile, blocking = True):
10        result = self.attemptLock(tile)
11        if result:
12            return True
13        elif not blocking:
14            return False
15        while result is not True:
16            time.sleep(0.25)
17            result = self.attemptLock(tile)
18        return True
19
20    def getLockName (self, tile):
21        return self.getKey(tile) + ".lck"
22
23    def getKey (self, tile):
24        raise NotImplementedError()
25
26    def attemptLock (self, tile):
27        raise NotImplementedError()
28
29    def unlock (self, tile):
30        raise NotImplementedError()
31
32    def get (self, tile):
33        raise NotImplementedError()
34
35    def set (self, tile, data):
36        raise NotImplementedError()
37   
38    def delete(self, tile):
39        raise NotImplementedError()
40
41class MemoryCache (Cache):
42    def __init__ (self, servers = ['127.0.0.1:11211']):
43        import memcache
44        if type(servers) is str: servers = map(str.strip, servers.split(","))
45        self.cache = memcache.Client(servers, debug=0)
46   
47    def getKey(self, tile):
48         return "/".join(map(str, [tile.layer.name, tile.x, tile.y, tile.z]))
49       
50    def get(self, tile):
51        key = self.getKey(tile)
52        tile.data = self.cache.get(key)
53        return tile.data
54   
55    def set(self, tile, data):
56        key = self.getKey(tile)
57        self.cache.set(key, data)
58        return data
59   
60    def delete(self, tile):
61        key = self.getKey(tile)
62        self.cache.delete(key)
63
64    def attemptLock (self, tile):
65        return self.cache.add( self.getLockName(tile), "0", 
66                               time.time() + self.timeout)
67   
68    def unlock (self, tile):
69        self.cache.delete( self.getLockName() )
70
71class DiskCache (Cache):
72    def __init__ (self, base = None, perms = 0777):
73        self.basedir = base
74        if not os.access(base, os.R_OK):
75            os.makedirs(base, perms)
76
77    def getKey (self, tile):
78        components = ( self.basedir,
79                       tile.layer.name,
80                       "%02d" % tile.z,
81                       "%03d" % int(tile.x / 1000000),
82                       "%03d" % (int(tile.x / 1000) % 1000),
83                       "%03d" % (int(tile.x) % 1000),
84                       "%03d" % int(tile.y / 1000000),
85                       "%03d" % (int(tile.y / 1000) % 1000),
86                       "%03d.%s" % (int(tile.y) % 1000, tile.layer.extension)
87                    )
88        filename = os.path.join( *components )
89        return filename
90
91    def get (self, tile):
92        filename = self.getKey(tile)
93        if os.access(filename, os.R_OK):
94            tile.data = file(filename, "rb").read()
95            return tile.data
96        else:
97            return None
98
99    def set (self, tile, data):
100        filename = self.getKey(tile)
101        dirname  = os.path.dirname(filename)
102        if not os.access(dirname, os.W_OK):
103            os.makedirs(dirname)
104        tmpfile = filename + ".%d.tmp" % os.getpid()
105        output = file(tmpfile, "wb")
106        output.write(data)
107        output.close()
108        try:
109            os.rename(tmpfile, filename)
110        except OSError:
111            os.unlink(filename)
112            os.rename(tmpfile, filename)
113        tile.data = data
114        return data
115   
116    def delete (self, tile):
117        filename = self.getKey(tile)
118        if os.access(filename, os.R_OK):
119            os.unlink(filename)
120           
121    def attemptLock (self, tile):
122        name = self.getLockName(tile)
123        try: 
124            os.makedirs(name)
125            return True
126        except OSError:
127            return False 
128     
129    def unlock (self, tile):
130        name = self.getLockName(tile)
131        try:
132            os.rmdir(name)
133        except OSError, E:
134            print >>sys.stderr, "unlock %s failed: %s" % (name, str(E))
Note: See TracBrowser for help on using the repository browser.