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.

package_access_stat.go 2.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package db
  2. import (
  3. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  4. "gorm.io/gorm"
  5. "gorm.io/gorm/clause"
  6. )
  7. type PackageAccessStatDB struct {
  8. *DB
  9. }
  10. func (db *DB) PackageAccessStat() *PackageAccessStatDB {
  11. return &PackageAccessStatDB{db}
  12. }
  13. func (*PackageAccessStatDB) Get(ctx SQLContext, pkgID jcstypes.PackageID, spaceID jcstypes.UserSpaceID) (jcstypes.PackageAccessStat, error) {
  14. var ret jcstypes.PackageAccessStat
  15. err := ctx.Table("PackageAccessStat").Where("PackageID = ? AND UserSpaceID = ?", pkgID, spaceID).First(&ret).Error
  16. return ret, err
  17. }
  18. func (*PackageAccessStatDB) GetByPackageID(ctx SQLContext, pkgID jcstypes.PackageID) ([]jcstypes.PackageAccessStat, error) {
  19. var ret []jcstypes.PackageAccessStat
  20. err := ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Find(&ret).Error
  21. return ret, err
  22. }
  23. func (*PackageAccessStatDB) BatchGetByPackageID(ctx SQLContext, pkgIDs []jcstypes.PackageID) ([]jcstypes.PackageAccessStat, error) {
  24. if len(pkgIDs) == 0 {
  25. return nil, nil
  26. }
  27. var ret []jcstypes.PackageAccessStat
  28. err := ctx.Table("PackageAccessStat").Where("PackageID IN (?)", pkgIDs).Find(&ret).Error
  29. return ret, err
  30. }
  31. func (*PackageAccessStatDB) BatchAddCounter(ctx SQLContext, entries []AddAccessStatEntry) error {
  32. if len(entries) == 0 {
  33. return nil
  34. }
  35. accs := make([]jcstypes.PackageAccessStat, len(entries))
  36. for i, e := range entries {
  37. accs[i] = jcstypes.PackageAccessStat{
  38. PackageID: e.PackageID,
  39. UserSpaceID: e.UserSpaceID,
  40. Counter: e.Counter,
  41. }
  42. }
  43. return ctx.Clauses(clause.OnConflict{
  44. Columns: []clause.Column{{Name: "PackageID"}, {Name: "UserSpaceID"}},
  45. DoUpdates: clause.Assignments(map[string]any{
  46. "Counter": gorm.Expr("Counter + values(Counter)"),
  47. }),
  48. }).Table("PackageAccessStat").Create(&accs).Error
  49. }
  50. func (*PackageAccessStatDB) BatchUpdateAmount(ctx SQLContext, pkgIDs []jcstypes.PackageID, historyWeight float64) error {
  51. if len(pkgIDs) == 0 {
  52. return nil
  53. }
  54. sql := "UPDATE PackageAccessStat SET Amount = Amount * ? + Counter * (1 - ?), Counter = 0 WHERE PackageID IN (?)"
  55. return ctx.Exec(sql, historyWeight, historyWeight, pkgIDs).Error
  56. }
  57. func (*PackageAccessStatDB) UpdateAllAmount(ctx SQLContext, historyWeight float64) error {
  58. sql := "UPDATE PackageAccessStat SET Amount = Amount * ? + Counter * (1 - ?), Counter = 0"
  59. return ctx.Exec(sql, historyWeight, historyWeight).Error
  60. }
  61. func (*PackageAccessStatDB) DeleteByPackageID(ctx SQLContext, pkgID jcstypes.PackageID) error {
  62. return ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Delete(&jcstypes.PackageAccessStat{}).Error
  63. }
  64. func (*PackageAccessStatDB) DeleteByUserSpaceID(ctx SQLContext, spaceID jcstypes.UserSpaceID) error {
  65. return ctx.Table("PackageAccessStat").Where("UserSpaceID = ?", spaceID).Delete(&jcstypes.PackageAccessStat{}).Error
  66. }

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