diff --git a/apier/v1/tpactiontimings.go b/apier/v1/tpactiontimings.go index f8983041a..308c914d9 100644 --- a/apier/v1/tpactiontimings.go +++ b/apier/v1/tpactiontimings.go @@ -25,22 +25,17 @@ import ( ) // Creates a new ActionTimings profile within a tariff plan -func (self *ApierV1) SetTPActionTimings(attrs utils.ApiTPActionTimings, reply *string) error { +func (self *ApierV1) SetTPActionTimings(attrs utils.TPActionTimings, reply *string) error { if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId", "ActionTimings"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } for _, at := range attrs.ActionTimings { requiredFields := []string{"ActionsId", "TimingId", "Weight"} - if missing := utils.MissingStructFields(&at, requiredFields); len(missing) != 0 { + if missing := utils.MissingStructFields(at, requiredFields); len(missing) != 0 { return fmt.Errorf("%s:Action:%s:%v", utils.ERR_MANDATORY_IE_MISSING, at.ActionsId, missing) } } - if exists, err := self.StorDb.ExistsTPActionTimings(attrs.TPid, attrs.ActionTimingsId); err != nil { - return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) - } else if exists { - return errors.New(utils.ERR_DUPLICATE) - } - if err := self.StorDb.SetTPActionTimings(attrs.TPid, map[string][]*utils.ApiActionTiming{attrs.ActionTimingsId: attrs.ActionTimings}); err != nil { + if err := self.StorDb.SetTPActionTimings(attrs.TPid, map[string][]*utils.TPActionTiming{attrs.ActionTimingsId: attrs.ActionTimings}); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } *reply = "OK" @@ -53,7 +48,7 @@ type AttrGetTPActionTimings struct { } // Queries specific ActionTimings profile on tariff plan -func (self *ApierV1) GetTPActionTimings(attrs AttrGetTPActionTimings, reply *utils.ApiTPActionTimings) error { +func (self *ApierV1) GetTPActionTimings(attrs AttrGetTPActionTimings, reply *utils.TPActionTimings) error { if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId"}); len(missing) != 0 { //Params missing return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } @@ -62,7 +57,7 @@ func (self *ApierV1) GetTPActionTimings(attrs AttrGetTPActionTimings, reply *uti } else if len(ats) == 0 { return errors.New(utils.ERR_NOT_FOUND) } else { // Got the data we need, convert it - atRply := &utils.ApiTPActionTimings{attrs.TPid, attrs.ActionTimingsId, ats[attrs.ActionTimingsId]} + atRply := &utils.TPActionTimings{attrs.TPid, attrs.ActionTimingsId, ats[attrs.ActionTimingsId]} *reply = *atRply } return nil @@ -86,3 +81,16 @@ func (self *ApierV1) GetTPActionTimingIds(attrs AttrGetTPActionTimingIds, reply } return nil } + +// Removes specific ActionTimings on Tariff plan +func (self *ApierV1) RemTPActionTimings(attrs AttrGetTPActionTimings, reply *string) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId"}); len(missing) != 0 { //Params missing + return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) + } + if err := self.StorDb.RemTPData(utils.TBL_TP_ACTION_TIMINGS, attrs.TPid, attrs.ActionTimingsId); err != nil { + return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) + } else { + *reply = "OK" + } + return nil +} diff --git a/engine/storage_interface.go b/engine/storage_interface.go index 3f5b197fb..5c11eb2c6 100644 --- a/engine/storage_interface.go +++ b/engine/storage_interface.go @@ -131,8 +131,8 @@ type LoadStorage interface { GetTPActions(string, string) (*utils.TPActions, error) GetTPActionIds(string) ([]string, error) ExistsTPActionTimings(string, string) (bool, error) - SetTPActionTimings(string, map[string][]*utils.ApiActionTiming) error - GetTPActionTimings(string, string) (map[string][]*utils.ApiActionTiming, error) + SetTPActionTimings(string, map[string][]*utils.TPActionTiming) error + GetTPActionTimings(string, string) (map[string][]*utils.TPActionTiming, error) GetTPActionTimingIds(string) ([]string, error) ExistsTPActionTriggers(string, string) (bool, error) SetTPActionTriggers(string, map[string][]*ActionTrigger) error @@ -148,7 +148,7 @@ type LoadStorage interface { GetTpRatingPlans(string, string) (*utils.TPRatingPlan, error) GetTpRatingProfiles(string, string) (map[string]*utils.TPRatingProfile, error) GetTpActions(string, string) (map[string][]*Action, error) - GetTpActionTimings(string, string) (map[string][]*utils.ApiActionTiming, error) + GetTpActionTimings(string, string) (map[string][]*utils.TPActionTiming, error) GetTpActionTriggers(string, string) (map[string][]*utils.ApiActionTrigger, error) GetTpAccountActions(string, string) (map[string]*AccountAction, error) } diff --git a/engine/storage_sql.go b/engine/storage_sql.go index 1b6f49355..f5969d79f 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -630,30 +630,31 @@ func (self *SQLStorage) ExistsTPActionTimings(tpid, atId string) (bool, error) { } // Sets actionTimings in sqlDB. Imput is expected in form map[actionTimingId][]rows, eg a full .csv file content -func (self *SQLStorage) SetTPActionTimings(tpid string, ats map[string][]*utils.ApiActionTiming) error { +func (self *SQLStorage) SetTPActionTimings(tpid string, ats map[string][]*utils.TPActionTiming) error { if len(ats) == 0 { return nil //Nothing to set } - qry := fmt.Sprintf("INSERT INTO %s (tpid,tag,actions_tag,timing_tag,weight) VALUES ", utils.TBL_TP_ACTION_TIMINGS) + vals := "" i := 0 for atId, atRows := range ats { for _, at := range atRows { if i != 0 { //Consecutive values after the first will be prefixed with "," as separator - qry += "," + vals += "," } - qry += fmt.Sprintf("('%s','%s','%s','%s',%f)", + vals += fmt.Sprintf("('%s','%s','%s','%s',%f)", tpid, atId, at.ActionsId, at.TimingId, at.Weight) i++ } } + qry := fmt.Sprintf("INSERT INTO %s (tpid,tag,actions_tag,timing_tag,weight) VALUES %s ON DUPLICATE KEY UPDATE timing_tag=values(timing_tag),weight=values(weight)", utils.TBL_TP_ACTION_TIMINGS, vals) if _, err := self.Db.Exec(qry); err != nil { return err } return nil } -func (self *SQLStorage) GetTPActionTimings(tpid, atId string) (map[string][]*utils.ApiActionTiming, error) { - ats := make(map[string][]*utils.ApiActionTiming) +func (self *SQLStorage) GetTPActionTimings(tpid, atId string) (map[string][]*utils.TPActionTiming, error) { + ats := make(map[string][]*utils.TPActionTiming) q := fmt.Sprintf("SELECT tag,actions_tag,timing_tag,weight FROM %s WHERE tpid='%s'", utils.TBL_TP_ACTION_TIMINGS, tpid) if atId != "" { q += fmt.Sprintf(" AND tag='%s'", atId) @@ -671,7 +672,7 @@ func (self *SQLStorage) GetTPActionTimings(tpid, atId string) (map[string][]*uti if err = rows.Scan(&tag, &actionsId, &timingId, &weight); err != nil { return nil, err } - ats[tag] = append(ats[tag], &utils.ApiActionTiming{actionsId, timingId, weight}) + ats[tag] = append(ats[tag], &utils.TPActionTiming{actionsId, timingId, weight}) } return ats, nil } @@ -1177,7 +1178,7 @@ func (self *SQLStorage) GetTpActions(tpid, tag string) (map[string][]*Action, er return as, nil } -func (self *SQLStorage) GetTpActionTimings(tpid, tag string) (map[string][]*utils.ApiActionTiming, error) { +func (self *SQLStorage) GetTpActionTimings(tpid, tag string) (map[string][]*utils.TPActionTiming, error) { q := fmt.Sprintf("SELECT tag,actions_tag,timing_tag,weight FROM %s WHERE tpid='%s'", utils.TBL_TP_ACTION_TIMINGS, tpid) if tag != "" { q += fmt.Sprintf(" AND tag='%s'", tag) @@ -1187,14 +1188,14 @@ func (self *SQLStorage) GetTpActionTimings(tpid, tag string) (map[string][]*util return nil, err } defer rows.Close() - ats := make(map[string][]*utils.ApiActionTiming) + ats := make(map[string][]*utils.TPActionTiming) for rows.Next() { var weight float64 var tag, actions_tag, timing_tag string if err := rows.Scan(&tag, &actions_tag, &timing_tag, &weight); err != nil { return nil, err } - at := &utils.ApiActionTiming { + at := &utils.TPActionTiming { ActionsId: tag, TimingId: timing_tag, Weight: weight, diff --git a/engine/tpimporter_csv.go b/engine/tpimporter_csv.go index 12c44fe2d..fc2b8a79a 100644 --- a/engine/tpimporter_csv.go +++ b/engine/tpimporter_csv.go @@ -355,14 +355,14 @@ func (self *TPCSVImporter) importActionTimings(fn string) error { } continue } - at := []*utils.ApiActionTiming{ - &utils.ApiActionTiming{ + at := []*utils.TPActionTiming{ + &utils.TPActionTiming{ ActionsId: actionsTag, TimingId: timingTag, Weight: weight, }, } - if err := self.StorDb.SetTPActionTimings(self.TPid, map[string][]*utils.ApiActionTiming{tag: at}); err != nil { + if err := self.StorDb.SetTPActionTimings(self.TPid, map[string][]*utils.TPActionTiming{tag: at}); err != nil { if self.Verbose { log.Printf("Ignoring line %d, storDb operational error: <%s> ", lineNr, err.Error()) } diff --git a/utils/apitpdata.go b/utils/apitpdata.go index c048fae59..db5c3ecc5 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -164,13 +164,13 @@ type TPAction struct { Weight float64 // Action's weight } -type ApiTPActionTimings struct { +type TPActionTimings struct { TPid string // Tariff plan id ActionTimingsId string // ActionTimings id - ActionTimings []*ApiActionTiming // Set of ActionTiming bindings this profile will group + ActionTimings []*TPActionTiming // Set of ActionTiming bindings this profile will group } -type ApiActionTiming struct { +type TPActionTiming struct { ActionsId string // Actions id TimingId string // Timing profile id Weight float64 // Binding's weight