Store: fix NPS refresh, scan race, thread cleanup, and matching perf
This commit is contained in:
+29
-15
@@ -23,6 +23,9 @@ _miss_db = {}
|
||||
_miss_loaded = False
|
||||
_MISS_TTL = 86400.0 # retry failed metadata after 1 day
|
||||
|
||||
# Memoised release-date table (invalidated on save/reset).
|
||||
_dates_cache = None
|
||||
|
||||
|
||||
def _load_miss_db():
|
||||
global _miss_loaded
|
||||
@@ -122,6 +125,7 @@ def save(release_id, system, meta, manual=False, title=None):
|
||||
)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
_invalidate_dates_cache()
|
||||
return True
|
||||
except sqlite3.Error:
|
||||
return False
|
||||
@@ -140,6 +144,7 @@ def reset(release_id, system):
|
||||
)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
_invalidate_dates_cache()
|
||||
except sqlite3.Error:
|
||||
pass
|
||||
|
||||
@@ -161,23 +166,32 @@ def cached_release_dates():
|
||||
"""Return {(release_id, system): release_date} from cached metadata only.
|
||||
|
||||
Pure DB read — no network — so list views can show a release date without
|
||||
triggering API fetches for every row.
|
||||
triggering API fetches for every row. Result is memoised and invalidated
|
||||
whenever metadata is saved.
|
||||
"""
|
||||
out = {}
|
||||
try:
|
||||
conn = get_connection(config.DB_PATH)
|
||||
rows = conn.execute("SELECT release_id, system, meta_json FROM item_info").fetchall()
|
||||
conn.close()
|
||||
except sqlite3.Error:
|
||||
return {}
|
||||
for r in rows:
|
||||
global _dates_cache
|
||||
if _dates_cache is None:
|
||||
out = {}
|
||||
try:
|
||||
meta = json.loads(r["meta_json"] or "{}")
|
||||
except (TypeError, ValueError):
|
||||
continue
|
||||
if isinstance(meta, dict) and meta.get("release_date"):
|
||||
out[(r["release_id"], r["system"])] = meta["release_date"]
|
||||
return out
|
||||
conn = get_connection(config.DB_PATH)
|
||||
rows = conn.execute("SELECT release_id, system, meta_json FROM item_info").fetchall()
|
||||
conn.close()
|
||||
except sqlite3.Error:
|
||||
return out
|
||||
for r in rows:
|
||||
try:
|
||||
meta = json.loads(r["meta_json"] or "{}")
|
||||
except (TypeError, ValueError):
|
||||
continue
|
||||
if isinstance(meta, dict) and meta.get("release_date"):
|
||||
out[(r["release_id"], r["system"])] = meta["release_date"]
|
||||
_dates_cache = out
|
||||
return _dates_cache
|
||||
|
||||
|
||||
def _invalidate_dates_cache():
|
||||
global _dates_cache
|
||||
_dates_cache = None
|
||||
|
||||
|
||||
def get_or_fetch(release_id, system, fetch_title):
|
||||
|
||||
Reference in New Issue
Block a user