Spaces:
Runtime error
Runtime error
| # database/posts.py | |
| import logging | |
| from database.connection import get_conn | |
| logger = logging.getLogger(__name__) | |
| def post_exists(message_id: int, channel_id: int) -> bool: | |
| conn = get_conn() | |
| try: | |
| c = conn.cursor() | |
| c.execute( | |
| "SELECT id FROM posts WHERE message_id=? AND channel_id=?", | |
| (message_id, channel_id) | |
| ) | |
| return c.fetchone() is not None | |
| except Exception as e: | |
| logger.error(f"post_exists: {e}", exc_info=True) | |
| return False | |
| finally: | |
| conn.close() | |
| def insert_post( | |
| message_id: int, | |
| channel_id: int, | |
| channel_username: str, | |
| text_original: str, | |
| text_normalized: str, | |
| hashtags: str, | |
| platform: str, | |
| has_media: int, | |
| media_type: str, | |
| posted_at: str, | |
| ) -> bool: | |
| conn = get_conn() | |
| try: | |
| c = conn.cursor() | |
| c.execute(""" | |
| INSERT OR IGNORE INTO posts | |
| (message_id, channel_id, channel_username, text_original, | |
| text_normalized, hashtags, platform, has_media, media_type, posted_at) | |
| VALUES (?,?,?,?,?,?,?,?,?,?) | |
| """, ( | |
| message_id, channel_id, channel_username, text_original, | |
| text_normalized, hashtags, platform, has_media, media_type, posted_at | |
| )) | |
| conn.commit() | |
| inserted = c.rowcount > 0 | |
| if inserted: | |
| logger.info( | |
| f"[DB] فُهرس msg_id={message_id} platform={platform} " | |
| f"text='{text_original[:40]}'" | |
| ) | |
| return inserted | |
| except Exception as e: | |
| logger.error(f"insert_post: {e}", exc_info=True) | |
| return False | |
| finally: | |
| conn.close() | |
| def delete_post(message_id: int, channel_id: int) -> bool: | |
| conn = get_conn() | |
| try: | |
| c = conn.cursor() | |
| c.execute( | |
| "DELETE FROM posts WHERE message_id=? AND channel_id=?", | |
| (message_id, channel_id) | |
| ) | |
| conn.commit() | |
| return c.rowcount > 0 | |
| except Exception as e: | |
| logger.error(f"delete_post: {e}", exc_info=True) | |
| return False | |
| finally: | |
| conn.close() | |
| def get_total() -> int: | |
| conn = get_conn() | |
| try: | |
| return conn.execute("SELECT COUNT(*) FROM posts").fetchone()[0] | |
| except Exception: | |
| return 0 | |
| finally: | |
| conn.close() | |
| def get_stats_by_platform() -> list[dict]: | |
| conn = get_conn() | |
| try: | |
| c = conn.cursor() | |
| c.execute(""" | |
| SELECT COALESCE(platform,'عام') AS platform, COUNT(*) AS cnt | |
| FROM posts GROUP BY platform ORDER BY cnt DESC | |
| """) | |
| return [dict(r) for r in c.fetchall()] | |
| except Exception: | |
| return [] | |
| finally: | |
| conn.close() | |
| def rebuild_fts() -> bool: | |
| conn = get_conn() | |
| try: | |
| conn.execute("INSERT INTO posts_fts(posts_fts) VALUES('rebuild')") | |
| conn.commit() | |
| return True | |
| except Exception as e: | |
| logger.error(f"rebuild_fts: {e}", exc_info=True) | |
| return False | |
| finally: | |
| conn.close() | |