init elowdb go-port commit

This commit is contained in:
41 changed files with 7273 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
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
}