VOL-1027 : Initial commit of voltha 2.0 data model
Change-Id: Ib8006de1af2166281ccf1c9d7c2b9156991bf4e4
diff --git a/db/model/data_revision.go b/db/model/data_revision.go
new file mode 100644
index 0000000..deceb87
--- /dev/null
+++ b/db/model/data_revision.go
@@ -0,0 +1,48 @@
+package model
+
+import (
+ "bytes"
+ "crypto/md5"
+ "encoding/json"
+ "fmt"
+ "github.com/golang/protobuf/proto"
+ "reflect"
+)
+
+type DataRevision struct {
+ Data interface{}
+ Hash string
+}
+
+func NewDataRevision(data interface{}) *DataRevision {
+ cdr := &DataRevision{}
+ cdr.Data = data
+ cdr.Hash = cdr.hashData(data)
+
+ return cdr
+}
+
+func (cr *DataRevision) hashData(data interface{}) string {
+ var buffer bytes.Buffer
+
+ if IsProtoMessage(data) {
+ if pbdata, err := proto.Marshal(data.(proto.Message)); err != nil {
+ fmt.Errorf("problem to marshal protobuf data --> err: %s", err.Error())
+ } else {
+ buffer.Write(pbdata)
+ }
+
+ } else if reflect.ValueOf(data).IsValid() {
+ dataObj := reflect.New(reflect.TypeOf(data).Elem())
+ if json, err := json.Marshal(dataObj.Interface()); err != nil {
+ fmt.Errorf("problem to marshal data --> err: %s", err.Error())
+ } else {
+ buffer.Write(json)
+ }
+ } else {
+ dataObj := reflect.New(reflect.TypeOf(data).Elem())
+ buffer.Write(dataObj.Bytes())
+ }
+
+ return fmt.Sprintf("%x", md5.Sum(buffer.Bytes()))[:12]
+}