This commit is contained in:
@@ -258,9 +258,17 @@ func RegisterSnapshot(ctx context.Context, database db.Database, snapshotType st
|
||||
}
|
||||
dbConn := database.DB()
|
||||
driver := strings.ToLower(dbConn.DriverName())
|
||||
start := time.Now()
|
||||
slog.Debug("snapshot registry upsert start",
|
||||
"type", snapshotType,
|
||||
"table", tableName,
|
||||
"snapshot_time", snapshotTime.Unix(),
|
||||
"row_count", snapshotCount,
|
||||
)
|
||||
var err error
|
||||
switch driver {
|
||||
case "sqlite":
|
||||
_, err := dbConn.ExecContext(ctx, `
|
||||
_, err = dbConn.ExecContext(ctx, `
|
||||
INSERT INTO snapshot_registry (snapshot_type, table_name, snapshot_time, snapshot_count)
|
||||
VALUES (?, ?, ?, ?)
|
||||
ON CONFLICT(table_name) DO UPDATE SET
|
||||
@@ -268,9 +276,8 @@ ON CONFLICT(table_name) DO UPDATE SET
|
||||
snapshot_type = excluded.snapshot_type,
|
||||
snapshot_count = excluded.snapshot_count
|
||||
`, snapshotType, tableName, snapshotTime.Unix(), snapshotCount)
|
||||
return err
|
||||
case "pgx", "postgres":
|
||||
_, err := dbConn.ExecContext(ctx, `
|
||||
_, err = dbConn.ExecContext(ctx, `
|
||||
INSERT INTO snapshot_registry (snapshot_type, table_name, snapshot_time, snapshot_count)
|
||||
VALUES ($1, $2, $3, $4)
|
||||
ON CONFLICT (table_name) DO UPDATE SET
|
||||
@@ -278,10 +285,24 @@ ON CONFLICT (table_name) DO UPDATE SET
|
||||
snapshot_type = EXCLUDED.snapshot_type,
|
||||
snapshot_count = EXCLUDED.snapshot_count
|
||||
`, snapshotType, tableName, snapshotTime.Unix(), snapshotCount)
|
||||
return err
|
||||
default:
|
||||
return fmt.Errorf("unsupported driver for snapshot registry: %s", driver)
|
||||
}
|
||||
if err != nil {
|
||||
slog.Warn("snapshot registry upsert failed",
|
||||
"type", snapshotType,
|
||||
"table", tableName,
|
||||
"duration", time.Since(start),
|
||||
"error", err,
|
||||
)
|
||||
return err
|
||||
}
|
||||
slog.Debug("snapshot registry upsert complete",
|
||||
"type", snapshotType,
|
||||
"table", tableName,
|
||||
"duration", time.Since(start),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteSnapshotRecord(ctx context.Context, database db.Database, tableName string) error {
|
||||
@@ -524,6 +545,8 @@ func CreateTableReport(logger *slog.Logger, Database db.Database, ctx context.Co
|
||||
if err := db.ValidateTableName(tableName); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
start := time.Now()
|
||||
logger.Debug("Create table report start", "table", tableName)
|
||||
|
||||
dbConn := Database.DB()
|
||||
if strings.HasPrefix(tableName, "inventory_daily_summary_") || strings.HasPrefix(tableName, "inventory_monthly_summary_") {
|
||||
@@ -533,11 +556,13 @@ func CreateTableReport(logger *slog.Logger, Database db.Database, ctx context.Co
|
||||
}
|
||||
columns, err := tableColumns(ctx, dbConn, tableName)
|
||||
if err != nil {
|
||||
logger.Warn("Failed to load report columns", "table", tableName, "error", err)
|
||||
return nil, err
|
||||
}
|
||||
if len(columns) == 0 {
|
||||
return nil, fmt.Errorf("no columns found for table %s", tableName)
|
||||
}
|
||||
logger.Debug("Report columns loaded", "table", tableName, "columns", len(columns))
|
||||
|
||||
isHourlySnapshot := strings.HasPrefix(tableName, "inventory_hourly_")
|
||||
isDailySummary := strings.HasPrefix(tableName, "inventory_daily_summary_")
|
||||
@@ -618,9 +643,11 @@ func CreateTableReport(logger *slog.Logger, Database db.Database, ctx context.Co
|
||||
if orderBy != "" {
|
||||
query = fmt.Sprintf(`%s ORDER BY "%s" %s`, query, orderBy, orderDir)
|
||||
}
|
||||
logger.Debug("Report query prepared", "table", tableName, "order_by", orderBy, "order_dir", orderDir, "template_filter", applyTemplateFilter)
|
||||
|
||||
rows, err := dbConn.QueryxContext(ctx, query)
|
||||
if err != nil {
|
||||
logger.Warn("Report query failed", "table", tableName, "error", err)
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
@@ -670,6 +697,7 @@ func CreateTableReport(logger *slog.Logger, Database db.Database, ctx context.Co
|
||||
for rows.Next() {
|
||||
values, err := scanRowValues(rows, len(columns))
|
||||
if err != nil {
|
||||
logger.Warn("Report row scan failed", "table", tableName, "error", err)
|
||||
return nil, err
|
||||
}
|
||||
for colIndex, spec := range specs {
|
||||
@@ -692,8 +720,11 @@ func CreateTableReport(logger *slog.Logger, Database db.Database, ctx context.Co
|
||||
rowIndex++
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
logger.Warn("Report row iteration failed", "table", tableName, "error", err)
|
||||
return nil, err
|
||||
}
|
||||
rowCount := rowIndex - 2
|
||||
logger.Debug("Report rows populated", "table", tableName, "rows", rowCount)
|
||||
|
||||
if err := xlsx.SetPanes(sheetName, &excelize.Panes{
|
||||
Freeze: true,
|
||||
@@ -718,14 +749,17 @@ func CreateTableReport(logger *slog.Logger, Database db.Database, ctx context.Co
|
||||
}
|
||||
|
||||
addTotalsChartSheet(logger, Database, ctx, xlsx, tableName)
|
||||
logger.Debug("Report charts complete", "table", tableName)
|
||||
|
||||
if index, err := xlsx.GetSheetIndex(sheetName); err == nil {
|
||||
xlsx.SetActiveSheet(index)
|
||||
}
|
||||
|
||||
if err := xlsx.Write(&buffer); err != nil {
|
||||
logger.Warn("Report write failed", "table", tableName, "error", err)
|
||||
return nil, err
|
||||
}
|
||||
logger.Debug("Create table report complete", "table", tableName, "rows", rowCount, "bytes", buffer.Len(), "duration", time.Since(start))
|
||||
return buffer.Bytes(), nil
|
||||
}
|
||||
|
||||
@@ -737,18 +771,26 @@ func SaveTableReport(logger *slog.Logger, Database db.Database, ctx context.Cont
|
||||
if strings.TrimSpace(destDir) == "" {
|
||||
return "", fmt.Errorf("destination directory is empty")
|
||||
}
|
||||
start := time.Now()
|
||||
logger.Debug("Save table report start", "table", tableName, "dest", destDir)
|
||||
if err := os.MkdirAll(destDir, 0o755); err != nil {
|
||||
logger.Warn("Report directory create failed", "table", tableName, "dest", destDir, "error", err)
|
||||
return "", fmt.Errorf("failed to create reports directory: %w", err)
|
||||
}
|
||||
logger.Debug("Report directory ready", "dest", destDir)
|
||||
|
||||
data, err := CreateTableReport(logger, Database, ctx, tableName)
|
||||
if err != nil {
|
||||
logger.Warn("Report render failed", "table", tableName, "error", err)
|
||||
return "", err
|
||||
}
|
||||
logger.Debug("Report rendered", "table", tableName, "bytes", len(data))
|
||||
filename := filepath.Join(destDir, fmt.Sprintf("%s.xlsx", tableName))
|
||||
if err := os.WriteFile(filename, data, 0o644); err != nil {
|
||||
logger.Warn("Report write failed", "table", tableName, "file", filename, "error", err)
|
||||
return "", err
|
||||
}
|
||||
logger.Debug("Save table report complete", "table", tableName, "file", filename, "duration", time.Since(start))
|
||||
return filename, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user