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.

pub_shards.go 2.7 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package pubshards
  2. import (
  3. "fmt"
  4. stgtypes "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/types"
  5. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  6. "gorm.io/gorm"
  7. "gorm.io/gorm/clause"
  8. )
  9. type LoadedStore struct {
  10. ShardStore stgtypes.ShardStore
  11. Config jcstypes.PubShards
  12. PasswordHash []byte
  13. ClientFileHashDB *gorm.DB
  14. }
  15. func (s *LoadedStore) StoreShard(userID jcstypes.UserID, path jcstypes.JPath, hash jcstypes.FileHash, size int64) (stgtypes.FileInfo, error) {
  16. info, err := s.ShardStore.Store(path, hash, size)
  17. if err != nil {
  18. return stgtypes.FileInfo{}, err
  19. }
  20. err = s.ClientFileHashDB.Clauses(clause.Insert{Modifier: "or ignore"}).Create(&FileEntry{
  21. UserID: userID,
  22. Path: info.Path,
  23. Hash: hash,
  24. Size: size,
  25. }).Error
  26. if err != nil {
  27. return stgtypes.FileInfo{}, err
  28. }
  29. return info, nil
  30. }
  31. func (s *LoadedStore) InfoShard(hash jcstypes.FileHash) (stgtypes.FileInfo, error) {
  32. return s.ShardStore.Info(hash)
  33. }
  34. func (s *LoadedStore) ListUserAll(userID jcstypes.UserID) ([]stgtypes.FileInfo, error) {
  35. var files []FileEntry
  36. err := s.ClientFileHashDB.Table("Files").Where("UserID = ?", userID).Find(&files).Error
  37. if err != nil {
  38. return nil, err
  39. }
  40. infos := make([]stgtypes.FileInfo, len(files))
  41. for i, file := range files {
  42. infos[i] = stgtypes.FileInfo{
  43. Path: file.Path,
  44. Size: file.Size,
  45. Hash: file.Hash,
  46. }
  47. }
  48. return infos, nil
  49. }
  50. func (s *LoadedStore) GC(userID jcstypes.UserID, fileHashes []jcstypes.FileHash) error {
  51. return s.ClientFileHashDB.Transaction(func(tx *gorm.DB) error {
  52. if err := tx.Delete(&FileEntry{}, "UserID = ?", userID).Error; err != nil {
  53. return fmt.Errorf("delete all hashes: %w", err)
  54. }
  55. hashes := make([]FileEntry, len(fileHashes))
  56. for i, hash := range fileHashes {
  57. hashes[i] = FileEntry{
  58. UserID: userID,
  59. Hash: hash,
  60. }
  61. }
  62. return tx.Clauses(clause.Insert{Modifier: "or ignore"}).Create(&hashes).Error
  63. })
  64. }
  65. func (s *LoadedStore) GetUserStats(userID jcstypes.UserID) stgtypes.Stats {
  66. // TODO 实现
  67. return stgtypes.Stats{}
  68. }
  69. func (s *LoadedStore) GetAllHashes() ([]jcstypes.FileHash, error) {
  70. var hashes []jcstypes.FileHash
  71. return hashes, s.ClientFileHashDB.Distinct("FileHash").Find(&hashes).Error
  72. }
  73. type FileEntry struct {
  74. UserID jcstypes.UserID `gorm:"column:UserID; type:bigint; primaryKey; not null" json:"userID"`
  75. Hash jcstypes.FileHash `gorm:"column:Hash; type:char(68); primaryKey; not null" json:"hash"`
  76. Path jcstypes.JPath `gorm:"column:Path; type:varchar(1024); not null; serializer:string" json:"path"`
  77. Size int64 `gorm:"column:Size; type:bigint; not null" json:"size"`
  78. }
  79. func (t FileEntry) TableName() string {
  80. return "Files"
  81. }

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