source: OpenRLabs-Git/deploy/rlabs-docker/web2py-rlabs/gluon/packages/dal/tests/caching.py

main
Last change on this file was 42bd667, checked in by David Fuertes <dfuertes@…>, 4 years ago

Historial Limpio

  • Property mode set to 100755
File size: 2.5 KB
Line 
1import time
2import pickle
3from pydal import DAL, Field
4from ._compat import unittest
5from ._adapt import DEFAULT_URI, IS_IMAP, IS_MSSQL
6from ._helpers import DALtest
7
8
9class SimpleCache(object):
10    storage = {}
11
12    def clear(self):
13        self.storage.clear()
14
15    def _encode(self, value):
16        return value
17
18    def _decode(self, value):
19        return value
20
21    def __call__(self, key, f, time_expire=300):
22        dt = time_expire
23        now = time.time()
24
25        item = self.storage.get(key, None)
26        if item and f is None:
27            del self.storage[key]
28
29        if f is None:
30            return None
31        if item and (dt is None or item[0] > now - dt):
32            return self._decode(item[1])
33
34        value = f()
35        self.storage[key] = (now, self._encode(value))
36        return value
37
38
39class PickleCache(SimpleCache):
40    def _encode(self, value):
41        return pickle.dumps(value, pickle.HIGHEST_PROTOCOL)
42
43    def _decode(self, value):
44        return pickle.loads(value)
45
46
47@unittest.skipIf(IS_IMAP, "TODO: IMAP test")
48class TestCache(DALtest):
49    def testRun(self):
50        cache = SimpleCache()
51        db = self.connect()
52        db.define_table("tt", Field("aa"))
53        db.tt.insert(aa="1")
54        r0 = db().select(db.tt.ALL)
55        r1 = db().select(db.tt.ALL, cache=(cache, 1000))
56        self.assertEqual(len(r0), len(r1))
57        r2 = db().select(db.tt.ALL, cache=(cache, 1000))
58        self.assertEqual(len(r0), len(r2))
59        r3 = db().select(db.tt.ALL, cache=(cache, 1000), cacheable=True)
60        self.assertEqual(len(r0), len(r3))
61        r4 = db().select(db.tt.ALL, cache=(cache, 1000), cacheable=True)
62        self.assertEqual(len(r0), len(r4))
63
64    @unittest.skipIf(IS_MSSQL, "Class nesting in ODBC driver breaks pickle")
65    def testPickling(self):
66        db = self.connect()
67        cache = (PickleCache(), 1000)
68        db.define_table(
69            "tt",
70            Field("aa"),
71            Field("bb", type="integer"),
72            Field("cc", type="decimal(5,2)"),
73        )
74        db.tt.insert(aa="1", bb=2, cc=3)
75        r0 = db(db.tt).select(db.tt.ALL)
76        csv0 = str(r0)
77        r1 = db(db.tt).select(db.tt.ALL, cache=cache)
78        self.assertEqual(csv0, str(r1))
79        r2 = db(db.tt).select(db.tt.ALL, cache=cache)
80        self.assertEqual(csv0, str(r2))
81        r3 = db(db.tt).select(db.tt.ALL, cache=cache, cacheable=True)
82        self.assertEqual(csv0, str(r3))
83        r4 = db(db.tt).select(db.tt.ALL, cache=cache, cacheable=True)
84        self.assertEqual(csv0, str(r4))
Note: See TracBrowser for help on using the repository browser.