// package dict_rec -- потокобезопасный словарь KV-бакета. package dict_rec import ( "sync" "gitp78su.ipnodns.ru/svi/kern/v4/lev0" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_key" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_kv" ) // IDictRec -- интерфейс потокобезопасного словаря KV-бакета. type IDictRec interface { // Get -- возвращает значение по ключу Get(key rec_key.IRecKeyFix) lev0.IOption[rec_kv.IRecKvFix] // Set -- устанавливает значение по ключу Set(val rec_kv.IRecKvFix) *lev0.Result[core_spec.EBool] // Del -- удаляет значение по ключу Del(key rec_key.IRecKeyFix) // Len -- возвращает количество записей Len() defs.Int } // DictRec -- потокобезопасный словарь KV-бакета. type DictRec struct { dict map[rec_key.ARecKey]rec_kv.IRecKvFix block sync.RWMutex } // NewDictRec -- создание нового потокобезопасного словаря KV. func NewDictRec() *DictRec { sf := &DictRec{ dict: map[rec_key.ARecKey]rec_kv.IRecKvFix{}, } _ = IDictRec(sf) return sf } // Get -- получение значения по ключу. func (sf *DictRec) Get(key rec_key.IRecKeyFix) lev0.IOption[rec_kv.IRecKvFix] { sf.block.RLock() defer sf.block.RUnlock() rec, isOk := sf.dict[key.Get()] if !isOk { return lev0.NewNone[rec_kv.IRecKvFix]() } return lev0.NewSome(rec) } // Set -- установка значения по ключу. func (sf *DictRec) Set(rec rec_kv.IRecKvFix) *lev0.Result[core_spec.EBool] { if rec == nil { err := defs.Err("DictRec.Set(): rec is nil") return lev0.ResErr[core_spec.EBool](err) } sf.block.Lock() defer sf.block.Unlock() sf.dict[rec.Key().Get()] = rec return lev0.ResOk(ebool.NewEBool(true)) } // Del -- удаление значения по ключу. func (sf *DictRec) Del(key rec_key.IRecKeyFix) { sf.block.Lock() defer sf.block.Unlock() delete(sf.dict, key.Get()) } // Len -- количество элементов в словаре. func (sf *DictRec) Len() defs.Int { sf.block.RLock() defer sf.block.RUnlock() return defs.Int(len(sf.dict)) }