From 2e339cff369b2ae02a09f8f3ef401bf6cfb0b928 Mon Sep 17 00:00:00 2001 From: bel Date: Sun, 28 Jun 2026 00:14:25 -0600 Subject: [PATCH] execute template w queries --- cmd/pinger/main.go | 68 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/cmd/pinger/main.go b/cmd/pinger/main.go index 0c44fd9..506d092 100644 --- a/cmd/pinger/main.go +++ b/cmd/pinger/main.go @@ -1,6 +1,10 @@ package main import ( + _ "embed" + "html/template" + "net/http" + "context" "database/sql" "flag" @@ -73,8 +77,68 @@ func (s S) init(ctx context.Context) error { return ctx.Err() } -func (S) listen(ctx context.Context) error { - return ctx.Err() +//go:embed index.html.tmpl +var IndexTemplate string + +func (s S) listen(ctx context.Context) error { + t := template.New("template") + t.Funcs(map[string]any{ + "query": func(q string) ([]map[string]any, error) { + rows, err := s.QueryContext(ctx, q) + if err != nil { + return nil, err + } + defer rows.Close() + + columns, err := rows.Columns() + if err != nil { + return nil, err + } + + results := []map[string]any{} + for rows.Next() { + var scanners []any + for range columns { + var a any + scanners = append(scanners, &a) + } + if err := rows.Scan(scanners...); err != nil { + return nil, err + } + result := map[string]any{} + for i, column := range columns { + result[column] = scanners[i] + } + results = append(results, result) + } + + return results, rows.Err() + }, + }) + t, err := t.Parse(IndexTemplate) + if err != nil { + return err + } + + server := &http.Server{ + Addr: ":10000", + Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if err := t.Execute(w, map[string]any{ + "DB": s.DB, + }); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + }), + } + go func() { + <-ctx.Done() + server.Close() + }() + + if err := server.ListenAndServe(); err != nil && ctx.Err() == nil { + return err + } + return nil } func (s S) pingAndRecord(ctx context.Context) error {