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_access_stat.go 3.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package db2
  2. import (
  3. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  4. stgmod "gitlink.org.cn/cloudream/storage2/common/models"
  5. coormq "gitlink.org.cn/cloudream/storage2/common/pkgs/mq/coordinator"
  6. "gorm.io/gorm"
  7. "gorm.io/gorm/clause"
  8. )
  9. type ObjectAccessStatDB struct {
  10. *DB
  11. }
  12. func (db *DB) ObjectAccessStat() *ObjectAccessStatDB {
  13. return &ObjectAccessStatDB{db}
  14. }
  15. func (*ObjectAccessStatDB) Get(ctx SQLContext, objID cdssdk.ObjectID, stgID cdssdk.StorageID) (stgmod.ObjectAccessStat, error) {
  16. var ret stgmod.ObjectAccessStat
  17. err := ctx.Table("ObjectAccessStat").
  18. Where("ObjectID = ? AND StorageID = ?", objID, stgID).
  19. First(&ret).Error
  20. return ret, err
  21. }
  22. func (*ObjectAccessStatDB) GetByObjectID(ctx SQLContext, objID cdssdk.ObjectID) ([]stgmod.ObjectAccessStat, error) {
  23. var ret []stgmod.ObjectAccessStat
  24. err := ctx.Table("ObjectAccessStat").
  25. Where("ObjectID = ?", objID).
  26. Find(&ret).Error
  27. return ret, err
  28. }
  29. func (*ObjectAccessStatDB) BatchGetByObjectID(ctx SQLContext, objIDs []cdssdk.ObjectID) ([]stgmod.ObjectAccessStat, error) {
  30. if len(objIDs) == 0 {
  31. return nil, nil
  32. }
  33. var ret []stgmod.ObjectAccessStat
  34. err := ctx.Table("ObjectAccessStat").
  35. Where("ObjectID IN ?", objIDs).
  36. Find(&ret).Error
  37. return ret, err
  38. }
  39. func (*ObjectAccessStatDB) BatchGetByObjectIDOnStorage(ctx SQLContext, objIDs []cdssdk.ObjectID, stgID cdssdk.StorageID) ([]stgmod.ObjectAccessStat, error) {
  40. if len(objIDs) == 0 {
  41. return nil, nil
  42. }
  43. var ret []stgmod.ObjectAccessStat
  44. err := ctx.Table("ObjectAccessStat").
  45. Where("ObjectID IN ? AND StorageID = ?", objIDs, stgID).
  46. Find(&ret).Error
  47. return ret, err
  48. }
  49. func (*ObjectAccessStatDB) BatchAddCounter(ctx SQLContext, entries []coormq.AddAccessStatEntry) error {
  50. if len(entries) == 0 {
  51. return nil
  52. }
  53. for _, entry := range entries {
  54. acc := stgmod.ObjectAccessStat{
  55. ObjectID: entry.ObjectID,
  56. StorageID: entry.StorageID,
  57. Counter: entry.Counter,
  58. }
  59. err := ctx.Table("ObjectAccessStat").
  60. Clauses(clause.OnConflict{
  61. Columns: []clause.Column{{Name: "ObjectID"}, {Name: "StorageID"}},
  62. DoUpdates: clause.Assignments(map[string]any{
  63. "Counter": gorm.Expr("Counter + values(Counter)"),
  64. }),
  65. }).Create(&acc).Error
  66. if err != nil {
  67. return err
  68. }
  69. }
  70. return nil
  71. }
  72. func (*ObjectAccessStatDB) BatchUpdateAmountInPackage(ctx SQLContext, pkgIDs []cdssdk.PackageID, historyWeight float64) error {
  73. if len(pkgIDs) == 0 {
  74. return nil
  75. }
  76. err := ctx.Exec("UPDATE ObjectAccessStat AS o INNER JOIN Object AS obj ON o.ObjectID = obj.ObjectID SET o.Amount = o.Amount * ? + o.Counter * (1 - ?), o.Counter = 0 WHERE obj.PackageID IN ?", historyWeight, historyWeight, pkgIDs).Error
  77. return err
  78. }
  79. func (*ObjectAccessStatDB) UpdateAllAmount(ctx SQLContext, historyWeight float64) error {
  80. err := ctx.Exec("UPDATE ObjectAccessStat SET Amount = Amount * ? + Counter * (1 - ?), Counter = 0", historyWeight, historyWeight).Error
  81. return err
  82. }
  83. func (*ObjectAccessStatDB) DeleteByObjectID(ctx SQLContext, objID cdssdk.ObjectID) error {
  84. err := ctx.Table("ObjectAccessStat").Where("ObjectID = ?", objID).Delete(nil).Error
  85. return err
  86. }
  87. func (*ObjectAccessStatDB) BatchDeleteByObjectID(ctx SQLContext, objIDs []cdssdk.ObjectID) error {
  88. if len(objIDs) == 0 {
  89. return nil
  90. }
  91. err := ctx.Table("ObjectAccessStat").Where("ObjectID IN ?", objIDs).Delete(nil).Error
  92. return err
  93. }
  94. func (*ObjectAccessStatDB) DeleteInPackage(ctx SQLContext, packageID cdssdk.PackageID) error {
  95. err := ctx.Exec("DELETE o FROM ObjectAccessStat o INNER JOIN Object obj ON o.ObjectID = obj.ObjectID WHERE obj.PackageID = ?", packageID).Error
  96. return err
  97. }

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