Prechádzať zdrojové kódy

SVI Рабочее сохранение

SVI 4 mesiacov pred
rodič
commit
07a335aef8

+ 3 - 2
v4/kern.go

@@ -22,6 +22,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_http/client_bus_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_local"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_local/client_bus_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent/module_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_keeper"
@@ -103,7 +104,7 @@ func SleepMs() {
 }
 
 // GetMonolitLocal -- возвращает монолит с локальной шиной.
-func GetMonolitLocal(name string) mod_spec.IKernelMonolit {
+func GetMonolitLocal(name mod_ent.AModuleName) mod_spec.IKernelMonolit {
 	kCtx := kctx.GetKernelCtx()
 	kCtx.Set("isLocal", true, "bus type")
 	for {
@@ -119,7 +120,7 @@ func GetMonolitLocal(name string) mod_spec.IKernelMonolit {
 }
 
 // GetMonolitHttp -- возвращает монолит с локальной шиной поверх HTTP.
-func GetMonolitHttp(name string) mod_spec.IKernelMonolit {
+func GetMonolitHttp(name mod_ent.AModuleName) mod_spec.IKernelMonolit {
 	kCtx := kctx.GetKernelCtx()
 	_ = kbus_http.GetKernelBusHttp()
 	kCtx.Set("isLocal", false, "bus type")

+ 0 - 18
v4/lev0/core_spec/idict_kv.go

@@ -1,18 +0,0 @@
-package core_spec
-
-import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
-)
-
-// IDictRec -- интерфейс потокобезопасного словаря KV-бакета.
-type IDictRec interface {
-	// Get -- возвращает значение по ключу
-	Get(key *store_key.AStoreKey) IOption[IRecKv]
-	// Set -- устанавливает значение по ключу
-	Set(val IRecKv) IResult[EBool]
-	// Del -- удаляет значение по ключу
-	Del(key *store_key.AStoreKey)
-	// Len -- возвращает количество записей
-	Len() defs.Int
-}

+ 0 - 9
v4/lev0/core_spec/irec_kv.go

@@ -1,9 +0,0 @@
-package core_spec
-
-// IRecKv -- интерфейс записи KV-хранилища.
-type IRecKv interface {
-	// Meta -- метаданные записи
-	Meta() IRecMeta
-	// Val -- значение записи
-	Val() IRecVal
-}

+ 0 - 17
v4/lev0/core_spec/irec_meta.go

@@ -1,17 +0,0 @@
-package core_spec
-
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
-
-// IRecMeta -- интерфейс мета-информации записи KV-хранилища.
-type IRecMeta interface {
-	// Key -- ключ записи
-	Key() *store_key.AStoreKey
-	// Vers -- версия записи
-	Vers() int64
-	// Operation -- тип операции над записью
-	Operation() string
-	// CreatedAt -- дата создания записи
-	CreatedAt() ITime
-	// UpdateAt -- дата последнего обновления
-	UpdateAt() ITimeMut
-}

+ 0 - 11
v4/lev0/core_spec/irec_val.go

@@ -1,11 +0,0 @@
-package core_spec
-
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
-
-// IRecVal -- значение записи.
-type IRecVal interface {
-	// Key -- возвращает ключ
-	Key() *store_key.AStoreKey
-	// Val -- возвращает значение
-	Val() []byte
-}

+ 20 - 23
v4/lev0/defs/defs.go

@@ -2,16 +2,31 @@
 package defs
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 )
 
+// Int -- алиас для int.
+type Int int
+
+// Int -- возвращает целое число по требованию.
+func (i Int) Int() int {
+	return int(i)
+}
+
+// Str -- алиас для string.
+type Str string
+
+// Str -- возвращает строку по требованию.
+func (s Str) Str() string {
+	return string(s)
+}
+
 // Time -- метка времени.
 // Вывод: "2006-01-02 15:04:05.000 -07 MST".
-type Time string
+type Time Str
 
 // BucketName -- имя сущности.
-type BucketName string
+type BucketName Str
 
 // StreamName -- имя потока для ожидания.
 //
@@ -21,24 +36,6 @@ type StreamName = stream_name.AStreamName
 // NewStreamName -- создать новое имя потока.
 //
 //go:fix inline
-func NewStreamName(val string) *stream_name.AStreamName {
-	return stream_name.NewAStreamName(val)
-}
-
-// StoreKey -- ключ хранилища.
-type StoreKey = store_key.AStoreKey
-
-// NewStoreKey -- создать новый ключ хранилища.
-//
-//go:fix inline
-func NewStoreKey(val string) *store_key.AStoreKey {
-	return store_key.NewAStoreKey(val)
-}
-
-// Int -- алиас для int.
-type Int int
-
-// Int -- возвращает целое число по требованию.
-func (i Int) Int() int {
-	return int(i)
+func NewStreamName(val Str) *stream_name.AStreamName {
+	return stream_name.NewAStreamName(string(val))
 }

+ 0 - 30
v4/lev0/defs/store_key/store_key.go

@@ -1,30 +0,0 @@
-// package store_key -- ключ хранилища
-package store_key
-
-import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
-)
-
-// AStoreKey -- ключ хранилища.
-type AStoreKey struct {
-	val *quark.QStr[quark.Fix]
-}
-
-// NewAStoreKey -- создать новый ключ хранилища.
-func NewAStoreKey(val string) *AStoreKey {
-	helpers.Hassert(val != "", "NewAStoreKey(): val is empty")
-	return &AStoreKey{val: quark.NewQStr(val)}
-}
-
-// String -- строковое представление.
-//
-//go:fix inline
-func (a *AStoreKey) String() string {
-	return a.val.Get()
-}
-
-// Get -- получить значение.
-func (a *AStoreKey) Get() string {
-	return a.val.Get()
-}

+ 3 - 3
v4/lev2/kmonolit/kmonolit.go

@@ -21,7 +21,7 @@ type kMonolit struct {
 	kCtx    kspec.IKernelCtx
 	lCtx    comp_spec.ILocalCtx
 	log     comp_spec.ILogBuf
-	name    string
+	name    mod_ent.AModuleName
 	isLocal core_spec.EBool
 	isWork  core_spec.ISafeBool
 	isEnd   core_spec.ISafeBool
@@ -34,7 +34,7 @@ var (
 )
 
 // GetMonolit -- возвращает монолит.
-func GetMonolit(name string) *kMonolit {
+func GetMonolit(name mod_ent.AModuleName) *kMonolit {
 	block.Lock()
 	defer block.Unlock()
 	if mon != nil {
@@ -75,7 +75,7 @@ func (sf *kMonolit) Log() comp_spec.ILogBuf {
 }
 
 // Name -- возвращает имя монолита.
-func (sf *kMonolit) Name() string {
+func (sf *kMonolit) Name() mod_ent.AModuleName {
 	return sf.name
 }
 

+ 12 - 11
v4/lev2/lsi/kstore_kv_std/kv_bucket_base/kv_bucket_base.go

@@ -3,9 +3,10 @@ package kv_bucket_base
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_kv"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
 // KvBucketBase -- базовый бакет хранилища KV.
@@ -20,15 +21,15 @@ import (
 // Он должен быть разумным значением (например, до 100 МБ).
 // Как только бакет заполнится, он будет вытеснен на диск.
 type KvBucketBase struct {
-	Name_      string                                   `json:"name"`       // Имя бакета
-	Level_     int                                      `json:"level"`      // Уровень бакета
-	Number_    int                                      `json:"num"`        // Номер бакета
-	Size_      int64                                    `json:"size"`       // Размер бакета
-	SizeLimit_ int64                                    `json:"size_limit"` // Лимит размера бакета
-	CreatedAt_ core_spec.ITime                          `json:"created_at"` // Время создания бакета
-	UpdatedAt_ core_spec.ITimeMut                       `json:"updated_at"` // Время обновления бакета
-	Vers_      int                                      `json:"vers"`       // Версия бакета
-	dictRec    map[store_key.AStoreKey]core_spec.IRecKv // Словарь для хранения данных
+	Name_      string                                `json:"name"`       // Имя бакета
+	Level_     int                                   `json:"level"`      // Уровень бакета
+	Number_    int                                   `json:"num"`        // Номер бакета
+	Size_      int64                                 `json:"size"`       // Размер бакета
+	SizeLimit_ int64                                 `json:"size_limit"` // Лимит размера бакета
+	CreatedAt_ core_spec.ITime                       `json:"created_at"` // Время создания бакета
+	UpdatedAt_ core_spec.ITimeMut                    `json:"updated_at"` // Время обновления бакета
+	Vers_      int                                   `json:"vers"`       // Версия бакета
+	dictRec    map[store_key.AStoreKey]rec_kv.IRecKv // Словарь для хранения данных
 }
 
 // NewKvBucketBase -- создание нового базового бакета хранилища KV.
@@ -40,7 +41,7 @@ func NewKvBucketBase(name string, level int, number int) *KvBucketBase {
 		Name_:      name,
 		Level_:     level,
 		Number_:    number,
-		dictRec:    map[store_key.AStoreKey]core_spec.IRecKv{},
+		dictRec:    map[store_key.AStoreKey]rec_kv.IRecKv{},
 		CreatedAt_: etime.NewETimeAuto(),
 		UpdatedAt_: etime.NewETimeAutoMut(),
 	}

+ 0 - 39
v4/lev2/lsi/kstore_kv_std/rec_kv/rec_kv.go

@@ -1,39 +0,0 @@
-// package rec_kv -- запись KV-хранилища.
-package rec_kv
-
-import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-)
-
-var (
-	hassert = helpers.Hassert
-)
-
-// RecKv -- запись KV-хранилища.
-type RecKv struct {
-	meta core_spec.IRecMeta // Метаданные записи
-	val  core_spec.IRecVal  // Значение записи
-}
-
-// NewRecKv -- создает новую запись.
-func NewRecKv(meta core_spec.IRecMeta, val core_spec.IRecVal) *RecKv {
-	hassert(meta != nil, "NewRecKv(): meta==nil")
-	hassert(val != nil, "NewRecKv(): val==nil")
-	sf := &RecKv{
-		meta: meta,
-		val:  val,
-	}
-	_ = core_spec.IRecKv(sf)
-	return sf
-}
-
-// Meta -- метаданные записи.
-func (sf *RecKv) Meta() core_spec.IRecMeta {
-	return sf.meta
-}
-
-// Val -- значение записи.
-func (sf *RecKv) Val() core_spec.IRecVal {
-	return sf.val
-}

+ 24 - 11
v4/lev2/lsi/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec.go → v4/lev2/lsi/store_ent/dict_rec/dict_rec.go

@@ -8,52 +8,65 @@ import (
 	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/defs/store_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_kv"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
+// IDictRec -- интерфейс потокобезопасного словаря KV-бакета.
+type IDictRec interface {
+	// Get -- возвращает значение по ключу
+	Get(key store_key.IStoreKeyFix) core_spec.IOption[rec_kv.IRecKv]
+	// Set -- устанавливает значение по ключу
+	Set(val rec_kv.IRecKv) core_spec.IResult[core_spec.EBool]
+	// Del -- удаляет значение по ключу
+	Del(key store_key.IStoreKeyFix)
+	// Len -- возвращает количество записей
+	Len() defs.Int
+}
+
 // DictRec -- потокобезопасный словарь KV-бакета.
 type DictRec struct {
-	dict  map[*store_key.AStoreKey]core_spec.IRecKv
+	dict  map[store_key.AStoreKey]rec_kv.IRecKv
 	block sync.RWMutex
 }
 
 // NewDictRec -- создание нового потокобезопасного словаря KV.
 func NewDictRec() *DictRec {
 	sf := &DictRec{
-		dict: map[*store_key.AStoreKey]core_spec.IRecKv{},
+		dict: map[store_key.AStoreKey]rec_kv.IRecKv{},
 	}
-	_ = core_spec.IDictRec(sf)
+	_ = IDictRec(sf)
 	return sf
 }
 
 // Get -- получение значения по ключу.
-func (sf *DictRec) Get(key *store_key.AStoreKey) mL0.IOption[core_spec.IRecKv] {
+func (sf *DictRec) Get(key store_key.IStoreKeyFix) mL0.IOption[rec_kv.IRecKv] {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
-	rec, isOk := sf.dict[key]
+	rec, isOk := sf.dict[key.Get()]
 	if !isOk {
-		return mL0.NewNone[core_spec.IRecKv]()
+		return mL0.NewNone[rec_kv.IRecKv]()
 	}
 	return mL0.NewSome(rec)
 }
 
 // Set -- установка значения по ключу.
-func (sf *DictRec) Set(rec core_spec.IRecKv) mL0.IResult[core_spec.EBool] {
+func (sf *DictRec) Set(rec rec_kv.IRecKv) mL0.IResult[core_spec.EBool] {
 	if rec == nil {
 		return mL0.NewErr[core_spec.EBool](fmt.Errorf("DictRec.Set(): rec is nil"))
 	}
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	sf.dict[rec.Meta().Key()] = rec
+	sf.dict[rec.Meta().Key().Get()] = rec
 	return mL0.NewOk(ebool.NewEBool(true))
 }
 
 // Del -- удаление значения по ключу.
-func (sf *DictRec) Del(key *store_key.AStoreKey) {
+func (sf *DictRec) Del(key store_key.IStoreKeyFix) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	delete(sf.dict, key)
+	delete(sf.dict, key.Get())
 }
 
 // Len -- количество элементов в словаре.

+ 7 - 8
v4/lev2/lsi/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec_test.go → v4/lev2/lsi/store_ent/dict_rec/dict_rec_test.go

@@ -3,11 +3,10 @@ package dict_rec
 import (
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/kstore_kv_std/rec_kv"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/kstore_kv_std/rec_meta"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/kstore_kv_std/rec_val"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_kv"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_meta"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_val"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
 type tester struct {
@@ -52,10 +51,10 @@ func (sf *tester) set_good1() {
 }
 
 // Возвращает новую запись для тестов.
-func (sf *tester) new_rec(key string) IRecKv {
-	_key := store_key.NewAStoreKey(key)
+func (sf *tester) new_rec(key store_key.AStoreKey) rec_kv.IRecKv {
+	_key := store_key.NewStoreKey(key)
 	meta := rec_meta.NewRecMeta(_key)
-	val := rec_val.NewRecVal(meta.Key_, []byte(key+"_val"))
+	val := rec_val.NewRecVal(store_key.IStoreKeyFix(store_key.NewStoreKey(meta.Key_)), []byte(key+"_val"))
 	rec := rec_kv.NewRecKv(meta, val)
 	return rec
 }

+ 48 - 0
v4/lev2/lsi/store_ent/rec_kv/rec_kv.go

@@ -0,0 +1,48 @@
+// package rec_kv -- запись KV-хранилища.
+package rec_kv
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_meta"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_val"
+)
+
+var (
+	hassert = helpers.Hassert
+)
+
+// IRecKv -- интерфейс записи KV-хранилища.
+type IRecKv interface {
+	// Meta -- метаданные записи
+	Meta() rec_meta.IRecMeta
+	// Val -- значение записи
+	Val() rec_val.IRecVal
+}
+
+// RecKv -- запись KV-хранилища.
+type RecKv struct {
+	meta rec_meta.IRecMeta // Метаданные записи
+	val  rec_val.IRecVal   // Значение записи
+}
+
+// NewRecKv -- создает новую запись.
+func NewRecKv(meta rec_meta.IRecMeta, val rec_val.IRecVal) *RecKv {
+	hassert(meta != nil, "NewRecKv(): meta==nil")
+	hassert(val != nil, "NewRecKv(): val==nil")
+	sf := &RecKv{
+		meta: meta,
+		val:  val,
+	}
+	_ = IRecKv(sf)
+	return sf
+}
+
+// Meta -- метаданные записи.
+func (sf *RecKv) Meta() rec_meta.IRecMeta {
+	return sf.meta
+}
+
+// Val -- значение записи.
+func (sf *RecKv) Val() rec_val.IRecVal {
+	return sf.val
+}

+ 6 - 6
v4/lev2/lsi/kstore_kv_std/rec_kv/rec_kv_test.go → v4/lev2/lsi/store_ent/rec_kv/rec_kv_test.go

@@ -3,9 +3,9 @@ package rec_kv
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/kstore_kv_std/rec_meta"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/kstore_kv_std/rec_val"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_meta"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_val"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
 type tester struct {
@@ -34,9 +34,9 @@ func (sf *tester) new_good1() {
 			sf.t.Fatalf("new_good1(): panic!=nil")
 		}
 	}()
-	key := store_key.NewAStoreKey("test_key")
-	meta := rec_meta.NewRecMeta(key)
-	val := rec_val.NewRecVal(meta.Key_, []byte("test_val"))
+	key := store_key.NewStoreKey("test_key")
+	meta := rec_meta.IRecMeta(rec_meta.NewRecMeta(key))
+	val := rec_val.NewRecVal(meta.Key(), []byte("test_val"))
 	rec := NewRecKv(meta, val)
 	if rec.Meta() != meta {
 		sf.t.Fatalf("new_good1(): rec.Meta()!=meta")

+ 25 - 11
v4/lev2/lsi/kstore_kv_std/rec_meta/rec_meta.go → v4/lev2/lsi/store_ent/rec_meta/rec_meta.go

@@ -3,15 +3,29 @@ package rec_meta
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
 var (
 	hassert = helpers.Hassert
 )
 
+// IRecMeta -- интерфейс мета-информации записи KV-хранилища.
+type IRecMeta interface {
+	// Key -- ключ записи
+	Key() store_key.IStoreKeyFix
+	// Vers -- версия записи
+	Vers() int64
+	// Operation -- тип операции над записью
+	Operation() string
+	// CreatedAt -- дата создания записи
+	CreatedAt() core_spec.ITime
+	// UpdateAt -- дата последнего обновления
+	UpdateAt() core_spec.ITimeMut
+}
+
 // RecMeta -- мета-информация записи KV-хранилища.
 //
 // Вся информация о записи хранится в JSON-строке, без форматирования
@@ -19,11 +33,11 @@ var (
 // Даже если ключ содержит пробелы или экранированное форматирование
 // JSON их экранирует внутри.
 type RecMeta struct {
-	Key_       *store_key.AStoreKey `json:"key"`       // Ключ
-	Vers_      int64                `json:"vers"`      // Версия записи
-	Operation_ string               `json:"operation"` // Тип операции над записью
-	createdAt_ core_spec.ITime      `voc:"created_at"` // Дата создания записи
-	updateAt_  core_spec.ITimeMut   `voc:"update_at"`  // Дата последнего обновления
+	Key_       store_key.AStoreKey `json:"key"`       // Ключ
+	Vers_      int64               `json:"vers"`      // Версия записи
+	Operation_ string              `json:"operation"` // Тип операции над записью
+	createdAt_ core_spec.ITime     `voc:"created_at"` // Дата создания записи
+	updateAt_  core_spec.ITimeMut  `voc:"update_at"`  // Дата последнего обновления
 
 	// Хеш мета-информации записи (вместе с значением, но без этого поля разумеется)
 	Sha_    string `json:"sha"`
@@ -31,24 +45,24 @@ type RecMeta struct {
 }
 
 // NewRecMeta -- создание новой мета-информации записи KV-хранилища.
-func NewRecMeta(key *store_key.AStoreKey) *RecMeta {
+func NewRecMeta(key store_key.IStoreKeyFix) *RecMeta {
 	hassert(key != nil, "NewRecMeta: key==nil")
 	sf := &RecMeta{
-		Key_:       key,
+		Key_:       key.Get(),
 		Vers_:      1,
 		Operation_: "create",
 		createdAt_: etime.NewETimeAuto(),
 		updateAt_:  etime.NewETimeAutoMut(),
 	}
-	_ = core_spec.IRecMeta(sf)
+	_ = IRecMeta(sf)
 	return sf
 }
 
 // Key -- ключ записи.
 //
 //go:fix inline
-func (sf *RecMeta) Key() *store_key.AStoreKey {
-	return sf.Key_
+func (sf *RecMeta) Key() store_key.IStoreKeyFix {
+	return store_key.NewStoreKey(sf.Key_)
 }
 
 // Vers -- версия записи.

+ 4 - 4
v4/lev2/lsi/kstore_kv_std/rec_meta/rec_meta_test.go → v4/lev2/lsi/store_ent/rec_meta/rec_meta_test.go

@@ -3,7 +3,7 @@ package rec_meta
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
 type tester struct {
@@ -22,8 +22,8 @@ func TestRecMeta(t *testing.T) {
 // Проверка методов мета-информации.
 func (sf *tester) gets() {
 	sf.t.Log("gets")
-	if key := sf.meta.Key_; key.Get() != "test" {
-		sf.t.Fatalf("gets(): key=%s", key)
+	if sf.meta.Key_ != "test" {
+		sf.t.Fatalf("gets(): key=%s", sf.meta.Key_)
 	}
 	if vers := sf.meta.Vers_; vers != 1 {
 		sf.t.Fatalf("gets(): vers=%d", vers)
@@ -59,7 +59,7 @@ func (sf *tester) newBad1() {
 			sf.t.Fatalf("newBad1(): panic!=nil")
 		}
 	}()
-	key := store_key.NewAStoreKey("test")
+	key := store_key.NewStoreKey("test")
 	sf.meta = NewRecMeta(key)
 	if sf.meta == nil {
 		sf.t.Fatalf("newBad1(): sf.meta==nil")

+ 16 - 9
v4/lev2/lsi/kstore_kv_std/rec_val/rec_val.go → v4/lev2/lsi/store_ent/rec_val/rec_val.go

@@ -2,11 +2,18 @@
 package rec_val
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
+// IRecVal -- значение записи.
+type IRecVal interface {
+	// Key -- возвращает ключ
+	Key() store_key.IStoreKeyFix
+	// Val -- возвращает значение
+	Val() []byte
+}
+
 var (
 	hassert = helpers.Hassert
 )
@@ -17,27 +24,27 @@ var (
 // в виде JSON-строки, без форматирования для того,
 // чтобы можно было файл значений бакета писать построчно.
 type RecVal struct {
-	Key_ *store_key.AStoreKey `json:"key"` // Ключ
-	Val_ []byte               `json:"val"` // Значение
+	Key_ store_key.AStoreKey `json:"key"` // Ключ
+	Val_ []byte              `json:"val"` // Значение
 }
 
 // NewRecVal -- создание нового значения KV-хранилища.
-func NewRecVal(key *store_key.AStoreKey, val []byte) *RecVal {
+func NewRecVal(key store_key.IStoreKeyFix, val []byte) *RecVal {
 	hassert(key != nil, "NewRecVal: key is empty")
 	if val == nil {
 		val = []byte{}
 	}
 	sf := &RecVal{
-		Key_: key,
+		Key_: key.Get(),
 		Val_: val,
 	}
-	_ = core_spec.IRecVal(sf)
+	_ = IRecVal(sf)
 	return sf
 }
 
 // Key -- ключ.
-func (sf *RecVal) Key() *store_key.AStoreKey {
-	return sf.Key_
+func (sf *RecVal) Key() store_key.IStoreKeyFix {
+	return store_key.NewStoreKey(sf.Key_)
 }
 
 // Val -- значение.

+ 2 - 2
v4/lev2/lsi/kstore_kv_std/rec_val/rec_val_test.go → v4/lev2/lsi/store_ent/rec_val/rec_val_test.go

@@ -3,7 +3,7 @@ package rec_val
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
 )
 
 type tester struct {
@@ -27,7 +27,7 @@ func (sf *tester) new() {
 // Ключ -- не пустая строка.
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	key := store_key.NewAStoreKey("key")
+	key := store_key.NewStoreKey("key")
 	sf.recVal = NewRecVal(key, nil)
 	if sf.recVal == nil {
 		sf.t.Fatalf("newGood1(): recVal==nil")

+ 29 - 0
v4/lev2/lsi/store_ent/store_ent.go

@@ -0,0 +1,29 @@
+package store_ent
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/dict_rec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/store_key"
+)
+
+// AStoreKey -- ключ хранилища.
+type AStoreKey = store_key.AStoreKey
+
+// IStoreKeyFix -- интерфейс ключа хранилища.
+type IStoreKeyFix = store_key.IStoreKeyFix
+
+// NewStoreKey -- создать новый ключ хранилища.
+//
+//go:fix inline
+func NewStoreKeyFix(val AStoreKey) IStoreKeyFix {
+	return store_key.NewStoreKey(val)
+}
+
+// IDictRec -- словарь записей.
+type IDictRec = dict_rec.IDictRec
+
+// NewDictRec -- возвращает новый словарь записей.
+//
+//go:fix inline
+func NewDictRec() IDictRec {
+	return dict_rec.NewDictRec()
+}

+ 0 - 0
v4/lev0/defs/store_key/README.md → v4/lev2/lsi/store_ent/store_key/README.md


+ 44 - 0
v4/lev2/lsi/store_ent/store_key/store_key.go

@@ -0,0 +1,44 @@
+// package store_key -- ключ хранилища
+package store_key
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+)
+
+// AStoreKey -- ключ хранилища.
+type AStoreKey string
+
+// IStoreKeyFix -- фиксированный ключ хранилища.
+type IStoreKeyFix interface {
+	// String -- строковое представление ключа хранилища.
+	String() string
+	// Get -- получить значение ключа хранилища.
+	Get() AStoreKey
+}
+
+// StoreKey -- ключ хранилища.
+type StoreKey struct {
+	val AStoreKey
+}
+
+// NewStoreKey -- создать новый ключ хранилища.
+func NewStoreKey(val AStoreKey) *StoreKey {
+	helpers.Hassert(val != "", "NewStoreKey(): val is empty")
+	return &StoreKey{
+		val: val,
+	}
+}
+
+// String -- строковое представление.
+//
+//go:fix inline
+func (sf *StoreKey) String() string {
+	return string(sf.val)
+}
+
+// Get -- получить значение.
+//
+//go:fix inline
+func (sf *StoreKey) Get() AStoreKey {
+	return sf.val
+}

+ 8 - 8
v4/lev0/defs/store_key/store_key_test.go → v4/lev2/lsi/store_ent/store_key/store_key_test.go

@@ -5,7 +5,7 @@ import "testing"
 func TestNewAStoreKey_ok(t *testing.T) {
 	t.Parallel()
 
-	cases := []string{
+	cases := []AStoreKey{
 		"key",
 		"key_1",
 		"ключ",
@@ -13,18 +13,18 @@ func TestNewAStoreKey_ok(t *testing.T) {
 	}
 
 	for _, tc := range cases {
-		t.Run(tc, func(t *testing.T) {
+		t.Run(string(tc), func(t *testing.T) {
 			t.Parallel()
 
-			k := NewAStoreKey(tc)
+			k := NewStoreKey(tc)
 			if k == nil {
 				t.Fatalf("NewAStoreKey(): nil")
 			}
-			if got := k.val.Get(); got != tc {
-				t.Fatalf("Get(): got=%q want=%q", got, tc)
+			if k.val != tc {
+				t.Fatalf("Get(): got=%q want=%q", k.val, tc)
 			}
-			if got := k.val.Get(); got != tc {
-				t.Fatalf("String(): got=%q want=%q", got, tc)
+			if k.val != tc {
+				t.Fatalf("String(): got=%q want=%q", k.val, tc)
 			}
 		})
 	}
@@ -39,5 +39,5 @@ func TestNewAStoreKey_empty_panics(t *testing.T) {
 		}
 	}()
 
-	_ = NewAStoreKey("")
+	_ = NewStoreKey("")
 }

+ 8 - 7
v4/lev0/core_spec/ibucket_base.go → v4/lev2/lsi/store_spec/ibucket_base.go

@@ -1,7 +1,8 @@
-package core_spec
+package store_spec
 
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent"
 )
 
 // IBucketBase -- интерфейс базового бакета хранилища KV.
@@ -9,19 +10,19 @@ type IBucketBase interface {
 	// Name -- имя бакета
 	Name() defs.BucketName
 	// Level -- уровень бакета
-	Level() EInt
+	Level() defs.Int
 	// Number -- номер бакета
-	Number() EInt
+	Number() defs.Int
 	// Size -- размер бакета
 	Size() int64
 	// SizeLimit -- лимит размера бакета
 	SizeLimit() int64
 	// CreatedAt -- время создания бакета
-	CreatedAt() EStr
+	CreatedAt() defs.Str
 	// UpdatedAt -- время обновления бакета
-	UpdatedAt() EStr
+	UpdatedAt() defs.Str
 	// Vers -- версия бакета
-	Vers() EInt
+	Vers() defs.Int
 	// DictRec -- словарь для хранения данных
-	DictRec() IDictRec
+	DictRec() store_ent.IDictRec
 }

+ 2 - 1
v4/lev3/mod_spec/imod_monolit.go

@@ -3,12 +3,13 @@ package mod_spec
 import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_ent"
 )
 
 // IKernelMonolit -- интерфейс к монолиту на основе ядра.
 type IKernelMonolit interface {
 	// Name -- возвращает имя монолита
-	Name() string
+	Name() mod_ent.AModuleName
 	// IsLocal -- возвращает признак локальной шины
 	IsLocal() core_spec.EBool
 	// IsWork -- возвращает признак работы монолита