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.5 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package db
  2. import (
  3. "gitlink.org.cn/cloudream/storage2/client/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 types.PackageID, spaceID types.UserSpaceID) (types.PackageAccessStat, error) {
  14. var ret types.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 types.PackageID) ([]types.PackageAccessStat, error) {
  19. var ret []types.PackageAccessStat
  20. err := ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Find(&ret).Error
  21. return ret, err
  22. }
  23. func (*PackageAccessStatDB) BatchGetByPackageID(ctx SQLContext, pkgIDs []types.PackageID) ([]types.PackageAccessStat, error) {
  24. if len(pkgIDs) == 0 {
  25. return nil, nil
  26. }
  27. var ret []types.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([]types.PackageAccessStat, len(entries))
  36. for i, e := range entries {
  37. accs[i] = types.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 []types.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 types.PackageID) error {
  62. return ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Delete(&types.PackageAccessStat{}).Error
  63. }

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