mirror of
https://github.com/krateng/maloja.git
synced 2023-08-10 21:12:55 +03:00
52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
from .. import database
|
|
from . sqldb import engine
|
|
|
|
from .dbcache import serialize
|
|
|
|
from ..pkg_global.conf import malojaconfig
|
|
|
|
from doreah.logging import log
|
|
|
|
|
|
# this is a wrapper object that provides a DB connection so that one jinja page
|
|
# (with all its included partials) can use it for all functions
|
|
# it also translates the non-unpacked calls to unpacked calls that the DB wants
|
|
# it also maintains a request-local cache since many webpages use the same stats
|
|
# several times
|
|
class JinjaDBConnection:
|
|
def __init__(self):
|
|
self.cache = {}
|
|
self.hits = 0
|
|
self.misses = 0
|
|
def __enter__(self):
|
|
self.conn = engine.connect()
|
|
return self
|
|
def __exit__(self, exc_type, exc_value, exc_traceback):
|
|
self.conn.close()
|
|
if malojaconfig['USE_REQUEST_CACHE']:
|
|
log(f"Generated page with {self.hits}/{self.hits+self.misses} local Cache hits",module="debug_performance")
|
|
del self.cache
|
|
def __getattr__(self,name):
|
|
originalmethod = getattr(database,name)
|
|
|
|
def packedmethod(*keys):
|
|
kwargs = {}
|
|
for k in keys:
|
|
kwargs.update(k)
|
|
if malojaconfig['USE_REQUEST_CACHE']:
|
|
cachekey = serialize((id(originalmethod),kwargs))
|
|
if cachekey in self.cache:
|
|
self.hits += 1
|
|
return self.cache[cachekey]
|
|
else:
|
|
self.misses += 1
|
|
result = originalmethod(**kwargs,dbconn=self.conn)
|
|
self.cache[cachekey] = result
|
|
return result
|
|
else:
|
|
result = originalmethod(**kwargs,dbconn=self.conn)
|
|
return result
|
|
|
|
|
|
return packedmethod
|