57 lines
1.7 KiB
Go
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
|
|
}
|