fix(store): закрытие набора строк в бэкфилле через defer

This commit is contained in:
2026-09-20 11:02:09 +03:00
parent 0c1b1a261e
commit bd5f09336b
+26 -18
View File
@@ -457,6 +457,12 @@ func prefixedMessageColumns(alias string) string {
return strings.Join(columns, ", ") return strings.Join(columns, ", ")
} }
// searchBackfillItem — сообщение, которому нужно заполнить content_lower.
type searchBackfillItem struct {
id uint64
content string
}
// BackfillSearchIndex заполняет нормализованный текст у старых сообщений: // BackfillSearchIndex заполняет нормализованный текст у старых сообщений:
// нужен для поиска подстроки без учёта регистра (кириллица в SQLite lower() // нужен для поиска подстроки без учёта регистра (кириллица в SQLite lower()
// не приводится). Вызывается один раз при старте, порциями. // не приводится). Вызывается один раз при старте, порциями.
@@ -469,24 +475,8 @@ func (s *Store) BackfillSearchIndex(ctx context.Context, limit int) (int, error)
if err != nil { if err != nil {
return 0, err return 0, err
} }
type pending struct { items, err := collectSearchBackfill(rows, limit)
id uint64 if err != nil {
content string
}
items := make([]pending, 0, limit)
for rows.Next() {
var item pending
if err := rows.Scan(&item.id, &item.content); err != nil {
_ = rows.Close()
return 0, err
}
items = append(items, item)
}
if err := rows.Err(); err != nil {
_ = rows.Close()
return 0, err
}
if err := rows.Close(); err != nil {
return 0, err return 0, err
} }
@@ -502,6 +492,24 @@ func (s *Store) BackfillSearchIndex(ctx context.Context, limit int) (int, error)
return updated, nil return updated, nil
} }
// collectSearchBackfill читает порцию сообщений и закрывает набор строк.
func collectSearchBackfill(rows *sql.Rows, limit int) ([]searchBackfillItem, error) {
defer func() { _ = rows.Close() }()
items := make([]searchBackfillItem, 0, limit)
for rows.Next() {
var item searchBackfillItem
if err := rows.Scan(&item.id, &item.content); err != nil {
return nil, err
}
items = append(items, item)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
func scanMessage(scanner interface{ Scan(...any) error }) (*Message, error) { func scanMessage(scanner interface{ Scan(...any) error }) (*Message, error) {
var ( var (
message Message message Message