import sqlite3 import json import time import requests from typing import Any, Optional class CacheManager: def __init__(self, db_name: str = 'pokemon_cache.db'): self.conn = sqlite3.connect(db_name) self.cursor = self.conn.cursor() self._create_cache_table() def _create_cache_table(self): self.cursor.execute(''' CREATE TABLE IF NOT EXISTS cache ( key TEXT PRIMARY KEY, value TEXT, timestamp FLOAT ) ''') self.conn.commit() def get(self, key: str) -> Optional[Any]: self.cursor.execute('SELECT value, timestamp FROM cache WHERE key = ?', (key,)) result = self.cursor.fetchone() if result: value, timestamp = result return json.loads(value) return None def set(self, key: str, value: Any): serialized_value = json.dumps(value) timestamp = time.time() self.cursor.execute(''' INSERT OR REPLACE INTO cache (key, value, timestamp) VALUES (?, ?, ?) ''', (key, serialized_value, timestamp)) self.conn.commit() def fetch_url(self, url: str, force_refresh: bool = False, expiry: int = 86400) -> Optional[str]: cache_key = f"url_{url}" if not force_refresh: cached_data = self.get(cache_key) if cached_data: cached_time = cached_data['timestamp'] if time.time() - cached_time < expiry: return cached_data['content'] print(f"Fetching URL: {url}") response = requests.get(url) if response.status_code == 200: content = response.text self.set(cache_key, { 'content': content, 'timestamp': time.time() }) return content return None def close(self): self.conn.close() # Usage example if __name__ == "__main__": cache = CacheManager() # Example usage url = "https://example.com" data = cache.fetch_url(url) if data: print("Data fetched successfully") else: print("Failed to fetch data") cache.close()