package linedb import ( "sync" ) // LastIDManager управляет последними ID для коллекций 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(filename string) int { l.mutex.RLock() defer l.mutex.RUnlock() baseFileName := l.getBaseFileName(filename) return l.lastIDs[baseFileName] } // SetLastID устанавливает последний ID для коллекции func (l *LastIDManager) SetLastID(filename string, id int) { l.mutex.Lock() defer l.mutex.Unlock() baseFileName := l.getBaseFileName(filename) currentID := l.lastIDs[baseFileName] if currentID < id { l.lastIDs[baseFileName] = id } } // IncrementLastID увеличивает последний ID для коллекции func (l *LastIDManager) IncrementLastID(filename string) int { l.mutex.Lock() defer l.mutex.Unlock() baseFileName := l.getBaseFileName(filename) currentID := l.lastIDs[baseFileName] newID := currentID + 1 l.lastIDs[baseFileName] = newID return newID } // getBaseFileName извлекает базовое имя файла func (l *LastIDManager) getBaseFileName(filename string) string { if idx := l.findPartitionSeparator(filename); idx != -1 { return filename[:idx] } return filename } // findPartitionSeparator находит разделитель партиции func (l *LastIDManager) findPartitionSeparator(filename string) int { for i, char := range filename { if char == '_' { return i } } return -1 }