...
1 package cmdopts
2
3 import (
4 "context"
5 "fmt"
6 "math"
7 "slices"
8
9 "golang.org/x/exp/maps"
10 )
11
12 type MetricCommand struct {
13 owner *Options
14 PrintInit MetricPrintInitCommand `command:"print-init" description:"Get and print init SQL for a given metric or preset"`
15 PrintSQL MetricPrintSQLCommand `command:"print-sql" description:"Get and print SQL for a given metric"`
16 }
17
18 func NewMetricCommand(owner *Options) *MetricCommand {
19 return &MetricCommand{
20 owner: owner,
21 PrintInit: MetricPrintInitCommand{owner: owner},
22 PrintSQL: MetricPrintSQLCommand{owner: owner},
23 }
24 }
25
26 type MetricPrintInitCommand struct {
27 owner *Options
28 }
29
30 func (cmd *MetricPrintInitCommand) Execute(args []string) error {
31 err := cmd.owner.InitMetricReader(context.Background())
32 if err != nil {
33 return err
34 }
35 metrics, err := cmd.owner.MetricsReaderWriter.GetMetrics()
36 if err != nil {
37 return err
38 }
39 w := cmd.owner.OutputWriter
40 for _, name := range args {
41 if preset, ok := metrics.PresetDefs[name]; ok {
42 args = append(args, maps.Keys(preset.Metrics)...)
43 }
44 }
45 slices.Sort(args)
46 args = slices.Compact(args)
47 for _, mname := range args {
48 if m, ok := metrics.MetricDefs[mname]; ok && m.InitSQL != "" {
49
50 fmt.Fprintln(w, "--", mname)
51 fmt.Fprintln(w, m.InitSQL)
52 }
53 }
54 cmd.owner.CompleteCommand(ExitCodeOK)
55 return nil
56 }
57
58 type MetricPrintSQLCommand struct {
59 owner *Options
60 Version int `short:"v" long:"version" description:"PostgreSQL version to get SQL for"`
61 }
62
63 func (cmd *MetricPrintSQLCommand) Execute(args []string) error {
64 err := cmd.owner.InitMetricReader(context.Background())
65 if err != nil {
66 return err
67 }
68 metrics, err := cmd.owner.MetricsReaderWriter.GetMetrics()
69 if err != nil {
70 return err
71 }
72 w := cmd.owner.OutputWriter
73 if cmd.Version == 0 {
74 cmd.Version = math.MaxInt32
75 }
76 for _, name := range args {
77 if m, ok := metrics.MetricDefs[name]; ok {
78 if v := m.GetSQL(cmd.Version); v > "" {
79 fmt.Fprintln(w, "--", name, v)
80 }
81 }
82 }
83 cmd.owner.CompleteCommand(ExitCodeOK)
84 return nil
85 }
86