-
Notifications
You must be signed in to change notification settings - Fork 56
Data Layer
הבסיס של אוצריא: שלושה מסדי SQLite, שני ספקי ספרייה (providers), ומטמונים בזיכרון.
שלושתם חולקים אותה סכמה ואותם DAOs (lib/migration/database/), אך נפרדים פיזית:
| DB | קובץ | מצב | תוכן |
|---|---|---|---|
| הספרייה הרשמית | seforim.db |
קריאה בלבד | ~7000 ספרים: שורות, קישורים, TOC, מהדורות |
| מטמון תפעולי | cache.db |
כתיבה | outline של PDF חיצוני, טקסט DOCX מומר |
| ספרי משתמש | user_books.db |
כתיבה | ספרים אישיים, דורות (book_generation), קישורי משתמש (user_link) |
ההפרדה מאפשרת ל־seforim.db להיפתח read-only (יציבות ושיתוף), ועדכון הספרייה הרשמית לעולם לא מוחק ספרים אישיים.
טבלאות מרכזיות: category (עם category_closure), book, line, TOC (tocText/tocEntry/line_toc), קישורים (link + link_anchor/link_range), connection_type, מחברים/נושאים/מקומות־דפוס, book_acronym (ראשי תיבות), דורות (generation/book_generation), מהדורות (book_version/version_line), מבנים חלופיים (alt_toc_structure/alt_toc_entry), מפרשי ברירת מחדל (default_commentator/default_targum), db_meta.
- החיבור הרגיל ל־
seforim.dbהוא read-only (PRAGMA query_only=ON). - כתיבות נדירות (עיבוד קישורים) עוברות דרך write-session זמני: סגירת ה־RO ← פתיחת RW (WAL) ← ביצוע ← checkpoint וחזרה ל־DELETE ← פתיחה מחדש RO. הכל בשרשרת סריאלית (
_writeChain). - gate לכתיבה חיצונית (
closeForExternalWrite/reopenAfterExternalWrite) — קוראים מקבילים ממתינים במקום לקבל null (תיקון לבאג "קורא ריק בעלייה"). - Android: טיפול ב־Scoped Storage (SQLITE_CANTOPEN).
ממשק LibraryProvider עם שני מימושים ש־LibraryProviderManager (singleton) מתזמר לפי עדיפות:
-
DatabaseLibraryProvider(עדיפות 1) — קורא מ־seforim.db+ user_books.db. הקובץ הגדול בשכבה (~3600 שורות). -
FileSystemLibraryProvider(עדיפות 10) — קורא קבצים מהדיסק (תיקייתאישי, PDF תלמוד בבלי מובנה).
מפתח אחיד: title|categoryId|fileType|u/o — הסיומת מבדילה ספר משתמש (u) מרשמי (o), כי categoryId יכול להתקיים בשני ה־DBs. כל מסלול טעינה חייב להעביר preferUserBooks: book.isUserBook — אחרת ספר אישי עלול להיפתח כרשמי.
-
buildLibraryCatalog— טוען ספרים+קטגוריות בטרנזקציה אחת, בונה עץCategory, מוסיף PDF תלמוד בבלי מובנה, ומצרף ספרי משתמש תחת "ספרים אישיים" (או ממוזגים לעץ לפי הגדרה). -
getBookText/getBookToc— ניתוב ל־DB הנכון; ספר מבוסס־קובץ נקרא מהקובץ (DOCX דרך מטמון המרה). -
סריקת ספרים חיצוניים — שלב 1 ב־isolate (סריקה, השוואת גודל+זמן שינוי, פרסור TOC); שלב 2 ב־main isolate (כתיבה בלבד). כל הכתיבות דרך
PersonalBooksOperationQueue(תור סריאלי). - שאילתות כבדות (קישורים, מהדורות, מבנים חלופיים) רצות ב־isolate עם חיבור sqlite3 ישיר.
מאתר ספר בין המועמדים עם fallback מדורג: filePath ← title+category+fileType ← title+category ← title.
| מטמון | תוכן |
|---|---|
BooksCache |
טבלת book המשותפת |
AcronymsCache |
ראשי תיבות מנורמלים מ־book_acronym (נרמול ב־isolate) |
GenerationCache |
דור הספר (מפות נפרדות ל־seforim ול־user_books) |
כולם lazy עם warmUp() (נקרא אחרי חשיפת החלון) ומנגנון generation שמזהה clear() באמצע טעינה.
שכבה מרכזית (singleton) שמאחדת הכל: library (ממוטמם), getBookText/getBookToc, ו־findBooks — חיפוש הספר בספרייה:
- נרמול השאילתה (הסרת ניקוד/טעמים/גרשיים) ופירוק למילים.
- בניית
BookSearchEntryלכל ספר: כותרת + מחבר + ראשי תיבות + דור. הסינון רץ ב־isolate. - התאמה fuzzy פר־מילה: הכלה או מרחק עריכה Damerau-Levenshtein עם סף תלוי־אורך.
- מיון בשכבות: כותרת מדויקת ← מכילה ← ראשי תיבות ← fuzzy, ואז סדר הדורות (מ־
book_generationב־DB בלבד), ואז ספרי משתמש, ואז ציון ההתאמה.
עוטף את מנוע החיפוש (Rust, חבילת otzaria_search_engine): ניהול האינדקס (רשימת קבצים מאונדקסים, בדיקת תאימות סכמה, טיפול בקריסות דרך sentinel), טעינת מילונים (מורפולוגי, תרגום ארמי, ראשי תיבות), וזרמי חיפוש. פירוט בחיפוש ואינדוקס.
-
books.dart— Bookאבסטרקטי: TextBook, PdfBook, DocxBook, ExternalLibraryBook. שדות מפתח:id, title, categoryId, fileType, isUserBook, externalLibraryId. TocEntry— צומת עץ תוכן העניינים. -
links.dart— Link: קישור בין ספרים (heRef, index1, index2, connectionType, עוגני מילה, קישורי טווח) עם מטמון LRU לתוכן. -
link_types.dart— 14 סוגי קישור;dependentTextTypes(מפרש/תרגום) מול הפניות.SOURCEוירטואלי — נבנה בשאילתת inverse.
-
repository/seforim_repository.dart(~3100 שורות) — כל הגישה לסכמה: קטגוריות (closure), ספרים, שורות, TOC רגיל וחלופי, קישורים, מפרשים, מחיקה מלאה. -
generator/— DatabaseGenerator: בניית ספר ב־DB מקובץ (יצירת שרשרת קטגוריות, פרסור שורות ו־TOC, עיבוד<ספר>_links.jsonלטבלת link). -
sync/— סנכרון רקע של ספרים אישיים — ראו ספרים אישיים.
📖 מדריך למשתמש
- התחלת העבודה
- הספרייה
- קריאת ספר
- קריאת PDF
- חיפוש
- איתור מקורות
- טאבים ושולחנות
- סימניות והערות
- ספרים אישיים
- הגדרות
- גיבוי ושחזור
- עדכונים
- תוספים
- כלים
- קישורי עומק
🛠️ למפתחים — יסודות
נתונים וספרייה
קריאה
חיפוש
אישי ומערכת
עיצוב ו־UI