Журнал: кэш разбора пакетов ИШ и черновиков MF010 по времени изменения — обход каталога не перечитывает файлы
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
@@ -20,6 +20,7 @@ import (
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"git.zetit.ru/zuevav/Bridge-and-Join-s/internal/nsdadapter/igw"
|
||||
@@ -310,10 +311,46 @@ func collectOrderResponseRaw(contrDID string) []respFile {
|
||||
|
||||
// readPkgText собирает текст всех документов пакета: распакованные xml/htm/rpt и
|
||||
// содержимое вложенных zip (декодирует windows-1251). Возвращает текст и время.
|
||||
// pkgTextCache — разобранный текст пакетов ИШ по каталогу: пакет после получения не меняется,
|
||||
// поэтому перечитывать его файлы при каждом обходе журнала незачем. Ключ проверки — время
|
||||
// изменения каталога пакета и число файлов в нём.
|
||||
var pkgTextCache = struct {
|
||||
mu sync.Mutex
|
||||
m map[string]pkgTextEntry
|
||||
}{m: map[string]pkgTextEntry{}}
|
||||
|
||||
type pkgTextEntry struct {
|
||||
dirMod time.Time
|
||||
n int
|
||||
body string
|
||||
mt time.Time
|
||||
}
|
||||
|
||||
func readPkgText(dir string) (string, time.Time) {
|
||||
var dirMod time.Time
|
||||
if st, err := os.Stat(dir); err == nil {
|
||||
dirMod = st.ModTime()
|
||||
}
|
||||
files, _ := os.ReadDir(dir)
|
||||
pkgTextCache.mu.Lock()
|
||||
if e, ok := pkgTextCache.m[dir]; ok && e.dirMod.Equal(dirMod) && e.n == len(files) {
|
||||
pkgTextCache.mu.Unlock()
|
||||
return e.body, e.mt
|
||||
}
|
||||
pkgTextCache.mu.Unlock()
|
||||
body, mt := readPkgTextUncached(dir, files)
|
||||
pkgTextCache.mu.Lock()
|
||||
if len(pkgTextCache.m) > 20000 { // защита от бесконечного роста при чистке каталога
|
||||
pkgTextCache.m = map[string]pkgTextEntry{}
|
||||
}
|
||||
pkgTextCache.m[dir] = pkgTextEntry{dirMod: dirMod, n: len(files), body: body, mt: mt}
|
||||
pkgTextCache.mu.Unlock()
|
||||
return body, mt
|
||||
}
|
||||
|
||||
func readPkgTextUncached(dir string, files []os.DirEntry) (string, time.Time) {
|
||||
var sb strings.Builder
|
||||
var mt time.Time
|
||||
files, _ := os.ReadDir(dir)
|
||||
for _, f := range files {
|
||||
if f.IsDir() {
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user