perf: enable WAL mode, batch price lookup, add DB diagnostics to schema_state

- Set PRAGMA journal_mode=WAL + synchronous=NORMAL on SQLite open;
  eliminates read blocking during background pricelist sync writes
- Replace N+1 per-lot price loop in QuoteService local fallback with
  GetLocalPricesForLots batch query (120 queries → 3 per price-levels call)
- Add CountAllPricelistItems, CountComponents, DBFileSizeBytes to LocalDB
- Report local_pricelist_count, pricelist_items_count, components_count,
  db_size_bytes in qt_client_schema_state for performance diagnostics

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Mikhail Chusavitin
2026-04-02 10:53:36 +03:00
parent 1ea21ece33
commit a360992a01
3 changed files with 79 additions and 7 deletions

View File

@@ -388,13 +388,14 @@ func (s *QuoteService) lookupPricesByPricelistID(pricelistID uint, lotNames []st
}
}
// Fallback path (usually offline): local per-lot lookup.
// Fallback path (usually offline): batch local lookup (single query via index).
if s.localDB != nil {
for _, lotName := range missing {
price, found := s.lookupPriceByPricelistID(pricelistID, lotName)
if found && price > 0 {
result[lotName] = price
loaded[lotName] = price
if localPL, err := s.localDB.GetLocalPricelistByServerID(pricelistID); err == nil {
if batchPrices, err := s.localDB.GetLocalPricesForLots(localPL.ID, missing); err == nil {
for lotName, price := range batchPrices {
result[lotName] = price
loaded[lotName] = price
}
}
}
s.updateCache(pricelistID, missing, loaded)