返回 DeepSeek-Reasonix
schema.go
1 package historycatalog
2
3 import (
4 "context"
5 "database/sql"
6
7 "reasonix/internal/projectiondb"
8 )
9
10 const migrationV1 = `
11 CREATE TABLE history_state(
12 id INTEGER PRIMARY KEY CHECK(id=1),
13 revision INTEGER NOT NULL DEFAULT 0,
14 tokenizer_version INTEGER NOT NULL
15 );
16 INSERT INTO history_state(id,revision,tokenizer_version) VALUES(1,0,1);
17
18 CREATE TABLE history_roots(
19 path TEXT PRIMARY KEY,
20 source TEXT NOT NULL,
21 scope TEXT NOT NULL,
22 workspace_root TEXT NOT NULL DEFAULT '',
23 signature TEXT NOT NULL DEFAULT '',
24 scan_generation INTEGER NOT NULL DEFAULT 0,
25 scan_cursor TEXT NOT NULL DEFAULT '',
26 state TEXT NOT NULL DEFAULT 'pending',
27 error TEXT NOT NULL DEFAULT '',
28 indexed INTEGER NOT NULL DEFAULT 0,
29 total INTEGER NOT NULL DEFAULT 0,
30 completed_at INTEGER NOT NULL DEFAULT 0
31 );
32
33 CREATE TABLE history_sources(
34 path TEXT PRIMARY KEY,
35 root TEXT NOT NULL,
36 source TEXT NOT NULL,
37 scope TEXT NOT NULL,
38 workspace_root TEXT NOT NULL DEFAULT '',
39 content_revision INTEGER NOT NULL DEFAULT 0,
40 content_digest TEXT NOT NULL DEFAULT '',
41 content_fingerprint TEXT NOT NULL DEFAULT '',
42 meta_fingerprint TEXT NOT NULL DEFAULT '',
43 message_count INTEGER NOT NULL DEFAULT 0,
44 indexed_message_count INTEGER NOT NULL DEFAULT 0,
45 custom_title TEXT NOT NULL DEFAULT '',
46 topic_id TEXT NOT NULL DEFAULT '',
47 topic_title TEXT NOT NULL DEFAULT '',
48 preview TEXT NOT NULL DEFAULT '',
49 created_at INTEGER NOT NULL DEFAULT 0,
50 last_activity_at INTEGER NOT NULL DEFAULT 0,
51 health TEXT NOT NULL DEFAULT 'ok',
52 missing_since INTEGER NOT NULL DEFAULT 0,
53 seen_generation INTEGER NOT NULL DEFAULT 0,
54 last_error TEXT NOT NULL DEFAULT ''
55 );
56
57 CREATE TABLE history_documents(
58 id INTEGER PRIMARY KEY,
59 source_path TEXT NOT NULL REFERENCES history_sources(path) ON DELETE CASCADE,
60 message_index INTEGER NOT NULL,
61 part_index INTEGER NOT NULL DEFAULT 0,
62 role TEXT NOT NULL,
63 kind TEXT NOT NULL,
64 tool_name TEXT NOT NULL DEFAULT '',
65 token_count INTEGER NOT NULL DEFAULT 0,
66 UNIQUE(source_path,message_index,kind,part_index)
67 );
68
69 CREATE VIRTUAL TABLE history_fts USING fts5(
70 terms,
71 content='',
72 contentless_delete=1,
73 tokenize='unicode61 remove_diacritics 2'
74 );
75
76 CREATE INDEX idx_history_sources_scope_activity
77 ON history_sources(scope,workspace_root,last_activity_at DESC,path ASC);
78 CREATE INDEX idx_history_documents_source
79 ON history_documents(source_path,message_index,part_index,id);
80 `
81
82 func migrations() []projectiondb.Migration {
83 return []projectiondb.Migration{{Version: 1, Apply: func(ctx context.Context, tx *sql.Tx) error {
84 _, err := tx.ExecContext(ctx, migrationV1)
85 return err
86 }}}
87 }
88
88 lines GO