...
1 package cmdopts
2
3 import (
4 "context"
5 "fmt"
6 "math"
7 "slices"
8 )
9
10 type MetricCommand struct {
11 owner *Options
12 PrintInit MetricPrintInitCommand `command:"print-init" description:"Get and print init SQL for a given metric or preset"`
13 PrintSQL MetricPrintSQLCommand `command:"print-sql" description:"Get and print SQL for a given metric"`
14 }
15
16 func NewMetricCommand(owner *Options) *MetricCommand {
17 return &MetricCommand{
18 owner: owner,
19 PrintInit: MetricPrintInitCommand{owner: owner},
20 PrintSQL: MetricPrintSQLCommand{owner: owner},
21 }
22 }
23
24 type MetricPrintInitCommand struct {
25 owner *Options
26 }
27
28 func (cmd *MetricPrintInitCommand) Execute(args []string) error {
29 err := cmd.owner.InitMetricReader(context.Background())
30 if err != nil {
31 return err
32 }
33 metrics, err := cmd.owner.MetricsReaderWriter.GetMetrics()
34 if err != nil {
35 return err
36 }
37 w := cmd.owner.OutputWriter
38 for _, name := range args {
39 if preset, ok := metrics.PresetDefs[name]; ok {
40 for k := range preset.Metrics {
41 args = append(args, k)
42 }
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