This commit is contained in:
Haoming 2025-07-31 14:56:52 +08:00
parent b343ae4753
commit e3a2f78f67

View File

@ -1,56 +1,16 @@
import json
import os
import os.path
import threading
import diskcache
import tqdm
import os
from modules.paths import data_path, script_path
from modules.paths import data_path
cache_filename = os.environ.get('SD_WEBUI_CACHE_FILE', os.path.join(data_path, "cache.json"))
cache_dir = os.environ.get('SD_WEBUI_CACHE_DIR', os.path.join(data_path, "cache"))
caches = {}
cache_lock = threading.Lock()
cache_dir = os.environ.get("SD_WEBUI_CACHE_DIR", os.path.join(data_path, "cache"))
caches = {}
def dump_cache():
"""old function for dumping cache to disk; does nothing since diskcache."""
pass
def make_cache(subsection: str) -> diskcache.Cache:
return diskcache.Cache(
os.path.join(cache_dir, subsection),
size_limit=2**32, # 4 GB, culling oldest first
disk_min_file_size=2**18, # keep up to 256KB in Sqlite
)
def convert_old_cached_data():
try:
with open(cache_filename, "r", encoding="utf8") as file:
data = json.load(file)
except FileNotFoundError:
return
except Exception:
os.replace(cache_filename, os.path.join(script_path, "tmp", "cache.json"))
print('[ERROR] issue occurred while trying to read cache.json; old cache has been moved to tmp/cache.json')
return
total_count = sum(len(keyvalues) for keyvalues in data.values())
with tqdm.tqdm(total=total_count, desc="converting cache") as progress:
for subsection, keyvalues in data.items():
cache_obj = caches.get(subsection)
if cache_obj is None:
cache_obj = make_cache(subsection)
caches[subsection] = cache_obj
for key, value in keyvalues.items():
cache_obj[key] = value
progress.update(1)
dump_cache = lambda: None
"""does nothing since diskcache"""
def cache(subsection):
@ -67,12 +27,9 @@ def cache(subsection):
cache_obj = caches.get(subsection)
if not cache_obj:
with cache_lock:
if not os.path.exists(cache_dir) and os.path.isfile(cache_filename):
convert_old_cached_data()
cache_obj = caches.get(subsection)
if not cache_obj:
cache_obj = make_cache(subsection)
cache_obj = diskcache.Cache(os.path.join(cache_dir, subsection))
caches[subsection] = cache_obj
return cache_obj
@ -91,7 +48,7 @@ def cached_data_for_file(subsection, title, filename, func):
Returns:
dict or None: The cached or generated data, or None if data generation fails.
The `cached_data_for_file` function implements a caching mechanism for data stored in files.
The function implements a caching mechanism for data stored in files.
It checks if the data associated with the given `title` is present in the cache and compares the
modification time of the file with the cached modification time. If the file has been modified,
the cache is considered invalid and the data is regenerated using the provided `func`.
@ -110,14 +67,14 @@ def cached_data_for_file(subsection, title, filename, func):
if ondisk_mtime > cached_mtime:
entry = None
if not entry or 'value' not in entry:
if not entry or "value" not in entry:
value = func()
if value is None:
return None
entry = {'mtime': ondisk_mtime, 'value': value}
entry = {"mtime": ondisk_mtime, "value": value}
existing_cache[title] = entry
dump_cache()
return entry['value']
return entry["value"]