| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // slcli measured data listing support. |
| |
| package main |
| |
| import ( |
| "fmt" |
| |
| "v.io/v23/context" |
| "v.io/x/lib/cmdline" |
| "v.io/x/ref/lib/signals" |
| "v.io/x/ref/lib/v23cmd" |
| "v.io/x/sensorlog/internal/client" |
| "v.io/x/sensorlog/internal/config" |
| "v.io/x/sensorlog/internal/sbmodel" |
| "v.io/x/sensorlog/internal/sbutil" |
| "v.io/x/sensorlog/internal/util" |
| ) |
| |
| var cmdSLList = &cmdline.Command{ |
| Runner: v23cmd.RunnerFunc(runSLList), |
| Name: "list", |
| Short: "List measured data", |
| Long: ` |
| Prints all measured data points for the given stream and device, sorted |
| chronologically. |
| `, |
| ArgsName: "<device_id> <stream_id>", |
| ArgsLong: ` |
| <device_id> and <stream_id> specify the data stream to print the data points |
| from. |
| `, |
| } |
| |
| var ( |
| flagFollow bool |
| ) |
| |
| func init() { |
| cmdSLList.Flags.BoolVar(&flagFollow, "follow", false, "Follow updates until killed, similar to 'tail -f'.") |
| } |
| |
| // TODO(ivanpi): Add time interval querying and aggregation functions. |
| func runSLList(ctx *context.T, env *cmdline.Env, args []string) error { |
| if len(args) != 2 { |
| return env.UsageErrorf("expects exactly 2 arguments") |
| } |
| streamKey := &sbmodel.KStreamDef{ |
| DevId: args[0], |
| StreamId: args[1], |
| } |
| |
| dataPrintCb := func(key *sbmodel.KDataPoint, val sbmodel.VDataPoint) error { |
| fmt.Fprintf(env.Stdout, "%s %v\n", key.Timestamp.Format(config.TimeOutputFormat), val.Interface()) |
| return nil |
| } |
| |
| db, err := sbutil.CreateOrOpenDB(ctx, *flagSbService, sbmodel.MasterTables) |
| if err != nil { |
| return fmt.Errorf("failed opening Syncbase db: %v", err) |
| } |
| |
| if !flagFollow { |
| return client.ListStreamData(ctx, db, streamKey, dataPrintCb) |
| } |
| |
| ctx, stop := context.WithCancel(ctx) |
| |
| waitFollow := util.AsyncRun(func() error { |
| return client.FollowStreamData(ctx, db, streamKey, dataPrintCb) |
| }, func(err error) { |
| stop() |
| }) |
| |
| select { |
| case <-signals.ShutdownOnSignals(nil): |
| stop() |
| case <-ctx.Done(): |
| } |
| |
| return waitFollow() |
| } |