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  }