// /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 }