// Process dependencies and load a specific AccountActions profile from storDb into dataDb. func (self *ApierV1) LoadAccountActions(attrs utils.TPAccountActions, reply *string) error { if missing := utils.MissingStructFields(&attrs, []string{"TPid", "LoadId", "Tenant", "Account", "Direction"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } dbReader := engine.NewDbReader(self.StorDb, self.RatingDb, self.AccountDb, attrs.TPid) if attrs.LoadId == utils.EMPTY { attrs.LoadId = "" } if attrs.Tenant == utils.EMPTY { attrs.Tenant = "" } if attrs.Account == utils.EMPTY { attrs.Account = "" } if attrs.Direction == utils.EMPTY { attrs.Direction = "" } if _, err := engine.AccLock.Guard(attrs.KeyId(), func() (float64, error) { if err := dbReader.LoadAccountActionsFiltered(&attrs); err != nil { return 0, err } return 0, nil }); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } // ToDo: Get the action keys loaded by dbReader so we reload only these in cache // Need to do it before scheduler otherwise actions to run will be unknown if err := self.AccountDb.CacheAccounting(nil, nil, nil, []string{}); err != nil { return err } if self.Sched != nil { self.Sched.LoadActionTimings(self.AccountDb) self.Sched.Restart() } *reply = OK return nil }