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