parent
6486e8799b
commit
f7c8039116
@ -1 +1 @@
|
|||||||
Subproject commit 1bd093315526ac8585a8c7a3499e50f2a13d82fa
|
Subproject commit b473ad0e45d4dcf4b090fbc155871009c084a92a
|
@ -0,0 +1,18 @@
|
|||||||
|
package bootstrap
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/cloudreve/Cloudreve/v3/models/scripts"
|
||||||
|
"github.com/cloudreve/Cloudreve/v3/pkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
func RunScript(name string) {
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
if err := scripts.RunDBScript(name, ctx); err != nil {
|
||||||
|
util.Log().Error("数据库脚本执行失败: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
util.Log().Info("数据库脚本 [%s] 执行完毕", name)
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package scripts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DBScript interface {
|
||||||
|
Run(ctx context.Context)
|
||||||
|
}
|
||||||
|
|
||||||
|
var availableScripts = make(map[string]DBScript)
|
||||||
|
|
||||||
|
func RunDBScript(name string, ctx context.Context) error {
|
||||||
|
if script, ok := availableScripts[name]; ok {
|
||||||
|
script.Run(ctx)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("数据库脚本 [%s] 不存在", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func register(name string, script DBScript) {
|
||||||
|
availableScripts[name] = script
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package scripts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
model "github.com/cloudreve/Cloudreve/v3/models"
|
||||||
|
"github.com/cloudreve/Cloudreve/v3/pkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UserStorageCalibration int
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
register("CalibrateUserStorage", UserStorageCalibration(0))
|
||||||
|
}
|
||||||
|
|
||||||
|
type storageResult struct {
|
||||||
|
Total uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run 运行脚本校准所有用户容量
|
||||||
|
func (script UserStorageCalibration) Run(ctx context.Context) {
|
||||||
|
// 列出所有用户
|
||||||
|
var res []model.User
|
||||||
|
model.DB.Model(&model.User{}).Find(&res)
|
||||||
|
|
||||||
|
// 逐个检查容量
|
||||||
|
for _, user := range res {
|
||||||
|
// 计算正确的容量
|
||||||
|
var total storageResult
|
||||||
|
model.DB.Model(&model.File{}).Where("user_id = ?", user.ID).Select("sum(size) as total").Scan(&total)
|
||||||
|
// 更新用户的容量
|
||||||
|
if user.Storage != total.Total {
|
||||||
|
util.Log().Info("将用户 [%s] 的容量由 %d 校准为 %d", user.Email,
|
||||||
|
user.Storage, total.Total)
|
||||||
|
model.DB.Model(&user).Update("storage", total.Total)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue