123 lines
2.6 KiB
Go
123 lines
2.6 KiB
Go
// /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
|
||
}
|