github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/devicetwin/dtclient/devicetwin_db.go (about) 1 package dtclient 2 3 import ( 4 "k8s.io/klog" 5 6 "github.com/kubeedge/kubeedge/edge/pkg/common/dbm" 7 ) 8 9 //DeviceTwin the struct of device twin 10 type DeviceTwin struct { 11 ID int64 `orm:"column(id);size(64);auto;pk"` 12 DeviceID string `orm:"column(deviceid); null; type(text)"` 13 Name string `orm:"column(name);null;type(text)"` 14 Description string `orm:"column(description);null;type(text)"` 15 Expected string `orm:"column(expected);null;type(text)"` 16 Actual string `orm:"column(actual);null;type(text)"` 17 ExpectedMeta string `orm:"column(expected_meta);null;type(text)"` 18 ActualMeta string `orm:"column(actual_meta);null;type(text)"` 19 ExpectedVersion string `orm:"column(expected_version);null;type(text)"` 20 ActualVersion string `orm:"column(actual_version);null;type(text)"` 21 Optional bool `orm:"column(optional);null;type(integer)"` 22 AttrType string `orm:"column(attr_type);null;type(text)"` 23 Metadata string `orm:"column(metadata);null;type(text)"` 24 } 25 26 //SaveDeviceTwin save device twin 27 func SaveDeviceTwin(doc *DeviceTwin) error { 28 num, err := dbm.DBAccess.Insert(doc) 29 klog.V(4).Infof("Insert affected Num: %d, %s", num, err) 30 return err 31 } 32 33 //DeleteDeviceTwinByDeviceID delete device twin 34 func DeleteDeviceTwinByDeviceID(deviceID string) error { 35 num, err := dbm.DBAccess.QueryTable(DeviceTwinTableName).Filter("deviceid", deviceID).Delete() 36 if err != nil { 37 klog.Errorf("Something wrong when deleting data: %v", err) 38 return err 39 } 40 klog.V(4).Infof("Delete affected Num: %d", num) 41 return nil 42 } 43 44 //DeleteDeviceTwin delete device twin 45 func DeleteDeviceTwin(deviceID string, name string) error { 46 num, err := dbm.DBAccess.QueryTable(DeviceTwinTableName).Filter("deviceid", deviceID).Filter("name", name).Delete() 47 if err != nil { 48 klog.Errorf("Something wrong when deleting data: %v", err) 49 return err 50 } 51 klog.V(4).Infof("Delete affected Num: %d", num) 52 return nil 53 } 54 55 // UpdateDeviceTwinField update special field 56 func UpdateDeviceTwinField(deviceID string, name string, col string, value interface{}) error { 57 num, err := dbm.DBAccess.QueryTable(DeviceTwinTableName).Filter("deviceid", deviceID).Filter("name", name).Update(map[string]interface{}{col: value}) 58 klog.V(4).Infof("Update affected Num: %d, %s", num, err) 59 return err 60 } 61 62 // UpdateDeviceTwinFields update special fields 63 func UpdateDeviceTwinFields(deviceID string, name string, cols map[string]interface{}) error { 64 num, err := dbm.DBAccess.QueryTable(DeviceTwinTableName).Filter("deviceid", deviceID).Filter("name", name).Update(cols) 65 klog.V(4).Infof("Update affected Num: %d, %v", num, err) 66 return err 67 } 68 69 // QueryDeviceTwin query Device 70 func QueryDeviceTwin(key string, condition string) (*[]DeviceTwin, error) { 71 twin := new([]DeviceTwin) 72 _, err := dbm.DBAccess.QueryTable(DeviceTwinTableName).Filter(key, condition).All(twin) 73 if err != nil { 74 return nil, err 75 } 76 return twin, nil 77 78 } 79 80 //DeviceTwinUpdate the struct for updating device twin 81 type DeviceTwinUpdate struct { 82 DeviceID string 83 Name string 84 Cols map[string]interface{} 85 } 86 87 //UpdateDeviceTwinMulti update device twin multi 88 func UpdateDeviceTwinMulti(updates []DeviceTwinUpdate) error { 89 var err error 90 for _, update := range updates { 91 err = UpdateDeviceTwinFields(update.DeviceID, update.Name, update.Cols) 92 if err != nil { 93 return err 94 } 95 } 96 return nil 97 } 98 99 //DeviceTwinTrans transaction of device twin 100 func DeviceTwinTrans(adds []DeviceTwin, deletes []DeviceDelete, updates []DeviceTwinUpdate) error { 101 var err error 102 obm := dbm.DBAccess 103 obm.Begin() 104 for _, add := range adds { 105 err = SaveDeviceTwin(&add) 106 if err != nil { 107 obm.Rollback() 108 return err 109 } 110 } 111 112 for _, delete := range deletes { 113 err = DeleteDeviceTwin(delete.DeviceID, delete.Name) 114 if err != nil { 115 obm.Rollback() 116 return err 117 } 118 } 119 120 for _, update := range updates { 121 err = UpdateDeviceTwinFields(update.DeviceID, update.Name, update.Cols) 122 if err != nil { 123 obm.Rollback() 124 return err 125 } 126 } 127 obm.Commit() 128 return nil 129 }