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.

shared_store.go 3.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package ops2
  2. import (
  3. "fmt"
  4. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/dag"
  5. "gitlink.org.cn/cloudream/common/pkgs/ioswitch/exec"
  6. "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch2"
  9. "gitlink.org.cn/cloudream/storage/common/pkgs/storage/mgr"
  10. )
  11. func init() {
  12. exec.UseOp[*SharedLoad]()
  13. }
  14. type SharedLoad struct {
  15. Input exec.VarID `json:"input"`
  16. StorageID cdssdk.StorageID `json:"storageID"`
  17. UserID cdssdk.UserID `json:"userID"`
  18. PackageID cdssdk.PackageID `json:"packageID"`
  19. Path string `json:"path"`
  20. FullPathOutput exec.VarID `json:"fullPathOutput"`
  21. }
  22. func (o *SharedLoad) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
  23. logger.
  24. WithField("Input", o.Input).
  25. Debugf("load file to shared store")
  26. defer logger.Debugf("load file to shared store finished")
  27. stgMgr, err := exec.GetValueByType[*mgr.Manager](ctx)
  28. if err != nil {
  29. return fmt.Errorf("getting storage manager: %w", err)
  30. }
  31. store, err := stgMgr.GetSharedStore(o.StorageID)
  32. if err != nil {
  33. return fmt.Errorf("getting shard store of storage %v: %w", o.StorageID, err)
  34. }
  35. input, err := exec.BindVar[*exec.StreamValue](e, ctx.Context, o.Input)
  36. if err != nil {
  37. return err
  38. }
  39. defer input.Stream.Close()
  40. fullPath, err := store.WritePackageObject(o.UserID, o.PackageID, o.Path, input.Stream)
  41. if err != nil {
  42. return fmt.Errorf("writing file to shard store: %w", err)
  43. }
  44. if o.FullPathOutput > 0 {
  45. e.PutVar(o.FullPathOutput, &exec.StringValue{
  46. Value: fullPath,
  47. })
  48. }
  49. return nil
  50. }
  51. func (o *SharedLoad) String() string {
  52. return fmt.Sprintf("SharedLoad %v -> %v:%v/%v/%v", o.Input, o.StorageID, o.UserID, o.PackageID, o.Path)
  53. }
  54. type SharedLoadNode struct {
  55. dag.NodeBase
  56. To ioswitch2.To
  57. StorageID cdssdk.StorageID
  58. UserID cdssdk.UserID
  59. PackageID cdssdk.PackageID
  60. Path string
  61. }
  62. func (b *GraphNodeBuilder) NewSharedLoad(to ioswitch2.To, stgID cdssdk.StorageID, userID cdssdk.UserID, packageID cdssdk.PackageID, path string) *SharedLoadNode {
  63. node := &SharedLoadNode{
  64. To: to,
  65. StorageID: stgID,
  66. UserID: userID,
  67. PackageID: packageID,
  68. Path: path,
  69. }
  70. b.AddNode(node)
  71. return node
  72. }
  73. func (t *SharedLoadNode) GetTo() ioswitch2.To {
  74. return t.To
  75. }
  76. func (t *SharedLoadNode) SetInput(input *dag.Var) {
  77. t.InputStreams().EnsureSize(1)
  78. input.StreamTo(t, 0)
  79. t.OutputValues().SetupNew(t, t.Graph().NewVar())
  80. }
  81. func (t *SharedLoadNode) Input() dag.Slot {
  82. return dag.Slot{
  83. Var: t.InputStreams().Get(0),
  84. Index: 0,
  85. }
  86. }
  87. func (t *SharedLoadNode) FullPathVar() *dag.Var {
  88. return t.OutputValues().Get(0)
  89. }
  90. func (t *SharedLoadNode) GenerateOp() (exec.Op, error) {
  91. return &SharedLoad{
  92. Input: t.InputStreams().Get(0).VarID,
  93. StorageID: t.StorageID,
  94. UserID: t.UserID,
  95. PackageID: t.PackageID,
  96. Path: t.Path,
  97. FullPathOutput: t.OutputValues().Get(0).VarID,
  98. }, nil
  99. }

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