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 {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("fts query: %w", err)
|
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() {
|
for rows.Next() {
|
||||||
var id int64
|
var h hit
|
||||||
var rank float64
|
if err := rows.Scan(&h.id, &h.rank); err != nil {
|
||||||
if err := rows.Scan(&id, &rank); err != nil {
|
rows.Close()
|
||||||
return nil, fmt.Errorf("scan: %w", err)
|
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 {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("get entry: %w", err)
|
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{
|
results = append(results, searchResult{
|
||||||
Entry: *entry,
|
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
|
return results, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user