+66
-2
@@ -1,6 +1,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
_ "embed"
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"context"
|
"context"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"flag"
|
"flag"
|
||||||
@@ -73,8 +77,68 @@ func (s S) init(ctx context.Context) error {
|
|||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (S) listen(ctx context.Context) error {
|
//go:embed index.html.tmpl
|
||||||
return ctx.Err()
|
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 {
|
func (s S) pingAndRecord(ctx context.Context) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user