You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

object.go 2.3 kB

2 years ago
2 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package mq
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "github.com/jmoiron/sqlx"
  6. "gitlink.org.cn/cloudream/common/consts/errorcode"
  7. "gitlink.org.cn/cloudream/common/pkgs/logger"
  8. "gitlink.org.cn/cloudream/common/pkgs/mq"
  9. stgmod "gitlink.org.cn/cloudream/storage/common/models"
  10. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  11. )
  12. func (svc *Service) GetPackageObjects(msg *coormq.GetPackageObjects) (*coormq.GetPackageObjectsResp, *mq.CodeMessage) {
  13. // TODO 检查用户是否有权限
  14. objs, err := svc.db.Object().GetPackageObjects(svc.db.SQLCtx(), msg.PackageID)
  15. if err != nil {
  16. logger.WithField("PackageID", msg.PackageID).
  17. Warnf("get package objects: %s", err.Error())
  18. return nil, mq.Failed(errorcode.OperationFailed, "get package objects failed")
  19. }
  20. return mq.ReplyOK(coormq.NewGetPackageObjectsResp(objs))
  21. }
  22. func (svc *Service) GetPackageObjectDetails(msg *coormq.GetPackageObjectDetails) (*coormq.GetPackageObjectDetailsResp, *mq.CodeMessage) {
  23. var details []stgmod.ObjectDetail
  24. // 必须放在事务里进行,因为GetPackageBlockDetails是由多次数据库操作组成,必须保证数据的一致性
  25. err := svc.db.DoTx(sql.LevelSerializable, func(tx *sqlx.Tx) error {
  26. var err error
  27. _, err = svc.db.Package().GetByID(tx, msg.PackageID)
  28. if err != nil {
  29. return fmt.Errorf("getting package by id: %w", err)
  30. }
  31. details, err = svc.db.ObjectBlock().GetPackageBlockDetails(tx, msg.PackageID)
  32. if err != nil {
  33. return fmt.Errorf("getting package block details: %w", err)
  34. }
  35. return nil
  36. })
  37. if err != nil {
  38. logger.WithField("PackageID", msg.PackageID).Warn(err.Error())
  39. return nil, mq.Failed(errorcode.OperationFailed, "get package object block details failed")
  40. }
  41. return mq.ReplyOK(coormq.NewGetPackageObjectDetailsResp(details))
  42. }
  43. func (svc *Service) ChangeObjectRedundancy(msg *coormq.ChangeObjectRedundancy) (*coormq.ChangeObjectRedundancyResp, *mq.CodeMessage) {
  44. err := svc.db.DoTx(sql.LevelSerializable, func(tx *sqlx.Tx) error {
  45. return svc.db.Object().BatchUpdateRedundancy(tx, msg.Entries)
  46. })
  47. if err != nil {
  48. logger.Warnf("batch updating redundancy: %s", err.Error())
  49. return nil, mq.Failed(errorcode.OperationFailed, "batch update redundancy failed")
  50. }
  51. return mq.ReplyOK(coormq.RespChangeObjectRedundancy())
  52. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。