/cmd/bd/doctor/integrity.go: fix unable to query issues bug with dolt backend

This commit is contained in:
coffeegoddd☕️✨
2026-01-20 14:00:37 -08:00
parent a097fc546b
commit 4e386c8adf

View File

@@ -22,19 +22,15 @@ import (
// CheckIDFormat checks whether issues use hash-based or sequential IDs
func CheckIDFormat(path string) DoctorCheck {
// Follow redirect to resolve actual beads directory (bd-tvus fix)
beadsDir := resolveBeadsDir(filepath.Join(path, ".beads"))
backend, beadsDir := getBackendAndBeadsDir(path)
// Check metadata.json first for custom database name
var dbPath string
if cfg, err := configfile.Load(beadsDir); err == nil && cfg != nil && cfg.Database != "" {
// Determine the on-disk location (file for SQLite, directory for Dolt).
dbPath := filepath.Join(beadsDir, beads.CanonicalDatabaseName)
if cfg, err := configfile.Load(beadsDir); err == nil && cfg != nil {
dbPath = cfg.DatabasePath(beadsDir)
} else {
// Fall back to canonical database name
dbPath = filepath.Join(beadsDir, beads.CanonicalDatabaseName)
}
// Check if using JSONL-only mode
// Check if using JSONL-only mode (or uninitialized DB).
if _, err := os.Stat(dbPath); os.IsNotExist(err) {
// Check if JSONL exists (--no-db mode)
jsonlPath := filepath.Join(beadsDir, "issues.jsonl")
@@ -53,24 +49,29 @@ func CheckIDFormat(path string) DoctorCheck {
}
}
// Open database
db, err := sql.Open("sqlite3", sqliteConnString(dbPath, true))
// Open the configured backend in read-only mode.
// This must work for both SQLite and Dolt.
ctx := context.Background()
store, err := storagefactory.NewFromConfigWithOptions(ctx, beadsDir, storagefactory.Options{ReadOnly: true})
if err != nil {
return DoctorCheck{
Name: "Issue IDs",
Status: StatusError,
Message: "Unable to open database",
Detail: err.Error(),
}
}
defer func() { _ = db.Close() }() // Intentionally ignore close error
defer func() { _ = store.Close() }() // Intentionally ignore close error
db := store.UnderlyingDB()
// Get sample of issues to check ID format (up to 10 for pattern analysis)
rows, err := db.Query("SELECT id FROM issues ORDER BY created_at LIMIT 10")
rows, err := db.QueryContext(ctx, "SELECT id FROM issues ORDER BY created_at LIMIT 10")
if err != nil {
return DoctorCheck{
Name: "Issue IDs",
Status: StatusError,
Message: "Unable to query issues",
Detail: err.Error(),
}
}
defer rows.Close()
@@ -101,6 +102,13 @@ func CheckIDFormat(path string) DoctorCheck {
}
// Sequential IDs - recommend migration
if backend == configfile.BackendDolt {
return DoctorCheck{
Name: "Issue IDs",
Status: StatusOK,
Message: "hash-based ✓",
}
}
return DoctorCheck{
Name: "Issue IDs",
Status: StatusWarning,