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