fix: materialize FTS hits before fetching entries to avoid sqlite deadlock
This commit is contained in:
1 parent
ffdc023065
commit
c86e34a01d
1 file changed
+20
-10
@@ -218,16 +218,29 @@ func (s *sqliteStore) searchFTS(ctx context.Context, query string, limit uint64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("fts query: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var results []searchResult
|
||||
type hit struct {
|
||||
id int64
|
||||
rank float64
|
||||
}
|
||||
var hits []hit
|
||||
for rows.Next() {
|
||||
var id int64
|
||||
var rank float64
|
||||
if err := rows.Scan(&id, &rank); err != nil {
|
||||
var h hit
|
||||
if err := rows.Scan(&h.id, &h.rank); err != nil {
|
||||
rows.Close()
|
||||
return nil, fmt.Errorf("scan: %w", err)
|
||||
}
|
||||
entry, err := s.getByID(ctx, id)
|
||||
hits = append(hits, h)
|
||||
}
|
||||
rows.Close()
|
||||
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, fmt.Errorf("rows: %w", err)
|
||||
}
|
||||
|
||||
results := make([]searchResult, 0, len(hits))
|
||||
for _, h := range hits {
|
||||
entry, err := s.getByID(ctx, h.id)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("get entry: %w", err)
|
||||
}
|
||||
@@ -236,12 +249,9 @@ func (s *sqliteStore) searchFTS(ctx context.Context, query string, limit uint64)
|
||||
}
|
||||
results = append(results, searchResult{
|
||||
Entry: *entry,
|
||||
Score: float32(-rank),
|
||||
Score: float32(-h.rank),
|
||||
})
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, fmt.Errorf("rows: %w", err)
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user