From 94132ec864e77ad9412e9150e74dc14410beb4ed Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Wed, 27 Dec 2023 00:37:20 +0800 Subject: [PATCH] Feat: fast init setting --- internal/bootstrap/setting.go | 72 ++++++++++++++++++++++++----------- internal/db/setting.go | 12 ++++++ 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/internal/bootstrap/setting.go b/internal/bootstrap/setting.go index 9722642..022409e 100644 --- a/internal/bootstrap/setting.go +++ b/internal/bootstrap/setting.go @@ -13,38 +13,64 @@ func InitSetting(ctx context.Context) error { } func initSettings(s map[string]settings.Setting) error { + settingsCache, err := db.GetSettingItemsToMap() + if err != nil { + return err + } for _, b := range s { - s := &model.Setting{ - Name: b.Name(), - Value: b.DefaultString(), - Type: b.Type(), - Group: b.Group(), - } - err := db.FirstOrCreateSettingItemValue(s) - if err != nil { - return err - } - err = b.Init(s.Value) - if err != nil { - return err + if s, ok := settingsCache[b.Name()]; ok { + err = b.Init(s.Value) + if err != nil { + return err + } + } else { + s := &model.Setting{ + Name: b.Name(), + Value: b.DefaultString(), + Type: b.Type(), + Group: b.Group(), + } + err := db.FirstOrCreateSettingItemValue(s) + if err != nil { + return err + } + err = b.Init(s.Value) + if err != nil { + return err + } } } return nil } +func settingEqual(s *model.Setting, b settings.Setting) bool { + return s.Type == b.Type() && s.Group == b.Group() && s.Name == b.Name() +} + func initAndFixSettings(s map[string]settings.Setting) error { + settingsCache, err := db.GetSettingItemsToMap() + if err != nil { + return err + } + var ( + setting *model.Setting + ) for _, b := range s { - s := &model.Setting{ - Name: b.Name(), - Value: b.DefaultString(), - Type: b.Type(), - Group: b.Group(), - } - err := db.FirstOrCreateSettingItemValue(s) - if err != nil { - return err + if sc, ok := settingsCache[b.Name()]; ok && settingEqual(sc, b) { + setting = sc + } else { + setting = &model.Setting{ + Name: b.Name(), + Value: b.DefaultString(), + Type: b.Type(), + Group: b.Group(), + } + err := db.FirstOrCreateSettingItemValue(setting) + if err != nil { + return err + } } - err = b.Init(s.Value) + err = b.Init(setting.Value) if err != nil { // auto fix err = b.SetString(b.DefaultString()) diff --git a/internal/db/setting.go b/internal/db/setting.go index abd99b0..4363652 100644 --- a/internal/db/setting.go +++ b/internal/db/setting.go @@ -11,6 +11,18 @@ func GetSettingItems() ([]*model.Setting, error) { return items, err } +func GetSettingItemsToMap() (map[string]*model.Setting, error) { + items, err := GetSettingItems() + if err != nil { + return nil, err + } + m := make(map[string]*model.Setting) + for _, item := range items { + m[item.Name] = item + } + return m, nil +} + func GetSettingItemByName(name string) (*model.Setting, error) { var item model.Setting err := db.Where("name = ?", name).First(&item).Error