tianxiaoliang commented on a change in pull request #228:
URL: https://github.com/apache/servicecomb-kie/pull/228#discussion_r757359511



##########
File path: server/datasource/etcd/kv/kv_dao.go
##########
@@ -59,42 +56,98 @@ func (s *Dao) Create(ctx context.Context, kv *model.KVDoc) 
(*model.KVDoc, error)
        return kv, nil
 }
 
+func create(ctx context.Context, kv *model.KVDoc, options 
...datasource.WriteOption) (bool, error) {
+       opts := datasource.NewWriteOptions(options...)
+       kvBytes, err := json.Marshal(kv)
+       if err != nil {
+               openlog.Error("fail to marshal kv " + err.Error())
+               return false, err
+       }
+       // if syncEnable is true, will create task in a transaction operation
+       if opts.SyncEnable {
+               task, err := datasource.NewTask(sync.CreateAction, 
datasource.ConfigResource)
+               if err != nil {
+                       openlog.Error("fail to create task" + err.Error())
+                       return false, err
+               }
+               task.Data = kv
+               taskBytes, err := json.Marshal(task)
+               if err != nil {
+                       openlog.Error("fail to marshal task ")
+                       return false, err
+               }
+               kvOpPut := etcdadpt.OpPut(etcdadpt.WithStrKey(key.KV(kv.Domain, 
kv.Project, kv.ID)), etcdadpt.WithValue(kvBytes))
+               taskOpPut := 
etcdadpt.OpPut(etcdadpt.WithStrKey(key.TaskKey(kv.Domain, kv.Project, 
task.TaskID, task.Timestamp)), etcdadpt.WithValue(taskBytes))
+               cmpOpts := []etcdadpt.CmpOptions{
+                       etcdadpt.OpCmp(etcdadpt.CmpCreateRev(kvOpPut.Key), 
etcdadpt.CmpEqual, 0),
+                       etcdadpt.OpCmp(etcdadpt.CmpCreateRev(taskOpPut.Key), 
etcdadpt.CmpEqual, 0),
+               }
+               resp, err := etcdadpt.TxnWithCmp(ctx, 
[]etcdadpt.OpOptions{kvOpPut, taskOpPut}, cmpOpts, nil)
+               if err != nil {
+                       return false, err
+               }
+               return resp.Succeeded, nil
+       }
+       return etcdadpt.InsertBytes(ctx, key.KV(kv.Domain, kv.Project, kv.ID), 
kvBytes)
+}
+
 //Update update key value
-func (s *Dao) Update(ctx context.Context, kv *model.KVDoc) error {
-       keyKv := key.KV(kv.Domain, kv.Project, kv.ID)
-       resp, err := etcdadpt.Get(ctx, keyKv)
+func (s *Dao) Update(ctx context.Context, kv *model.KVDoc, options 
...datasource.WriteOption) error {
+       keyKV := key.KV(kv.Domain, kv.Project, kv.ID)
+       resp, err := etcdadpt.Get(ctx, keyKV)
        if err != nil {
                openlog.Error(err.Error())
                return err
        }
        if resp == nil {
-               return datasource.ErrRecordNotExists
+               return datasource.ErrKeyNotExists
        }
-
-       var old model.KVDoc
-       err = json.Unmarshal(resp.Value, &old)
+       var oldKV model.KVDoc
+       err = json.Unmarshal(resp.Value, &oldKV)
        if err != nil {
                openlog.Error(err.Error())
                return err
        }
-       old.LabelFormat = kv.LabelFormat
-       old.Value = kv.Value
-       old.Status = kv.Status
-       old.Checker = kv.Checker
-       old.UpdateTime = kv.UpdateTime
-       old.UpdateRevision = kv.UpdateRevision
-
-       bytes, err := json.Marshal(old)
+       oldKV.LabelFormat = kv.LabelFormat
+       oldKV.Value = kv.Value
+       oldKV.Status = kv.Status
+       oldKV.Checker = kv.Checker
+       oldKV.UpdateTime = kv.UpdateTime
+       oldKV.UpdateRevision = kv.UpdateRevision
+       err = update(ctx, &oldKV, options...)
        if err != nil {
                openlog.Error(err.Error())
                return err
        }
-       err = etcdadpt.PutBytes(ctx, keyKv, bytes)
+       return nil
+}
+
+func update(ctx context.Context, kv *model.KVDoc, options 
...datasource.WriteOption) error {
+       opts := datasource.NewWriteOptions(options...)

Review comment:
       这里也是抽到外边




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to