Files
call_monitor/db.go
T
egutierrez 134d8cf59e chore: auto-commit (11 archivos)
- app.md
- call_monitor
- db.go
- main.go
- operations.db
- operations.db-shm
- operations.db-wal
- migrations/006_function_sequences.sql
- migrations/007_calls_command_snippet.sql
- sequences.go
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 02:06:45 +02:00

78 lines
1.8 KiB
Go

package main
import (
"database/sql"
"embed"
"fmt"
"fn-registry/functions/infra"
)
//go:embed migrations/*.sql
var migrationsFS embed.FS
type DB struct{ conn *sql.DB }
func openDB(path string) (*DB, error) {
conn, err := infra.SQLiteOpen(path, "")
if err != nil {
return nil, err
}
if err := infra.ApplyMigrations(conn, migrationsFS, "migrations/*.sql"); err != nil {
conn.Close()
return nil, fmt.Errorf("migrate: %w", err)
}
return &DB{conn: conn}, nil
}
func (d *DB) Close() error { return d.conn.Close() }
type tableCount struct {
Name string
Rows int64
}
func (d *DB) tableCounts() ([]tableCount, error) {
tables := []string{"sessions", "calls", "code_writes", "test_runs", "e2e_runs_fn", "violations", "patterns", "function_versions", "copied_code", "function_sequences"}
out := make([]tableCount, 0, len(tables))
for _, t := range tables {
var n int64
if err := d.conn.QueryRow("SELECT COUNT(*) FROM " + t).Scan(&n); err != nil {
return nil, fmt.Errorf("count %s: %w", t, err)
}
out = append(out, tableCount{Name: t, Rows: n})
}
return out, nil
}
type funcStat struct {
FunctionID string
CallsTotal int64
Calls7d int64
ErrorsTotal int64
ErrorRate float64
MeanDurationMs float64
LastUsedAt sql.NullInt64
}
func (d *DB) topFunctions(limit int) ([]funcStat, error) {
rows, err := d.conn.Query(`
SELECT function_id, calls_total, calls_7d, errors_total, error_rate, mean_duration_ms, last_used_at
FROM function_stats
ORDER BY calls_total DESC
LIMIT ?`, limit)
if err != nil {
return nil, err
}
defer rows.Close()
var out []funcStat
for rows.Next() {
var s funcStat
if err := rows.Scan(&s.FunctionID, &s.CallsTotal, &s.Calls7d, &s.ErrorsTotal, &s.ErrorRate, &s.MeanDurationMs, &s.LastUsedAt); err != nil {
return nil, err
}
out = append(out, s)
}
return out, rows.Err()
}