add a persistent cache of URL lookups, and fix up the in-memory one to work

This commit is contained in:
Matthew Hodgson 2016-04-03 00:31:57 +01:00
parent d1b154a10f
commit 7426c86eb8
4 changed files with 137 additions and 14 deletions

View file

@ -25,7 +25,7 @@ class MediaRepositoryStore(SQLBaseStore):
def get_local_media(self, media_id):
"""Get the metadata for a local piece of media
Returns:
None if the meia_id doesn't exist.
None if the media_id doesn't exist.
"""
return self._simple_select_one(
"local_media_repository",
@ -50,6 +50,58 @@ class MediaRepositoryStore(SQLBaseStore):
desc="store_local_media",
)
def get_url_cache(self, url, ts):
"""Get the media_id and ts for a cached URL as of the given timestamp
Returns:
None if the URL isn't cached.
"""
def get_url_cache_txn(txn):
# get the most recently cached result (relative to the given ts)
sql = (
"SELECT response_code, etag, expires, og, media_id, max(download_ts)"
" FROM local_media_repository_url_cache"
" WHERE url = ? AND download_ts <= ?"
)
txn.execute(sql, (url, ts))
row = txn.fetchone()
if not row[3]:
# ...or if we've requested a timestamp older than the oldest
# copy in the cache, return the oldest copy (if any)
sql = (
"SELECT response_code, etag, expires, og, media_id, min(download_ts)"
" FROM local_media_repository_url_cache"
" WHERE url = ? AND download_ts > ?"
)
txn.execute(sql, (url, ts))
row = txn.fetchone()
if not row[3]:
return None
return dict(zip((
'response_code', 'etag', 'expires', 'og', 'media_id', 'download_ts'
), row))
return self.runInteraction(
"get_url_cache", get_url_cache_txn
)
def store_url_cache(self, url, response_code, etag, expires, og, media_id, download_ts):
return self._simple_insert(
"local_media_repository_url_cache",
{
"url": url,
"response_code": response_code,
"etag": etag,
"expires": expires,
"og": og,
"media_id": media_id,
"download_ts": download_ts,
},
desc="store_url_cache",
)
def get_local_media_thumbnails(self, media_id):
return self._simple_select_list(
"local_media_repository_thumbnails",