76 lines
2.0 KiB
Go
76 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
|
|
"geoip-rest/internal/importer"
|
|
)
|
|
|
|
const (
|
|
defaultCSVPath = "/initial_data/user_program_info_init_20251208.csv"
|
|
defaultUpdateDir = "/update_data"
|
|
defaultTimeout = 10 * time.Minute
|
|
defaultSchema = "public"
|
|
defaultLogDir = "/log"
|
|
targetTableName = "user_program_info_replica"
|
|
)
|
|
|
|
func main() {
|
|
dbURL, err := databaseURL()
|
|
if err != nil {
|
|
log.Fatalf("database config: %v", err)
|
|
}
|
|
|
|
csvPath := env("USER_PROGRAM_INFO_CSV", defaultCSVPath)
|
|
updateDir := env("USER_PROGRAM_UPDATE_DIR", defaultUpdateDir)
|
|
schema := env("USER_PROGRAM_INFO_SCHEMA", env("POSTGRES_SCHEMA", defaultSchema))
|
|
logDir := env("USER_PROGRAM_IMPORT_LOG_DIR", defaultLogDir)
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout)
|
|
defer cancel()
|
|
|
|
conn, err := pgx.Connect(ctx, dbURL)
|
|
if err != nil {
|
|
log.Fatalf("failed to connect to database: %v", err)
|
|
}
|
|
defer conn.Close(context.Background())
|
|
|
|
if err := importer.EnsureUserProgramReplica(ctx, conn, csvPath, schema, logDir); err != nil {
|
|
log.Fatalf("failed to ensure %s table: %v", targetTableName, err)
|
|
}
|
|
|
|
if err := importer.ImportUserProgramUpdates(ctx, conn, updateDir, schema, logDir); err != nil {
|
|
log.Fatalf("failed to import updates from %s: %v", updateDir, err)
|
|
}
|
|
|
|
log.Printf("%s is ready in schema %s using data from %s (updates: %s)", targetTableName, schema, csvPath, updateDir)
|
|
}
|
|
|
|
func env(key, fallback string) string {
|
|
if val := os.Getenv(key); val != "" {
|
|
return val
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
func databaseURL() (string, error) {
|
|
if url := os.Getenv("DATABASE_URL"); url != "" {
|
|
return url, nil
|
|
}
|
|
user := os.Getenv("POSTGRES_USER")
|
|
pass := os.Getenv("POSTGRES_PASSWORD")
|
|
host := env("POSTGRES_HOST", "localhost")
|
|
port := env("POSTGRES_PORT", "5432")
|
|
db := os.Getenv("POSTGRES_DB")
|
|
if user == "" || pass == "" || db == "" {
|
|
return "", fmt.Errorf("DATABASE_URL or POSTGRES_{USER,PASSWORD,DB} is required")
|
|
}
|
|
return fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", user, pass, host, port, db), nil
|
|
}
|