| // 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. |
| |
| // Implements PersistentDataKey for each K<T> type, as described in types.vdl. |
| |
| package sbmodel |
| |
| import ( |
| "v.io/x/sensorlog_lite/internal/sbmodel/keyutil" |
| ) |
| |
| // PersistentDataKey is a type encapsulating data from the row key of a |
| // top-level value type persisted to Syncbase. |
| type PersistentDataKey interface { |
| // Table returns the name of the Syncbase table for the data type. |
| Table() string |
| // Key returns the row key for the value. |
| Key() string |
| // Parse parses the row key for the value into self. Returns an error if key |
| // is malformed. |
| Parse(key string) error |
| } |
| |
| // devicecfg : <DevId> |
| func (_ KDeviceCfg) Table() string { return "devicecfg" } |
| func (k *KDeviceCfg) Key() string { return keyutil.Join(k.DevId) } |
| func (k *KDeviceCfg) Parse(key string) error { |
| parts, err := keyutil.Split(key, 1) |
| if err != nil { |
| return err |
| } |
| k.DevId = parts[0] |
| return nil |
| } |
| |
| // streamdef : <DevId>/<StreamId> |
| func (_ KStreamDef) Table() string { return "streamdef" } |
| func (k *KStreamDef) Key() string { return keyutil.Join(k.DevId, k.StreamId) } |
| func (k *KStreamDef) Parse(key string) error { |
| parts, err := keyutil.Split(key, 2) |
| if err != nil { |
| return err |
| } |
| k.DevId, k.StreamId = parts[0], parts[1] |
| return nil |
| } |
| |
| // sdata : <DevId>/<StreamId>/<Timestamp> |
| func (k KDataPoint) Table() string { |
| return "sdata" |
| } |
| func (k *KDataPoint) Key() string { |
| return keyutil.Join(k.DevId, k.StreamId, keyutil.StringifyTime(k.Timestamp)) |
| } |
| func (k *KDataPoint) Parse(key string) error { |
| parts, err := keyutil.Split(key, 3) |
| if err != nil { |
| return err |
| } |
| timestamp, err := keyutil.ParseTime(parts[2]) |
| if err != nil { |
| return err |
| } |
| k.DevId, k.StreamId, k.Timestamp = parts[0], parts[1], timestamp |
| return nil |
| } |
| |
| // TableSpec defines a Syncbase table, encapsulating a key prototype and |
| // permissions. |
| type TableSpec struct { |
| Prototype PersistentDataKey |
| ReadOnly bool |
| } |
| |
| // All top-level types persisted to master device Syncbase. |
| var MasterTables = []TableSpec{ |
| {Prototype: &KDeviceCfg{}}, |
| {Prototype: &KStreamDef{}}, |
| {Prototype: &KDataPoint{}}, |
| } |
| |
| // All top-level types persisted to measured Syncbase. |
| var MeasuredTables = []TableSpec{ |
| {Prototype: &KStreamDef{}, ReadOnly: true}, |
| {Prototype: &KDataPoint{}}, |
| } |