Files
elowdb-go/pkg/linedb/last_id_manager.go
2026-04-09 14:08:27 +06:00

57 lines
1.7 KiB
Go

package linedb
import (
"sync"
)
// LastIDManager управляет последними ID для коллекций.
// Ключ — полное имя коллекции (как в NextID/Insert), без обрезки по «_»:
// иначе user_data и events_A ломались бы на первый сегмент.
type LastIDManager struct {
lastIDs map[string]int
mutex sync.RWMutex
}
var lastIDManagerInstance *LastIDManager
var lastIDManagerOnce sync.Once
// GetInstance возвращает единственный экземпляр LastIDManager
func GetLastIDManagerInstance() *LastIDManager {
lastIDManagerOnce.Do(func() {
lastIDManagerInstance = &LastIDManager{
lastIDs: make(map[string]int),
}
})
return lastIDManagerInstance
}
// GetLastID получает последний ID для коллекции (ключ — полное имя коллекции).
func (l *LastIDManager) GetLastID(collectionKey string) int {
l.mutex.RLock()
defer l.mutex.RUnlock()
return l.lastIDs[collectionKey]
}
// SetLastID устанавливает последний ID для коллекции, если id больше текущего.
func (l *LastIDManager) SetLastID(collectionKey string, id int) {
l.mutex.Lock()
defer l.mutex.Unlock()
currentID := l.lastIDs[collectionKey]
if currentID < id {
l.lastIDs[collectionKey] = id
}
}
// IncrementLastID увеличивает последний ID для коллекции
func (l *LastIDManager) IncrementLastID(collectionKey string) int {
l.mutex.Lock()
defer l.mutex.Unlock()
currentID := l.lastIDs[collectionKey]
newID := currentID + 1
l.lastIDs[collectionKey] = newID
return newID
}