127 lines
4.0 KiB
TypeScript
127 lines
4.0 KiB
TypeScript
import type Database from "better-sqlite3";
|
|
|
|
const DDL_STATEMENTS = [
|
|
`CREATE TABLE IF NOT EXISTS modules (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL UNIQUE,
|
|
path TEXT NOT NULL,
|
|
description TEXT,
|
|
layer TEXT NOT NULL,
|
|
created_at TEXT NOT NULL
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS files (
|
|
id INTEGER PRIMARY KEY,
|
|
module_id INTEGER REFERENCES modules(id),
|
|
path TEXT NOT NULL UNIQUE,
|
|
kind TEXT NOT NULL,
|
|
lines INTEGER,
|
|
is_server INTEGER DEFAULT 0,
|
|
is_client INTEGER DEFAULT 0,
|
|
has_server_only INTEGER DEFAULT 0
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS symbols (
|
|
id INTEGER PRIMARY KEY,
|
|
file_id INTEGER NOT NULL REFERENCES files(id),
|
|
name TEXT NOT NULL,
|
|
kind TEXT NOT NULL,
|
|
is_exported INTEGER DEFAULT 0,
|
|
is_async INTEGER DEFAULT 0,
|
|
is_server_action INTEGER DEFAULT 0,
|
|
is_public INTEGER DEFAULT 0,
|
|
signature TEXT,
|
|
start_line INTEGER,
|
|
end_line INTEGER,
|
|
UNIQUE(file_id, name, start_line)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS calls (
|
|
id INTEGER PRIMARY KEY,
|
|
caller_id INTEGER NOT NULL REFERENCES symbols(id),
|
|
callee_id INTEGER REFERENCES symbols(id),
|
|
callee_external TEXT,
|
|
call_line INTEGER,
|
|
count INTEGER DEFAULT 1
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS file_imports (
|
|
id INTEGER PRIMARY KEY,
|
|
source_file_id INTEGER NOT NULL REFERENCES files(id),
|
|
imported_file_id INTEGER REFERENCES files(id),
|
|
import_path TEXT NOT NULL,
|
|
is_type_only INTEGER DEFAULT 0,
|
|
imported_names TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS module_deps (
|
|
id INTEGER PRIMARY KEY,
|
|
source_module_id INTEGER NOT NULL REFERENCES modules(id),
|
|
target_module_id INTEGER NOT NULL REFERENCES modules(id),
|
|
dep_type TEXT NOT NULL,
|
|
UNIQUE(source_module_id, target_module_id, dep_type)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS tech_tags (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL UNIQUE,
|
|
category TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS symbol_tech_tags (
|
|
symbol_id INTEGER NOT NULL REFERENCES symbols(id),
|
|
tag_id INTEGER NOT NULL REFERENCES tech_tags(id),
|
|
PRIMARY KEY(symbol_id, tag_id)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS permissions (
|
|
id INTEGER PRIMARY KEY,
|
|
key TEXT NOT NULL UNIQUE,
|
|
description TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS routes (
|
|
id INTEGER PRIMARY KEY,
|
|
path TEXT NOT NULL UNIQUE,
|
|
kind TEXT NOT NULL,
|
|
file_id INTEGER REFERENCES files(id),
|
|
min_permission TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS db_tables (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL UNIQUE,
|
|
module_id INTEGER REFERENCES modules(id),
|
|
description TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS scan_meta (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL
|
|
)`,
|
|
`CREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_id)`,
|
|
`CREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols(name)`,
|
|
`CREATE INDEX IF NOT EXISTS idx_calls_caller ON calls(caller_id)`,
|
|
`CREATE INDEX IF NOT EXISTS idx_calls_callee ON calls(callee_id)`,
|
|
`CREATE INDEX IF NOT EXISTS idx_file_imports_source ON file_imports(source_file_id)`,
|
|
`CREATE INDEX IF NOT EXISTS idx_file_imports_target ON file_imports(imported_file_id)`,
|
|
`CREATE INDEX IF NOT EXISTS idx_symbol_tech_tags_tag ON symbol_tech_tags(tag_id)`,
|
|
];
|
|
|
|
export function initSchema(db: Database.Database): void {
|
|
for (const stmt of DDL_STATEMENTS) {
|
|
db.exec(stmt);
|
|
}
|
|
}
|
|
|
|
export function clearAllData(db: Database.Database): void {
|
|
const tables = [
|
|
"symbol_tech_tags",
|
|
"calls",
|
|
"file_imports",
|
|
"module_deps",
|
|
"symbols",
|
|
"files",
|
|
"modules",
|
|
"tech_tags",
|
|
"permissions",
|
|
"routes",
|
|
"db_tables",
|
|
"scan_meta",
|
|
];
|
|
db.exec("PRAGMA foreign_keys = OFF");
|
|
for (const table of tables) {
|
|
db.exec(`DELETE FROM ${table}`);
|
|
}
|
|
db.exec("PRAGMA foreign_keys = ON");
|
|
}
|