improve postgres support
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-02-10 19:40:20 +11:00
parent e0cbc20140
commit 3e3d8c2eb0
7 changed files with 743 additions and 9 deletions

39
main.go
View File

@@ -44,6 +44,7 @@ func main() {
runInventory := flag.Bool("run-inventory", false, "Run a single inventory snapshot across all configured vCenters and exit")
dbCleanup := flag.Bool("db-cleanup", false, "Run a one-time cleanup to drop low-value hourly snapshot indexes and exit")
backfillVcenterCache := flag.Bool("backfill-vcenter-cache", false, "Run a one-time backfill for vcenter latest+aggregate cache tables and exit")
importSQLite := flag.String("import-sqlite", "", "Import a SQLite database file/DSN into the configured Postgres database and exit")
flag.Parse()
bootstrapLogger := log.New(log.LevelInfo, log.OutputText)
@@ -68,18 +69,19 @@ func main() {
warnDeprecatedPollingSettings(logger, s.Values)
// Configure database
dbDriver := strings.TrimSpace(s.Values.Settings.DatabaseDriver)
if dbDriver == "" {
dbDriver = "sqlite"
}
normalizedDriver := strings.ToLower(strings.TrimSpace(dbDriver))
if normalizedDriver == "" || normalizedDriver == "sqlite3" {
normalizedDriver = "sqlite"
}
dbURL := strings.TrimSpace(s.Values.Settings.DatabaseURL)
normalizedDriver, inferredFromDSN, err := db.ResolveDriver(s.Values.Settings.DatabaseDriver, dbURL)
if err != nil {
logger.Error("Invalid database configuration", "error", err)
os.Exit(1)
}
if inferredFromDSN {
logger.Warn("database_driver is unset; inferred postgres from database_url")
}
if dbURL == "" && normalizedDriver == "sqlite" {
dbURL = utils.GetFilePath("db.sqlite3")
}
logger.Info("Effective database driver resolved", "driver", normalizedDriver)
database, err := db.New(logger, db.Config{
Driver: normalizedDriver,
@@ -97,6 +99,25 @@ func main() {
logger.Error("failed to migrate database", "error", err)
os.Exit(1)
}
if strings.TrimSpace(*importSQLite) != "" {
if normalizedDriver != "postgres" {
logger.Error("sqlite import requires settings.database_driver=postgres")
os.Exit(1)
}
logger.Info("starting one-time sqlite import into postgres", "sqlite_source", strings.TrimSpace(*importSQLite))
stats, err := db.ImportSQLiteIntoPostgres(ctx, logger, database.DB(), strings.TrimSpace(*importSQLite))
if err != nil {
logger.Error("failed to import sqlite database into postgres", "error", err)
os.Exit(1)
}
logger.Info("completed sqlite import into postgres",
"sqlite_source", stats.SourceDSN,
"tables_imported", stats.TablesImported,
"tables_skipped", stats.TablesSkipped,
"rows_imported", stats.RowsImported,
)
return
}
if *dbCleanup {
dropped, err := db.CleanupHourlySnapshotIndexes(ctx, database.DB())
if err != nil {
@@ -332,7 +353,7 @@ func main() {
gocron.CronJob(snapshotCleanupCron, false),
gocron.NewTask(func() {
ct.RunSnapshotCleanup(ctx, logger)
if strings.EqualFold(s.Values.Settings.DatabaseDriver, "sqlite") {
if normalizedDriver == "sqlite" {
logger.Info("Performing sqlite VACUUM after snapshot cleanup")
if _, err := ct.Database.DB().ExecContext(ctx, "VACUUM"); err != nil {
logger.Warn("VACUUM failed after snapshot cleanup", "error", err)