From bd5f09336b7d3dc2b2e651386d4692d596762f50 Mon Sep 17 00:00:00 2001 From: grendervill Date: Sun, 20 Sep 2026 11:02:09 +0300 Subject: [PATCH] =?UTF-8?q?fix(store):=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=20=D0=BD=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D0=B2=20=D0=B1=D1=8D=D0=BA?= =?UTF-8?q?=D1=84=D0=B8=D0=BB=D0=BB=D0=B5=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=20defer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/store/messages.go | 44 ++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 18 deletions(-) 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