76 lines
1.9 KiB
Go
76 lines
1.9 KiB
Go
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
|
|
}
|