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.

cache.go 3.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package db2
  2. import (
  3. "time"
  4. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  5. "gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
  6. "gorm.io/gorm/clause"
  7. )
  8. type CacheDB struct {
  9. *DB
  10. }
  11. func (db *DB) Cache() *CacheDB {
  12. return &CacheDB{DB: db}
  13. }
  14. func (*CacheDB) Get(ctx SQLContext, fileHash cdssdk.FileHash, stgID cdssdk.StorageID) (model.Cache, error) {
  15. var ret model.Cache
  16. err := ctx.Table("Cache").Where("FileHash = ? AND StorageID = ?", fileHash, stgID).First(&ret).Error
  17. return ret, err
  18. }
  19. func (*CacheDB) BatchGetAllFileHashes(ctx SQLContext, start int, count int) ([]string, error) {
  20. var ret []string
  21. err := ctx.Table("Cache").Distinct("FileHash").Offset(start).Limit(count).Pluck("FileHash", &ret).Error
  22. return ret, err
  23. }
  24. func (*CacheDB) GetByStorageID(ctx SQLContext, stgID cdssdk.StorageID) ([]model.Cache, error) {
  25. var ret []model.Cache
  26. err := ctx.Table("Cache").Where("StorageID = ?", stgID).Find(&ret).Error
  27. return ret, err
  28. }
  29. // Create 创建一条缓存记录,如果已有则不进行操作
  30. func (*CacheDB) Create(ctx SQLContext, fileHash cdssdk.FileHash, stgID cdssdk.StorageID, priority int) error {
  31. cache := model.Cache{FileHash: fileHash, StorageID: stgID, CreateTime: time.Now(), Priority: priority}
  32. return ctx.Where(cache).Attrs(cache).FirstOrCreate(&cache).Error
  33. }
  34. // 批量创建缓存记录
  35. func (*CacheDB) BatchCreate(ctx SQLContext, caches []model.Cache) error {
  36. if len(caches) == 0 {
  37. return nil
  38. }
  39. return ctx.Clauses(clause.OnConflict{
  40. Columns: []clause.Column{{Name: "FileHash"}, {Name: "StorageID"}},
  41. DoUpdates: clause.AssignmentColumns([]string{"CreateTime", "Priority"}),
  42. }).Create(&caches).Error
  43. }
  44. func (db *CacheDB) BatchCreateOnSameStorage(ctx SQLContext, fileHashes []cdssdk.FileHash, stgID cdssdk.StorageID, priority int) error {
  45. if len(fileHashes) == 0 {
  46. return nil
  47. }
  48. var caches []model.Cache
  49. var nowTime = time.Now()
  50. for _, hash := range fileHashes {
  51. caches = append(caches, model.Cache{
  52. FileHash: hash,
  53. StorageID: stgID,
  54. CreateTime: nowTime,
  55. Priority: priority,
  56. })
  57. }
  58. return db.BatchCreate(ctx, caches)
  59. }
  60. func (*CacheDB) StorageBatchDelete(ctx SQLContext, stgID cdssdk.StorageID, fileHashes []cdssdk.FileHash) error {
  61. if len(fileHashes) == 0 {
  62. return nil
  63. }
  64. return ctx.Table("Cache").Where("StorageID = ? AND FileHash IN (?)", stgID, fileHashes).Delete(&model.Cache{}).Error
  65. }
  66. // GetCachingFileStorages 查找缓存了指定文件的存储服务
  67. func (*CacheDB) GetCachingFileStorages(ctx SQLContext, fileHash cdssdk.FileHash) ([]cdssdk.Storage, error) {
  68. var stgs []cdssdk.Storage
  69. err := ctx.Table("Cache").Select("Storage.*").
  70. Joins("JOIN Storage ON Cache.StorageID = Storage.StorageID").
  71. Where("Cache.FileHash = ?", fileHash).
  72. Find(&stgs).Error
  73. return stgs, err
  74. }
  75. // DeleteStorageAll 删除一个存储服务所有的记录
  76. func (*CacheDB) DeleteStorageAll(ctx SQLContext, StorageID cdssdk.StorageID) error {
  77. return ctx.Where("StorageID = ?", StorageID).Delete(&model.Cache{}).Error
  78. }
  79. // FindCachingFileUserStorages 在缓存表中查询指定数据所在的节点
  80. func (*CacheDB) FindCachingFileUserStorages(ctx SQLContext, userID cdssdk.UserID, fileHash string) ([]cdssdk.Storage, error) {
  81. var stgs []cdssdk.Storage
  82. err := ctx.Table("Cache").Select("Storage.*").
  83. Joins("JOIN UserStorage ON Cache.StorageID = UserStorage.StorageID").
  84. Where("Cache.FileHash = ? AND UserStorage.UserID = ?", fileHash, userID).
  85. Find(&stgs).Error
  86. return stgs, err
  87. }

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