package db import ( "gorm.io/driver/sqlite" "gorm.io/gorm" "time" ) var DB *gorm.DB func init() { var err error DB, err = gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{}) if err != nil { panic(err) } } type App struct { ID uint `json:"id" gorm:"primarykey"` // 应用ID PID int `json:"pid"` // 应用PID Name string `json:"name" gorm:"unique"` // 应用名称 Description string `json:"description"` // 应用描述 Script string `json:"script"` // 启动脚本 Command []string `json:"command" gorm:"serializer:json"` // 启动命令 Arguments []string `json:"arguments" gorm:"serializer:json"` // 启动参数 Stdin string `json:"stdin"` // 标准输入数据 Cwd string `json:"cwd"` // 工作目录 Environments map[string]string `json:"environments" gorm:"serializer:json"` // 自定义环境变量 Interpreter string `json:"interpreter"` // 脚本解释程序 InterpreterArgs []string `json:"interpreter_args" gorm:"serializer:json"` // 解释程序参数 Options map[string]any `json:"options" gorm:"serializer:json"` // 其它参数 RerunOnError *RerunOnError `json:"rerun_on_error" gorm:"serializer:json"` // 错误重启策略 StartCount int `json:"start_count"` // 应用启动次数 ErrorCount int `json:"error_count"` // 错误次数,配合 RerunOnError 使用 Status uint8 `json:"status"` // 应用状态 CreatedAt time.Time `json:"created_at"` // 创建时间 } // RerunOnError 错误重启策略 type RerunOnError struct { Enable bool `json:"enable"` // 是否支持错误重试 Count int64 `json:"count_on_error"` // 允许重试次数 } func SaveApp(app *App) error { if app.ID > 0 { return DB.Save(app).Error } else { return DB.Create(app).Error } } func WithAppID(id uint) func(*gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { return db.Where("id=?", id) } } func WithAppName(name string) func(*gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { return db.Where("name=?", name) } } func WithAppStatus(statuses ...uint8) func(*gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { switch len(statuses) { case 0: return db case 1: return db.Where("status=?", statuses[0]) default: return db.Where("status IN ?", statuses) } } } // FindApp 查找一个 App func FindApp(opts ...func(*gorm.DB) *gorm.DB) (*App, error) { var app App err := DB.Model(&App{}).Scopes(opts...).First(&app).Error if err != nil { return nil, err } return &app, nil } // FindApps 查找多个 App func FindApps(opts ...func(*gorm.DB) *gorm.DB) ([]*App, error) { var apps []*App err := DB.Model(&App{}).Scopes(opts...).Find(&apps).Error if err != nil { return nil, err } return apps, nil } func ConfigPid(pid int) func(*gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { return db.Set("pid", pid) } } func ConfigStatus(status uint8) func(*gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { return db.Set("status", status) } } func IncreaseStartCounter(db *gorm.DB) *gorm.DB { return db.Set("starts", gorm.Expr("starts + ?", 1)) } func UpdateApp(id uint, opts ...func(*gorm.DB) *gorm.DB) error { return DB.Model(&App{}).Scopes(opts...).Where("id=?", id).Error }