···11+package store
22+33+import (
44+ "database/sql"
55+ "fmt"
66+77+ _ "modernc.org/sqlite"
88+)
99+1010+type Store struct {
1111+ db *sql.DB
1212+}
1313+1414+const schema = `
1515+CREATE TABLE IF NOT EXISTS links (
1616+ id INTEGER PRIMARY KEY AUTOINCREMENT,
1717+ target TEXT NOT NULL,
1818+ target_cid TEXT NOT NULL,
1919+ actor_did TEXT NOT NULL,
2020+ collection TEXT NOT NULL,
2121+ record_key TEXT NOT NULL,
2222+ record_cid TEXT NOT NULL,
2323+ field_path TEXT NOT NULL,
2424+ rev TEXT NOT NULL
2525+);
2626+CREATE INDEX IF NOT EXISTS idx_links_target ON links(target);
2727+CREATE INDEX IF NOT EXISTS idx_links_source ON links(actor_did, collection, record_key);
2828+`
2929+3030+func Open(path string) (*Store, error) {
3131+ db, err := sql.Open("sqlite", path)
3232+ if err != nil {
3333+ return nil, fmt.Errorf("open database: %w", err)
3434+ }
3535+3636+ if _, err := db.Exec(schema); err != nil {
3737+ return nil, fmt.Errorf("create schema: %w", err)
3838+ }
3939+4040+ return &Store{db: db}, nil
4141+4242+}