| | import sqlite3 |
| | from pathlib import Path |
| | from typing import List, Tuple |
| | import json |
| |
|
| |
|
| | class Database: |
| | def __init__(self, db_path=None): |
| | if db_path is None: |
| | raise ValueError("db_path must be provided") |
| | self.db_path = db_path |
| | self.db_file = self.db_path / "cache.db" |
| | if not self.db_file.exists(): |
| | print("Creating database") |
| | print("DB_FILE", self.db_file) |
| | db = sqlite3.connect(self.db_file) |
| | with open(Path("schema.sql"), "r") as f: |
| | db.executescript(f.read()) |
| | db.commit() |
| | db.close() |
| |
|
| | def get_db(self): |
| | db = sqlite3.connect(self.db_file, check_same_thread=False) |
| | db.row_factory = sqlite3.Row |
| | return db |
| |
|
| | def __enter__(self): |
| | self.db = self.get_db() |
| | return self.db |
| |
|
| | def __exit__(self, exc_type, exc_value, traceback): |
| | self.db.close() |
| |
|
| | def __call__(self): |
| | return self |
| |
|
| | def insert(self, data: List[Tuple[str, str, str]]): |
| | with self() as db: |
| | cursor = db.cursor() |
| | try: |
| | for entry in data: |
| | url, title, entries = entry |
| | cursor.execute( |
| | "INSERT OR REPLACE INTO cache (url, title, entries) VALUES (?, ?, ?)", |
| | (url, title, entries), |
| | ) |
| | except Exception as e: |
| | print(e) |
| | db.commit() |
| |
|
| | def filter(self, category: str): |
| | with self() as db: |
| | entries = db.execute("SELECT url, title, entries FROM cache").fetchall() |
| | out = [] |
| | for row in entries: |
| | |
| | data = json.loads(row["entries"]) |
| | try: |
| | data = [ |
| | { |
| | "title": entry["title"], |
| | "link": entry["link"], |
| | "published": entry["published"] |
| | if "published" in entry |
| | else entry["pubDate"] |
| | if "pubDate" in entry |
| | else "", |
| | "summary": entry["summary"] if "summary" in entry else "", |
| | } |
| | for entry in data["entries"] |
| | ] |
| | if len(data) > 0: |
| | out.append( |
| | { |
| | "entries": data, |
| | "url": row["url"], |
| | "title": row["title"], |
| | } |
| | ) |
| | except Exception as e: |
| | print(f"Errro on {row['url']}: {e}") |
| | return out |
| |
|