fix(store): закрытие набора строк в бэкфилле через defer
This commit is contained in:
+26
-18
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user