Browse Source

涉及到多个表的元数据改动增加事务,保证数据完整

gitlink
Sydonian 2 years ago
parent
commit
3080acc8aa
3 changed files with 30 additions and 8 deletions
  1. +13
    -4
      internal/services/bucket.go
  2. +11
    -3
      internal/services/object.go
  3. +6
    -1
      internal/services/storage.go

+ 13
- 4
internal/services/bucket.go View File

@@ -1,6 +1,9 @@
package services

import (
"database/sql"

"github.com/jmoiron/sqlx"
"gitlink.org.cn/cloudream/common/consts/errorcode"
log "gitlink.org.cn/cloudream/common/pkg/logger"
"gitlink.org.cn/cloudream/db/model"
@@ -39,8 +42,13 @@ func (svc *Service) GetBucketObjects(msg *coormsg.GetBucketObjects) *coormsg.Get
}

func (svc *Service) CreateBucket(msg *coormsg.CreateBucket) *coormsg.CreateBucketResp {
bucketID, err := svc.db.Bucket().Create(svc.db.SQLCtx(), msg.Body.UserID, msg.Body.BucketName)

var bucketID int
var err error
svc.db.DoTx(sql.LevelDefault, func(tx *sqlx.Tx) error {
// 这里用的是外部的err
bucketID, err = svc.db.Bucket().Create(tx, msg.Body.UserID, msg.Body.BucketName)
return err
})
if err != nil {
log.WithField("UserID", msg.Body.UserID).
WithField("BucketName", msg.Body.BucketName).
@@ -52,8 +60,9 @@ func (svc *Service) CreateBucket(msg *coormsg.CreateBucket) *coormsg.CreateBucke
}

func (svc *Service) DeleteBucket(msg *coormsg.DeleteBucket) *coormsg.DeleteBucketResp {
err := svc.db.Bucket().Delete(svc.db.SQLCtx(), msg.Body.BucketID)

err := svc.db.DoTx(sql.LevelDefault, func(tx *sqlx.Tx) error {
return svc.db.Bucket().Delete(tx, msg.Body.BucketID)
})
if err != nil {
log.WithField("UserID", msg.Body.UserID).
WithField("BucketID", msg.Body.BucketID).


+ 11
- 3
internal/services/object.go View File

@@ -4,6 +4,7 @@ import (
"database/sql"
"errors"

"github.com/jmoiron/sqlx"
"github.com/samber/lo"
"gitlink.org.cn/cloudream/common/consts"
"gitlink.org.cn/cloudream/common/consts/errorcode"
@@ -173,7 +174,10 @@ func (svc *Service) PreUploadRepObject(msg *coormsg.PreUploadRepObject) *coormsg
}

func (svc *Service) CreateRepObject(msg *coormsg.CreateRepObject) *coormsg.CreateObjectResp {
_, err := svc.db.Object().CreateRepObject(svc.db.SQLCtx(), msg.Body.BucketID, msg.Body.ObjectName, msg.Body.FileSize, msg.Body.RepCount, msg.Body.NodeIDs, msg.Body.FileHash)
err := svc.db.DoTx(sql.LevelDefault, func(tx *sqlx.Tx) error {
_, err := svc.db.Object().CreateRepObject(tx, msg.Body.BucketID, msg.Body.ObjectName, msg.Body.FileSize, msg.Body.RepCount, msg.Body.NodeIDs, msg.Body.FileHash)
return err
})
if err != nil {
logger.WithField("BucketName", msg.Body.BucketID).
WithField("ObjectName", msg.Body.ObjectName).
@@ -253,7 +257,9 @@ func (svc *Service) PreUpdateRepObject(msg *coormsg.PreUpdateRepObject) *coormsg
}

func (svc *Service) UpdateRepObject(msg *coormsg.UpdateRepObject) *coormsg.UpdateRepObjectResp {
err := svc.db.Object().UpdateRepObject(svc.db.SQLCtx(), msg.Body.ObjectID, msg.Body.FileSize, msg.Body.NodeIDs, msg.Body.FileHash)
err := svc.db.DoTx(sql.LevelDefault, func(tx *sqlx.Tx) error {
return svc.db.Object().UpdateRepObject(tx, msg.Body.ObjectID, msg.Body.FileSize, msg.Body.NodeIDs, msg.Body.FileHash)
})
if err != nil {
logger.WithField("ObjectID", msg.Body.ObjectID).
Warnf("update rep object failed, err: %s", err.Error())
@@ -284,7 +290,9 @@ func (svc *Service) DeleteObject(msg *coormsg.DeleteObject) *coormsg.DeleteObjec
return ramsg.ReplyFailed[coormsg.DeleteObjectResp](errorcode.OPERATION_FAILED, "object is not available to the user")
}

err = svc.db.Object().SoftDelete(svc.db.SQLCtx(), msg.Body.ObjectID)
err = svc.db.DoTx(sql.LevelDefault, func(tx *sqlx.Tx) error {
return svc.db.Object().SoftDelete(tx, msg.Body.ObjectID)
})
if err != nil {
logger.WithField("UserID", msg.Body.UserID).
WithField("ObjectID", msg.Body.ObjectID).


+ 6
- 1
internal/services/storage.go View File

@@ -1,6 +1,9 @@
package services

import (
"database/sql"

"github.com/jmoiron/sqlx"
"gitlink.org.cn/cloudream/common/consts"
"gitlink.org.cn/cloudream/common/consts/errorcode"
log "gitlink.org.cn/cloudream/common/pkg/logger"
@@ -98,7 +101,9 @@ func (svc *Service) PreMoveObjectToStorage(msg *coormsg.PreMoveObjectToStorage)
}

func (svc *Service) MoveObjectToStorage(msg *coormsg.MoveObjectToStorage) *coormsg.MoveObjectToStorageResp {
err := svc.db.StorageObject().MoveObjectTo(svc.db.SQLCtx(), msg.Body.UserID, msg.Body.ObjectID, msg.Body.StorageID)
err := svc.db.DoTx(sql.LevelDefault, func(tx *sqlx.Tx) error {
return svc.db.StorageObject().MoveObjectTo(tx, msg.Body.UserID, msg.Body.ObjectID, msg.Body.StorageID)
})
if err != nil {
log.WithField("UserID", msg.Body.UserID).
WithField("ObjectID", msg.Body.ObjectID).


Loading…
Cancel
Save