| |
|
|
| import sqlite3 |
| from datetime import datetime |
| from pathlib import Path |
|
|
| DB_FILE = "notepad.db" |
|
|
| class Notebook: |
| def __init__(self, db_path=DB_FILE): |
| self.conn = sqlite3.connect(db_path) |
| self._init_db() |
|
|
| def _init_db(self): |
| c = self.conn.cursor() |
| c.execute(''' |
| CREATE TABLE IF NOT EXISTS notes ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| text TEXT NOT NULL, |
| source TEXT DEFAULT 'user', |
| timestamp TEXT NOT NULL, |
| read INTEGER DEFAULT 0, |
| tags TEXT |
| ) |
| ''') |
| self.conn.commit() |
|
|
| def add_note(self, text, source="user"): |
| ts = datetime.utcnow().isoformat() |
| self.conn.execute( |
| 'INSERT INTO notes (text, source, timestamp) VALUES (?, ?, ?)', |
| (text.strip(), source, ts) |
| ) |
| self.conn.commit() |
|
|
| def get_latest_notes(self, limit=10): |
| cursor = self.conn.cursor() |
| cursor.execute( |
| 'SELECT id, text, source, timestamp FROM notes ORDER BY id DESC LIMIT ?', |
| (limit,) |
| ) |
| return cursor.fetchall() |
|
|
| def get_notes_after(self, since_ts): |
| cursor = self.conn.cursor() |
| cursor.execute( |
| 'SELECT id, text, source, timestamp FROM notes WHERE timestamp > ? ORDER BY timestamp', |
| (since_ts,) |
| ) |
| return cursor.fetchall() |
|
|
| def get_first_unread_note(self): |
| cursor = self.conn.cursor() |
| cursor.execute( |
| "SELECT id, text, source, timestamp, tags FROM notes WHERE read = 0 ORDER BY id ASC LIMIT 1" |
| ) |
| return cursor.fetchone() |
|
|
| def mark_note_as_read(self, note_id: int): |
| self.conn.execute( |
| "UPDATE notes SET read = 1 WHERE id = ?", |
| (note_id,) |
| ) |
| self.conn.commit() |
|
|
| def set_tags(self, note_id: int, tags: list[str]): |
| tag_str = ",".join(tags) |
| self.conn.execute( |
| "UPDATE notes SET tags = ? WHERE id = ?", |
| (tag_str, note_id) |
| ) |
| self.conn.commit() |
|
|
| def get_random_note_by_tags(self, include_tags: list[str]): |
| cursor = self.conn.cursor() |
| like_clauses = " OR ".join(["tags LIKE ?"] * len(include_tags)) |
| values = [f"%{tag}%" for tag in include_tags] |
| query = f""" |
| SELECT id, text, source, timestamp, tags |
| FROM notes |
| WHERE ({like_clauses}) |
| ORDER BY RANDOM() |
| LIMIT 1 |
| """ |
| cursor.execute(query, values) |
| return cursor.fetchone() |
|
|
| def close(self): |
| self.conn.close() |
|
|