diff --git a/internal/store/messages.go b/internal/store/messages.go index 23fbe25..5e27ad0 100644 --- a/internal/store/messages.go +++ b/internal/store/messages.go @@ -457,6 +457,12 @@ func prefixedMessageColumns(alias string) string { return strings.Join(columns, ", ") } +// searchBackfillItem — сообщение, которому нужно заполнить content_lower. +type searchBackfillItem struct { + id uint64 + content string +} + // BackfillSearchIndex заполняет нормализованный текст у старых сообщений: // нужен для поиска подстроки без учёта регистра (кириллица в SQLite lower() // не приводится). Вызывается один раз при старте, порциями. @@ -469,24 +475,8 @@ func (s *Store) BackfillSearchIndex(ctx context.Context, limit int) (int, error) if err != nil { return 0, err } - type pending struct { - id uint64 - 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 { + items, err := collectSearchBackfill(rows, limit) + if err != nil { return 0, err } @@ -502,6 +492,24 @@ func (s *Store) BackfillSearchIndex(ctx context.Context, limit int) (int, error) 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) { var ( message Message