package store import ( "sort" "time" ) func (m *Memory) GetASNPrefixCache(asn int64) (*ASNPrefixCacheEntry, bool, error) { m.mu.RLock() defer m.mu.RUnlock() if m.asnPrefixCache == nil { return nil, false, nil } e, ok := m.asnPrefixCache[asn] if !ok || e == nil { return nil, false, nil } pfx := append([]string(nil), e.Prefixes...) return &ASNPrefixCacheEntry{ ASN: asn, Holder: e.Holder, Prefixes: pfx, FetchedAt: e.FetchedAt, }, true, nil } func (m *Memory) SetASNPrefixCache(asn int64, holder string, prefixes []string) error { m.mu.Lock() defer m.mu.Unlock() if m.asnPrefixCache == nil { m.asnPrefixCache = make(map[int64]*ASNPrefixCacheEntry) } if cur := m.asnPrefixCache[asn]; cur != nil && sameStringSet(cur.Prefixes, prefixes) { cur.Holder = holder cur.FetchedAt = time.Now().UTC() return nil } cp := append([]string(nil), prefixes...) m.asnPrefixCache[asn] = &ASNPrefixCacheEntry{ ASN: asn, Holder: holder, Prefixes: cp, FetchedAt: time.Now().UTC(), } return nil } func sameStringSet(a, b []string) bool { if len(a) != len(b) { return false } aa := append([]string(nil), a...) bb := append([]string(nil), b...) sort.Strings(aa) sort.Strings(bb) for i := range aa { if aa[i] != bb[i] { return false } } return true }