Spaces:
Running on Zero
Running on Zero
File size: 6,808 Bytes
1b38924 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | import sqlite3
import datetime
from typing import List, Dict, Any, Optional
from config import DB_PATH
def get_connection():
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
return conn
def init_db():
"""Veritabanı tablolarını oluşturur."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS papers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
paper_id TEXT UNIQUE NOT NULL,
title TEXT NOT NULL,
authors TEXT,
summary TEXT,
url TEXT,
source TEXT DEFAULT 'arxiv',
citation_count INTEGER DEFAULT 0,
published_year TEXT,
status TEXT DEFAULT 'unread',
notes TEXT DEFAULT '',
tags TEXT DEFAULT '',
saved_at TEXT
);
""")
conn.commit()
conn.close()
def save_paper(
paper_id: str,
title: str,
authors: str = "",
summary: str = "",
url: str = "",
source: str = "arxiv",
citation_count: int = 0,
published_year: str = "",
tags: str = "genel"
) -> Dict[str, Any]:
"""Makaleyi veritabanına kaydeder (varsa günceller)."""
init_db()
conn = get_connection()
cursor = conn.cursor()
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
cursor.execute("""
INSERT INTO papers (paper_id, title, authors, summary, url, source, citation_count, published_year, tags, saved_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(paper_id) DO UPDATE SET
title=excluded.title,
authors=excluded.authors,
summary=excluded.summary,
url=excluded.url,
citation_count=excluded.citation_count,
tags=excluded.tags
""", (paper_id, title, authors, summary, url, source, citation_count, published_year, tags, now))
conn.commit()
return {
"status": "success",
"message": f"'{title}' başarıyla kütüphaneye kaydedildi.",
"paper_id": paper_id
}
except Exception as e:
return {
"status": "error",
"message": f"Veritabanı kaydı sırasında hata oluştu: {str(e)}"
}
finally:
conn.close()
def get_saved_papers(status_filter: Optional[str] = None, tag_filter: Optional[str] = None, query: Optional[str] = None) -> List[Dict[str, Any]]:
"""Kayıtlı makaleleri getirir."""
init_db()
conn = get_connection()
cursor = conn.cursor()
sql = "SELECT * FROM papers WHERE 1 = 1"
params = []
if status_filter and str(status_filter).lower().strip() not in ["", "hepsi", "all", "none"]:
sql += " AND status = ?"
params.append(str(status_filter).lower().strip())
if tag_filter and str(tag_filter).strip():
sql += " AND tags LIKE ?"
params.append(f"%{str(tag_filter).strip()}%")
if query and str(query).strip():
q_str = str(query).strip()
sql += " AND (title LIKE ? OR summary LIKE ? OR authors LIKE ?)"
params.append(f"%{q_str}%")
params.append(f"%{q_str}%")
params.append(f"%{q_str}%")
sql += " ORDER BY id DESC"
cursor.execute(sql, params)
rows = cursor.fetchall()
conn.close()
results = []
for r in rows:
results.append(dict(r))
return results
def update_paper_status_or_note(paper_id: str, status: Optional[str] = None, notes: Optional[str] = None, tags: Optional[str] = None) -> Dict[str, Any]:
"""Makalenin okuma durumunu, notunu veya etiketini günceller."""
init_db()
conn = get_connection()
cursor = conn.cursor()
paper = None
target_query = str(paper_id or "").strip()
if target_query:
cursor.execute("SELECT * FROM papers WHERE paper_id = ? OR id = ?", (target_query, target_query))
paper = cursor.fetchone()
if not paper:
cursor.execute("SELECT * FROM papers WHERE title LIKE ? OR paper_id LIKE ?", (f"%{target_query}%", f"%{target_query}%"))
paper = cursor.fetchone()
if not paper:
cursor.execute("SELECT * FROM papers ORDER BY id DESC LIMIT 1")
paper = cursor.fetchone()
if not paper:
conn.close()
return {"status": "error", "message": "Kütüphanenizde güncellenecek herhangi bir makale bulunamadı."}
updates = []
params = []
if status:
updates.append("status = ?")
params.append(status.lower())
if notes is not None:
updates.append("notes = ?")
params.append(notes)
if tags:
updates.append("tags = ?")
params.append(tags)
if not updates:
conn.close()
return {"status": "warning", "message": "Güncellenecek alan belirtilmedi."}
params.append(paper["id"])
sql = f"UPDATE papers SET {', '.join(updates)} WHERE id = ?"
cursor.execute(sql, params)
conn.commit()
conn.close()
return {
"status": "success",
"message": f"Makale ('{paper['title']}') okuma durumu '{status or paper['status']}' olarak güncellendi.",
"updated_paper_id": paper["paper_id"]
}
def delete_paper(paper_id: str) -> Dict[str, Any]:
"""Makaleyi veritabanından siler."""
init_db()
conn = get_connection()
cursor = conn.cursor()
paper = None
target_query = str(paper_id or "").strip()
if target_query:
cursor.execute("SELECT * FROM papers WHERE paper_id = ? OR id = ?", (target_query, target_query))
paper = cursor.fetchone()
if not paper:
cursor.execute("SELECT * FROM papers WHERE title LIKE ? OR paper_id LIKE ?", (f"%{target_query}%", f"%{target_query}%"))
paper = cursor.fetchone()
if not paper:
cursor.execute("SELECT * FROM papers ORDER BY id DESC LIMIT 1")
paper = cursor.fetchone()
if not paper:
conn.close()
return {"status": "error", "message": "Kütüphanede silinecek makale bulunamadı."}
cursor.execute("DELETE FROM papers WHERE paper_id = ?", (paper["paper_id"],))
deleted_count = cursor.rowcount
conn.commit()
conn.close()
return {"status": "success", "message": f"'{paper['title']}' başlıklı makale veritabanından silindi."}
def clear_library() -> Dict[str, Any]:
"""Kütüphanedeki tüm makaleleri veritabanından siler."""
init_db()
conn = get_connection()
cursor = conn.cursor()
cursor.execute("DELETE FROM papers")
deleted_count = cursor.rowcount
conn.commit()
conn.close()
return {"status": "success", "message": f"Kütüphane temizlendi. Toplam {deleted_count} makale silindi."}
|