Files
brain_dogfood/app/database.py
T

89 lines
2.5 KiB
Python

import os
import sqlite3
# Data directory relative to this file
DB_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'data'))
os.makedirs(DB_DIR, exist_ok=True)
DB_PATH = os.path.join(DB_DIR, 'memos.db')
def init_db():
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
# 1. Memos Table
c.execute('''
CREATE TABLE IF NOT EXISTS memos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
content TEXT,
summary TEXT,
color TEXT DEFAULT '#2c3e50',
is_pinned BOOLEAN DEFAULT 0,
status TEXT DEFAULT 'active', -- 'active', 'done', 'archived'
group_name TEXT DEFAULT 'default',
is_encrypted BOOLEAN DEFAULT 0,
created_at TIMESTAMP,
updated_at TIMESTAMP
)
''')
try:
c.execute("ALTER TABLE memos ADD COLUMN status TEXT DEFAULT 'active'")
except sqlite3.OperationalError:
pass
try:
c.execute("ALTER TABLE memos ADD COLUMN is_encrypted BOOLEAN DEFAULT 0")
except sqlite3.OperationalError:
pass
try:
c.execute("ALTER TABLE memos ADD COLUMN category TEXT")
except sqlite3.OperationalError:
pass
# 2. Separate Tags Table (Normalized)
c.execute('''
CREATE TABLE IF NOT EXISTS tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
memo_id INTEGER,
name TEXT,
source TEXT, -- 'user' or 'ai'
FOREIGN KEY (memo_id) REFERENCES memos (id) ON DELETE CASCADE
)
''')
# 3. Attachments Table (Enhanced Asset Tracking)
c.execute('''
CREATE TABLE IF NOT EXISTS attachments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
memo_id INTEGER,
filename TEXT,
original_name TEXT,
file_type TEXT,
size INTEGER,
created_at TIMESTAMP,
FOREIGN KEY (memo_id) REFERENCES memos (id) ON DELETE SET NULL
)
''')
# 4. Memo Links Table (Backlinks)
c.execute('''
CREATE TABLE IF NOT EXISTS memo_links (
id INTEGER PRIMARY KEY AUTOINCREMENT,
source_id INTEGER,
target_id INTEGER,
FOREIGN KEY (source_id) REFERENCES memos (id) ON DELETE CASCADE,
FOREIGN KEY (target_id) REFERENCES memos (id) ON DELETE CASCADE
)
''')
conn.commit()
conn.close()
def get_db():
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
return conn