package model import ( "backend/client" "backend/util" "fmt" "log" ) type ActivityMod struct { AppId int `json:"AppId" db:"AppId"` ActivityType int `json:"activityType" db:"activityType"` Cfg *Activity `json:"Cfg" db:"-"` Page int `json:"CurrentPage" db:"-"` PageSize int `json:"PageSize" db:"-"` } type Activity struct { Id int `json:"id" db:"id"` Type int `json:"type" db:"type"` StartTime int64 `json:"start_time" db:"start_time"` EndTime int64 `json:"end_time" db:"end_time"` Level int `json:"level" db:"level_limit"` Title string `json:"title" db:"title"` MailTitle string `json:"mail_title" db:"mail_title"` MailContent string `json:"mail_content" db:"mail_content"` Cfg string `json:"cfg" db:"cfg"` CfgBuf []byte `json:"-" db:"cfg_buf"` Extra string `json:"extra" db:"extra"` Interval int `json:"interval" db:"interval"` } func (a *ActivityMod) ActivityList() (int, []Activity, error) { var activityList []Activity // do something AppCfg, err := util.GetAppConfig(a.AppId) if err != nil { return 0, nil, err } Db := util.MPool.GetMysqlDB(AppCfg, 1) if Db == nil { return 0, nil, fmt.Errorf("failed to get mysql db") } defer Db.Close() where := "" if a.ActivityType != 0 { where = fmt.Sprintf("WHERE `type`=%d", a.ActivityType) } var total int err = Db.Get(&total, fmt.Sprintf("SELECT COUNT(*) FROM t_activity_mod %s", where)) if err != nil { return 0, nil, fmt.Errorf("failed to get total count: %v", err) } err = Db.Select(&activityList, fmt.Sprintf("SELECT id, `type`, `start_time`, `end_time`, `level_limit`, `title`, `mail_title`, `mail_content`, `cfg`, `extra`, `interval` FROM t_activity_mod %s order by id desc limit %d, %d", where, (a.Page-1)*a.PageSize, a.PageSize)) if err != nil { return 0, nil, fmt.Errorf("failed to scan rows: %v", err) } return total, activityList, nil } func (a *ActivityMod) Edit() error { err := a.Cfg.Mashal() if err != nil { return err } AppCfg, err := util.GetAppConfig(a.AppId) if err != nil { return err } Db := util.MPool.GetMysqlDB(AppCfg, 1) if Db == nil { return fmt.Errorf("failed to get mysql db") } defer Db.Close() _, err = Db.Exec("UPDATE t_activity_mod SET type=?, start_time=?, end_time=?, level_limit=?, title=?, mail_title=?, mail_content=?, cfg=?, cfg_buf=?, extra=?, `interval`=? WHERE id=?", a.Cfg.Type, a.Cfg.StartTime, a.Cfg.EndTime, a.Cfg.Level, a.Cfg.Title, a.Cfg.MailTitle, a.Cfg.MailContent, a.Cfg.Cfg, a.Cfg.CfgBuf, a.Cfg.Extra, a.Cfg.Interval, a.Cfg.Id) if err != nil { return fmt.Errorf("failed to update activity: %v", err) } // reload cfg err = a.reloadCfg() if err != nil { log.Printf("failed to reload activity cfg: %v", err) } return nil } func (a *ActivityMod) Add() error { err := a.Cfg.Mashal() if err != nil { return err } AppCfg, err := util.GetAppConfig(a.AppId) if err != nil { return err } Db := util.MPool.GetMysqlDB(AppCfg, 1) if Db == nil { return fmt.Errorf("failed to get mysql db") } defer Db.Close() _, err = Db.Exec("INSERT INTO t_activity_mod (type, start_time, end_time, level_limit, title, mail_title, mail_content, cfg, cfg_buf, extra, `interval`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", a.Cfg.Type, a.Cfg.StartTime, a.Cfg.EndTime, a.Cfg.Level, a.Cfg.Title, a.Cfg.MailTitle, a.Cfg.MailContent, a.Cfg.Cfg, a.Cfg.CfgBuf, a.Cfg.Extra, a.Cfg.Interval) if err != nil { return fmt.Errorf("failed to insert activity: %v", err) } // reload cfg err = a.reloadCfg() if err != nil { log.Printf("failed to reload activity cfg: %v", err) } return nil } func (a *ActivityMod) Delete() error { AppCfg, err := util.GetAppConfig(a.AppId) if err != nil { return err } Db := util.MPool.GetMysqlDB(AppCfg, 1) if Db == nil { return fmt.Errorf("failed to get mysql db") } defer Db.Close() _, err = Db.Exec("DELETE FROM t_activity_mod WHERE id=?", a.Cfg.Id) if err != nil { return fmt.Errorf("failed to delete activity: %v", err) } // reload cfg err = a.reloadCfg() if err != nil { log.Printf("failed to reload activity cfg: %v", err) } return nil } func (a *Activity) Mashal() error { return nil } func (a *ActivityMod) reloadCfg() error { ServerList := util.GetServerInfo(a.AppId, 0) for _, server := range ServerList { go func(serverInfo util.ServerConfig) { err := client.ReloadActivity(serverInfo.AppId, serverInfo.ServerId, nil) if err != nil { log.Printf("failed to sync activity cfg: %v", err) } log.Printf("sent reload activity cfg message to server %d", server.ServerId) }(server) } return nil } func (a *ActivityMod) Sync(dest int) error { _, list, err := a.ActivityList() if err != nil { return err } AppCfg, err := util.GetAppConfig(dest) if err != nil { return err } Db := util.MPool.GetMysqlDB(AppCfg, 1) if Db == nil { return fmt.Errorf("failed to get mysql db") } defer Db.Close() for _, activity := range list { _, err = Db.Exec("INSERT INTO t_activity_mod (id, type, start_time, end_time, level_limit, title, mail_title, mail_content, cfg, cfg_buf, extra, `interval`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE type=?, start_time=?, end_time=?, level_limit=?, title=?, mail_title=?, mail_content=?, cfg=?, cfg_buf=?, extra=?, `interval`=?", activity.Id, activity.Type, activity.StartTime, activity.EndTime, activity.Level, activity.Title, activity.MailTitle, activity.MailContent, activity.Cfg, activity.CfgBuf, activity.Extra, activity.Interval, activity.Type, activity.StartTime, activity.EndTime, activity.Level, activity.Title, activity.MailTitle, activity.MailContent, activity.Cfg, activity.CfgBuf, activity.Extra, activity.Interval) if err != nil { return fmt.Errorf("failed to sync activity: %v", err) } } return nil }