heroagent/pkg/data/ourdb/factory.go
2025-04-23 04:18:28 +02:00

81 lines
1.7 KiB
Go

package ourdb
import (
"os"
)
const mbyte = 1000000
// OurDBConfig contains configuration options for creating a new database
type OurDBConfig struct {
RecordNrMax uint32
RecordSizeMax uint32
FileSize uint32
Path string
IncrementalMode bool
Reset bool
}
// DefaultConfig returns a default configuration
func DefaultConfig() OurDBConfig {
return OurDBConfig{
RecordNrMax: 16777216 - 1, // max size of records
RecordSizeMax: 1024 * 4, // max size in bytes of a record, is 4 KB default
FileSize: 500 * (1 << 20), // 500MB
IncrementalMode: true,
}
}
// New creates a new database with the given configuration
func New(config OurDBConfig) (*OurDB, error) {
// Determine appropriate keysize based on configuration
var keysize uint8 = 4
if config.RecordNrMax < 65536 {
keysize = 2
} else if config.RecordNrMax < 16777216 {
keysize = 3
} else {
keysize = 4
}
if float64(config.RecordSizeMax*config.RecordNrMax)/2 > mbyte*10 {
keysize = 6 // will use multiple files
}
// Create lookup table
l, err := NewLookup(LookupConfig{
Size: config.RecordNrMax,
KeySize: keysize,
IncrementalMode: config.IncrementalMode,
})
if err != nil {
return nil, err
}
// Reset database if requested
if config.Reset {
os.RemoveAll(config.Path)
}
// Create database directory
if err := os.MkdirAll(config.Path, 0755); err != nil {
return nil, err
}
// Create database instance
db := &OurDB{
path: config.Path,
lookup: l,
fileSize: config.FileSize,
incrementalMode: config.IncrementalMode,
}
// Load existing data if available
if err := db.Load(); err != nil {
return nil, err
}
return db, nil
}