package storage import ( "database/sql" "fmt" "log" "strings" _ "modernc.org/sqlite" ) var pragmas = map[string]string{ `journal_mode`: `wal`, `synchronous`: `normal`, `busy_timeout`: `30000`, } func buildSqliteDsn(path string, pragmas map[string]string) string { pragmastrs := make([]string, len(pragmas)) i := 0 for k, v := range pragmas { pragmastrs[i] = (fmt.Sprintf(`pragma=%s(%s)`, k, v)) i++ } return path + "?" + "mode=rwc&" + strings.Join(pragmastrs, "&") } func Open(path string) (*sql.DB, error) { dsn := buildSqliteDsn(path, pragmas) db, err := sql.Open("sqlite", dsn) if err != nil { return nil, err } // Run migrations if _, err := db.Exec(CreateSqlite); err != nil { return nil, fmt.Errorf("migrate: %w", err) } // Migration: add is_active column if it doesn't exist if _, err := db.Exec(AddIsActiveColumn); err != nil { log.Printf("[sqlite] WARNING: failed to add is_active column: %v", err) } else { log.Println("[sqlite] is_active column migration applied") } // Create scripts table if not exists if _, err := db.Exec(CreateScriptsTable); err != nil { return nil, fmt.Errorf("migrate scripts: %w", err) } // Seed default diagnostic scripts if _, err := db.Exec(SeedDefaultScripts); err != nil { log.Printf("[sqlite] WARNING: failed to seed default scripts: %v", err) } else { log.Println("[sqlite] default scripts seeded successfully") } return db, nil }