| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // package dict_rec -- потокобезопасный словарь KV-бакета.
- package dict_rec
- import (
- "sync"
- mL0 "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) core_spec.IOption[rec_kv.IRecKvFix]
- // Set -- устанавливает значение по ключу
- Set(val rec_kv.IRecKvFix) core_spec.IResult[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) mL0.IOption[rec_kv.IRecKvFix] {
- sf.block.RLock()
- defer sf.block.RUnlock()
- rec, isOk := sf.dict[key.Get()]
- if !isOk {
- return mL0.NewNone[rec_kv.IRecKvFix]()
- }
- return mL0.NewSome(rec)
- }
- // Set -- установка значения по ключу.
- func (sf *DictRec) Set(rec rec_kv.IRecKvFix) mL0.IResult[core_spec.EBool] {
- if rec == nil {
- err := defs.NewErr("DictRec.Set(): rec is nil")
- return mL0.NewErr[core_spec.EBool](err)
- }
- sf.block.Lock()
- defer sf.block.Unlock()
- sf.dict[rec.Key().Get()] = rec
- return mL0.NewOk(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))
- }
|