epicyon/cache.py

81 lines
2.7 KiB
Python
Raw Normal View History

2020-03-22 20:36:19 +00:00
__filename__="cache.py"
__author__="Bob Mottram"
__license__="AGPL3+"
__version__="1.1.0"
__maintainer__="Bob Mottram"
__email__="bob@freedombone.net"
__status__="Production"
2019-06-30 15:03:26 +00:00
2019-08-20 09:16:03 +00:00
import os
2019-08-20 10:28:48 +00:00
import time
2019-06-30 15:18:40 +00:00
import datetime
2019-10-22 11:55:06 +00:00
from utils import loadJson
from utils import saveJson
2020-03-22 21:16:02 +00:00
2019-08-20 09:16:03 +00:00
def storePersonInCache(baseDir: str,personUrl: str,personJson: {},personCache: {}) -> None:
2019-06-30 15:03:26 +00:00
"""Store an actor in the cache
"""
2019-06-30 15:18:40 +00:00
currTime=datetime.datetime.utcnow()
2019-07-06 17:00:22 +00:00
personCache[personUrl]={
"actor": personJson,
"timestamp": currTime.strftime("%Y-%m-%dT%H:%M:%SZ")
}
2019-08-20 09:16:03 +00:00
if not baseDir:
return
# store to file
2019-08-20 21:26:24 +00:00
if os.path.isdir(baseDir+'/cache/actors'):
cacheFilename=baseDir+'/cache/actors/'+personUrl.replace('/','#')+'.json'
if not os.path.isfile(cacheFilename):
2019-10-22 11:55:06 +00:00
saveJson(personJson,cacheFilename)
2019-06-30 15:03:26 +00:00
2019-08-20 09:37:09 +00:00
def getPersonFromCache(baseDir: str,personUrl: str,personCache: {}) -> {}:
2019-06-30 15:03:26 +00:00
"""Get an actor from the cache
"""
2019-08-20 09:37:09 +00:00
# if the actor is not in memory then try to load it from file
2019-08-20 09:50:27 +00:00
loadedFromFile=False
2019-08-20 09:37:09 +00:00
if not personCache.get(personUrl):
cacheFilename=baseDir+'/cache/actors/'+personUrl.replace('/','#')+'.json'
if os.path.isfile(cacheFilename):
2019-10-22 11:55:06 +00:00
personJson=loadJson(cacheFilename)
if personJson:
2019-08-20 09:37:09 +00:00
storePersonInCache(baseDir,personUrl,personJson,personCache)
2019-08-20 09:50:27 +00:00
loadedFromFile=True
2020-03-22 21:16:02 +00:00
2019-06-30 15:03:26 +00:00
if personCache.get(personUrl):
2019-08-20 09:50:27 +00:00
if not loadedFromFile:
# update the timestamp for the last time the actor was retrieved
currTime=datetime.datetime.utcnow()
personCache[personUrl]['timestamp']=currTime.strftime("%Y-%m-%dT%H:%M:%SZ")
2019-08-20 09:37:09 +00:00
return personCache[personUrl]['actor']
return None
def expirePersonCache(personCache: {}):
"""Expires old entries from the cache in memory
"""
currTime=datetime.datetime.utcnow()
removals=[]
for personUrl,cacheJson in personCache.items():
2019-07-06 17:00:22 +00:00
cacheTime= \
2019-08-20 09:37:09 +00:00
datetime.datetime.strptime(cacheJson['timestamp'], \
2019-07-06 17:00:22 +00:00
"%Y-%m-%dT%H:%M:%SZ")
2019-06-30 15:18:40 +00:00
daysSinceCached=(currTime - cacheTime).days
2019-08-20 09:37:09 +00:00
if daysSinceCached > 2:
removals.append(personUrl)
if len(removals)>0:
for personUrl in removals:
del personCache[personUrl]
print(str(len(removals))+' actors were expired from the cache')
def storeWebfingerInCache(handle: str,wf,cachedWebfingers: {}) -> None:
"""Store a webfinger endpoint in the cache
"""
cachedWebfingers[handle]=wf
2019-06-30 15:03:26 +00:00
2019-07-01 14:30:48 +00:00
def getWebfingerFromCache(handle: str,cachedWebfingers: {}) -> {}:
2019-06-30 15:03:26 +00:00
"""Get webfinger endpoint from the cache
"""
if cachedWebfingers.get(handle):
return cachedWebfingers[handle]
return None