Add option --since
authorMikael Berthe <mikael@lilotux.net>
Sun, 19 Feb 2017 13:40:13 +0100
changeset 3 429d7e612cfd
parent 2 2452d9b23ec1
child 4 1ec268839876
Add option --since
gobm65.go
--- a/gobm65.go	Sun Feb 19 00:01:09 2017 +0100
+++ b/gobm65.go	Sun Feb 19 13:40:13 2017 +0100
@@ -6,6 +6,7 @@
 	"io"
 	"io/ioutil"
 	"log"
+	"time"
 
 	flag "github.com/docker/docker/pkg/mflag"
 	"github.com/tarm/serial"
@@ -159,10 +160,30 @@
 	return result
 }
 
+func parseDate(dateStr string) (date time.Time, err error) {
+	if dateStr == "" {
+		return
+	}
+
+	var yy, mm, dd, h, m, s int
+	n, e := fmt.Sscanf(dateStr, "%d-%d-%d %d:%d:%d", &yy, &mm, &dd, &h, &m, &s)
+	if e != nil && n < 3 {
+		err = e
+		return
+	}
+	if n < 6 {
+		log.Printf("Date parsed with only %d fields\n", n)
+	}
+	date = time.Date(yy, time.Month(mm), dd, h, m, s, 0, time.Local)
+	return
+}
+
 func main() {
 	inFile := flag.String([]string{"-input-file", "i"}, "", "Input JSON file")
 	outFile := flag.String([]string{"-output-file", "o"}, "", "Output JSON file")
-	limit := flag.Uint([]string{"-limit", "l"}, 0, "Limit number of items")
+	limit := flag.Uint([]string{"-limit", "l"}, 0, "Limit number of items to N first")
+	since := flag.String([]string{"-since"}, "",
+		"Filter records from date (YYYY-mm-dd HH:MM:SS)")
 	format := flag.String([]string{"-format", "f"}, "", "Output format (csv, json)")
 	avg := flag.Bool([]string{"-average", "a"}, false, "Compute average")
 	merge := flag.Bool([]string{"-merge", "m"}, false,
@@ -183,7 +204,11 @@
 		log.Fatal("Unknown output format.  Possible choices are csv, json.")
 	}
 
-	var err error
+	startDate, err := parseDate(*since)
+	if err != nil {
+		log.Fatal("Could not parse date: ", err)
+	}
+
 	var items []measurement
 
 	if *inFile == "" {
@@ -207,6 +232,19 @@
 		}
 	}
 
+	if !startDate.IsZero() {
+		log.Printf("Filtering out records before %v...\n", startDate)
+		for i := range items {
+			iDate := time.Date(items[i].Year, time.Month(items[i].Month),
+				items[i].Day, items[i].Hour, items[i].Minute, 0, 0,
+				time.Local)
+			if iDate.Sub(startDate) < 0 {
+				items = items[0:i]
+				break
+			}
+		}
+	}
+
 	if *limit > 0 && len(items) > int(*limit) {
 		items = items[0:*limit]
 	}