@@ -74,94 +74,96 @@ def __init__(self, db_path: Optional[str] = None):
7474 def _init_database (self ):
7575 """Initialisiert die Datenbankstruktur"""
7676 conn = sqlite3 .connect (self .db_path )
77- cursor = conn .cursor ()
78-
79- # Haupttabelle für Dateien
80- cursor .execute ('''
81- CREATE TABLE IF NOT EXISTS files (
82- id INTEGER PRIMARY KEY AUTOINCREMENT,
83- path TEXT UNIQUE NOT NULL,
84- filename TEXT NOT NULL,
85- extension TEXT,
86- size INTEGER,
87- modified TIMESTAMP,
88- created TIMESTAMP,
89- hash TEXT,
90- category TEXT,
91- text_content TEXT,
92- indexed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
93- )
94- ''' )
95-
96- # Tags-Tabelle (Many-to-Many)
97- cursor .execute ('''
98- CREATE TABLE IF NOT EXISTS tags (
99- id INTEGER PRIMARY KEY AUTOINCREMENT,
100- name TEXT UNIQUE NOT NULL
101- )
102- ''' )
103-
104- cursor .execute ('''
105- CREATE TABLE IF NOT EXISTS file_tags (
106- file_id INTEGER,
107- tag_id INTEGER,
108- PRIMARY KEY (file_id, tag_id),
109- FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE,
110- FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
111- )
112- ''' )
113-
114- # Notizen-Tabelle
115- cursor .execute ('''
116- CREATE TABLE IF NOT EXISTS notes (
117- id INTEGER PRIMARY KEY AUTOINCREMENT,
118- file_id INTEGER UNIQUE,
119- content TEXT,
120- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
121- FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE
122- )
123- ''' )
124-
125- # FTS5 für Volltextsuche
126- cursor .execute ('''
127- CREATE VIRTUAL TABLE IF NOT EXISTS files_fts USING fts5(
128- path, filename, text_content,
129- content='files',
130- content_rowid='id'
131- )
132- ''' )
133-
134- # Trigger für FTS-Synchronisation
135- cursor .execute ('''
136- CREATE TRIGGER IF NOT EXISTS files_ai AFTER INSERT ON files BEGIN
137- INSERT INTO files_fts(rowid, path, filename, text_content)
138- VALUES (new.id, new.path, new.filename, new.text_content);
139- END
140- ''' )
141-
142- cursor .execute ('''
143- CREATE TRIGGER IF NOT EXISTS files_ad AFTER DELETE ON files BEGIN
144- INSERT INTO files_fts(files_fts, rowid, path, filename, text_content)
145- VALUES ('delete', old.id, old.path, old.filename, old.text_content);
146- END
147- ''' )
148-
149- cursor .execute ('''
150- CREATE TRIGGER IF NOT EXISTS files_au AFTER UPDATE ON files BEGIN
151- INSERT INTO files_fts(files_fts, rowid, path, filename, text_content)
152- VALUES ('delete', old.id, old.path, old.filename, old.text_content);
153- INSERT INTO files_fts(rowid, path, filename, text_content)
154- VALUES (new.id, new.path, new.filename, new.text_content);
155- END
156- ''' )
157-
158- # Indizes
159- cursor .execute ('CREATE INDEX IF NOT EXISTS idx_files_hash ON files(hash)' )
160- cursor .execute ('CREATE INDEX IF NOT EXISTS idx_files_category ON files(category)' )
161- cursor .execute ('CREATE INDEX IF NOT EXISTS idx_files_extension ON files(extension)' )
162-
163- conn .commit ()
164- conn .close ()
77+ try :
78+ cursor = conn .cursor ()
79+
80+ # Haupttabelle für Dateien
81+ cursor .execute ('''
82+ CREATE TABLE IF NOT EXISTS files (
83+ id INTEGER PRIMARY KEY AUTOINCREMENT,
84+ path TEXT UNIQUE NOT NULL,
85+ filename TEXT NOT NULL,
86+ extension TEXT,
87+ size INTEGER,
88+ modified TIMESTAMP,
89+ created TIMESTAMP,
90+ hash TEXT,
91+ category TEXT,
92+ text_content TEXT,
93+ indexed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
94+ )
95+ ''' )
96+
97+ # Tags-Tabelle (Many-to-Many)
98+ cursor .execute ('''
99+ CREATE TABLE IF NOT EXISTS tags (
100+ id INTEGER PRIMARY KEY AUTOINCREMENT,
101+ name TEXT UNIQUE NOT NULL
102+ )
103+ ''' )
104+
105+ cursor .execute ('''
106+ CREATE TABLE IF NOT EXISTS file_tags (
107+ file_id INTEGER,
108+ tag_id INTEGER,
109+ PRIMARY KEY (file_id, tag_id),
110+ FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE,
111+ FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
112+ )
113+ ''' )
114+
115+ # Notizen-Tabelle
116+ cursor .execute ('''
117+ CREATE TABLE IF NOT EXISTS notes (
118+ id INTEGER PRIMARY KEY AUTOINCREMENT,
119+ file_id INTEGER UNIQUE,
120+ content TEXT,
121+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
122+ FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE
123+ )
124+ ''' )
125+
126+ # FTS5 für Volltextsuche
127+ cursor .execute ('''
128+ CREATE VIRTUAL TABLE IF NOT EXISTS files_fts USING fts5(
129+ path, filename, text_content,
130+ content='files',
131+ content_rowid='id'
132+ )
133+ ''' )
134+
135+ # Trigger für FTS-Synchronisation
136+ cursor .execute ('''
137+ CREATE TRIGGER IF NOT EXISTS files_ai AFTER INSERT ON files BEGIN
138+ INSERT INTO files_fts(rowid, path, filename, text_content)
139+ VALUES (new.id, new.path, new.filename, new.text_content);
140+ END
141+ ''' )
142+
143+ cursor .execute ('''
144+ CREATE TRIGGER IF NOT EXISTS files_ad AFTER DELETE ON files BEGIN
145+ INSERT INTO files_fts(files_fts, rowid, path, filename, text_content)
146+ VALUES ('delete', old.id, old.path, old.filename, old.text_content);
147+ END
148+ ''' )
149+
150+ cursor .execute ('''
151+ CREATE TRIGGER IF NOT EXISTS files_au AFTER UPDATE ON files BEGIN
152+ INSERT INTO files_fts(files_fts, rowid, path, filename, text_content)
153+ VALUES ('delete', old.id, old.path, old.filename, old.text_content);
154+ INSERT INTO files_fts(rowid, path, filename, text_content)
155+ VALUES (new.id, new.path, new.filename, new.text_content);
156+ END
157+ ''' )
158+
159+ # Indizes
160+ cursor .execute ('CREATE INDEX IF NOT EXISTS idx_files_hash ON files(hash)' )
161+ cursor .execute ('CREATE INDEX IF NOT EXISTS idx_files_category ON files(category)' )
162+ cursor .execute ('CREATE INDEX IF NOT EXISTS idx_files_extension ON files(extension)' )
163+
164+ conn .commit ()
165+ finally :
166+ conn .close ()
165167
166168 def get_category (self , filename : str ) -> str :
167169 """Bestimmt die Kategorie einer Datei"""
0 commit comments