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 }