123 lines
2.6 KiB
Go
Raw Permalink Normal View History

2026-02-23 22:48:31 +03:00
// /futriis/internal/storage/slice.go
// Пакет storage реализует операции со слайсами (таблицами)
package storage
import (
"errors"
"sync/atomic"
"futriis/pkg/types"
"futriis/pkg/utils"
)
// SliceManager управляет операциями со слайсами
type SliceManager struct {
tupleManager *TupleManager
stats struct {
created int64
deleted int64
}
}
// NewSliceManager создаёт новый менеджер слайсов
func NewSliceManager() *SliceManager {
return &SliceManager{
tupleManager: NewTupleManager(),
}
}
// CreateSlice создаёт новый слайс в указанном таппле
func (sm *SliceManager) CreateSlice(tapple *types.Tapple, name string) (*types.Slice, error) {
if tapple == nil {
return nil, errors.New("tapple is nil")
}
tapple.RLock()
_, exists := tapple.Slices[name]
tapple.RUnlock()
if exists {
return nil, errors.New("slice already exists")
}
slice := types.NewSlice(name)
tapple.Lock()
tapple.Slices[name] = slice
tapple.Unlock()
atomic.AddInt64(&sm.stats.created, 1)
logger := utils.GetLogger()
if logger != nil {
logger.Log("INFO", "Created slice: "+name)
}
return slice, nil
}
// GetSlice возвращает слайс по имени
func (sm *SliceManager) GetSlice(tapple *types.Tapple, name string) (*types.Slice, error) {
if tapple == nil {
return nil, errors.New("tapple is nil")
}
tapple.RLock()
slice, exists := tapple.Slices[name]
tapple.RUnlock()
if !exists {
return nil, errors.New("slice not found")
}
return slice, nil
}
// DeleteSlice удаляет слайс
func (sm *SliceManager) DeleteSlice(tapple *types.Tapple, name string) error {
if tapple == nil {
return errors.New("tapple is nil")
}
tapple.Lock()
_, exists := tapple.Slices[name]
if !exists {
tapple.Unlock()
return errors.New("slice not found")
}
delete(tapple.Slices, name)
tapple.Unlock()
atomic.AddInt64(&sm.stats.deleted, 1)
logger := utils.GetLogger()
if logger != nil {
logger.Log("INFO", "Deleted slice: "+name)
}
return nil
}
// ListSlices возвращает список всех слайсов в таппле
func (sm *SliceManager) ListSlices(tapple *types.Tapple) []string {
if tapple == nil {
return nil
}
tapple.RLock()
defer tapple.RUnlock()
slices := make([]string, 0, len(tapple.Slices))
for name := range tapple.Slices {
slices = append(slices, name)
}
return slices
}
// GetTupleManager возвращает менеджер кортежей
func (sm *SliceManager) GetTupleManager() *TupleManager {
return sm.tupleManager
}