99 lines
2.7 KiB
Go
99 lines
2.7 KiB
Go
// /futriis/pkg/types/types.go
|
||
// Пакет types определяет основные типы данных для СУБД futriis
|
||
|
||
package types
|
||
|
||
import (
|
||
"sync"
|
||
)
|
||
|
||
// Tuple представляет кортеж - аналог записи в таблице
|
||
// Содержит набор полей в формате ключ-значение
|
||
type Tuple struct {
|
||
ID string `msgpack:"id"`
|
||
Fields map[string]interface{} `msgpack:"fields"`
|
||
}
|
||
|
||
// NewTuple создаёт новый кортеж с указанным ID
|
||
func NewTuple(id string) *Tuple {
|
||
return &Tuple{
|
||
ID: id,
|
||
Fields: make(map[string]interface{}),
|
||
}
|
||
}
|
||
|
||
// Slice представляет слайс - аналог таблицы в РСУБД
|
||
// Содержит коллекцию кортежей
|
||
type Slice struct {
|
||
Name string `msgpack:"name"`
|
||
Tuples map[string]*Tuple `msgpack:"tuples"`
|
||
mu sync.RWMutex // Mutex для безопасного доступа, но не блокирующий wait-free операции
|
||
}
|
||
|
||
// NewSlice создаёт новый слайс с указанным именем
|
||
func NewSlice(name string) *Slice {
|
||
return &Slice{
|
||
Name: name,
|
||
Tuples: make(map[string]*Tuple),
|
||
}
|
||
}
|
||
|
||
// Lock блокирует слайс для записи
|
||
func (s *Slice) Lock() {
|
||
s.mu.Lock()
|
||
}
|
||
|
||
// Unlock разблокирует слайс после записи
|
||
func (s *Slice) Unlock() {
|
||
s.mu.Unlock()
|
||
}
|
||
|
||
// RLock блокирует слайс для чтения
|
||
func (s *Slice) RLock() {
|
||
s.mu.RLock()
|
||
}
|
||
|
||
// RUnlock разблокирует слайс после чтения
|
||
func (s *Slice) RUnlock() {
|
||
s.mu.RUnlock()
|
||
}
|
||
|
||
// Tapple представляет таппл - аналог базы данных в РСУБД
|
||
// Содержит коллекцию слайсов (таблиц)
|
||
type Tapple struct {
|
||
Name string `msgpack:"name"`
|
||
Slices map[string]*Slice `msgpack:"slices"`
|
||
mu sync.RWMutex // Mutex для безопасного доступа
|
||
}
|
||
|
||
// NewTapple создаёт новый таппл с указанным именем
|
||
func NewTapple(name string) *Tapple {
|
||
return &Tapple{
|
||
Name: name,
|
||
Slices: make(map[string]*Slice),
|
||
}
|
||
}
|
||
|
||
// Lock блокирует таппл для записи
|
||
func (t *Tapple) Lock() {
|
||
t.mu.Lock()
|
||
}
|
||
|
||
// Unlock разблокирует таппл после записи
|
||
func (t *Tapple) Unlock() {
|
||
t.mu.Unlock()
|
||
}
|
||
|
||
// RLock блокирует таппл для чтения
|
||
func (t *Tapple) RLock() {
|
||
t.mu.RLock()
|
||
}
|
||
|
||
// RUnlock разблокирует таппл после чтения
|
||
func (t *Tapple) RUnlock() {
|
||
t.mu.RUnlock()
|
||
}
|
||
|
||
// Value представляет значение любого типа, поддерживаемого MessagePack
|
||
type Value interface{}
|