diff --git a/apier/tpdestinations.go b/apier/tpdestinations.go index fa8da25d2..58a02219f 100644 --- a/apier/tpdestinations.go +++ b/apier/tpdestinations.go @@ -21,56 +21,18 @@ package apier import ( "errors" "fmt" - "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/rater" "github.com/cgrates/cgrates/utils" ) -type AttrGetTPDestinationIds struct { - TPid string // Tariff plan id +type ApierTPDestination struct { + TPid string // Tariff plan id + DestinationId string // Destination id + Prefixes []string // Prefixes attached to this destination } -// Return destinations profile for a destination tag received as parameter -func (self *Apier) GetTPDestinationIds(attrs AttrGetTPDestinationIds, reply *[]string) error { - if missing := utils.MissingStructFields(&attrs, []string{"TPid"}); len(missing) != 0 { //Params missing - return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) - } - if ids, err := self.StorDb.GetTPDestinationIds(attrs.TPid); err != nil { - return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) - } else if ids == nil { - return errors.New(utils.ERR_NOT_FOUND) - } else { - *reply = ids - } - return nil -} - -type AttrGetTPDestination struct { - TPid string - DestinationId string -} - -// Return destinations profile for a destination tag received as parameter -func (self *Apier) GetTPDestination(attrs AttrGetTPDestination, reply *rater.Destination) error { - if missing := utils.MissingStructFields(&attrs, []string{"TPid", "DestinationId"}); len(missing) != 0 { //Params missing - return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) - } - if dst, err := self.StorDb.GetTPDestination(attrs.TPid, attrs.DestinationId); err != nil { - return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) - } else if dst == nil { - return errors.New(utils.ERR_NOT_FOUND) - } else { - *reply = *dst - } - return nil -} - -type AttrSetTPDestination struct { - TPid string - DestinationId string - Prefixes []string -} - -func (self *Apier) SetTPDestination(attrs AttrSetTPDestination, reply *string) error { +// Creates a new destination within a tariff plan +func (self *Apier) SetTPDestination(attrs ApierTPDestination, reply *string) error { if missing := utils.MissingStructFields(&attrs, []string{"TPid", "DestinationId", "Prefixes"}); len(missing) != 0 { //Params missing return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } @@ -85,3 +47,42 @@ func (self *Apier) SetTPDestination(attrs AttrSetTPDestination, reply *string) e *reply = "OK" return nil } + +type AttrGetTPDestination struct { + TPid string // Tariff plan id + DestinationId string // Destination id +} + +// Queries a specific destination +func (self *Apier) GetTPDestination(attrs AttrGetTPDestination, reply *ApierTPDestination) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid", "DestinationId"}); len(missing) != 0 { //Params missing + return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) + } + if dst, err := self.StorDb.GetTPDestination(attrs.TPid, attrs.DestinationId); err != nil { + return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) + } else if dst == nil { + return errors.New(utils.ERR_NOT_FOUND) + } else { + *reply = ApierTPDestination{attrs.TPid, dst.Id, dst.Prefixes} + } + return nil +} + +type AttrGetTPDestinationIds struct { + TPid string // Tariff plan id +} + +// Queries destination identities on specific tariff plan. +func (self *Apier) GetTPDestinationIds(attrs AttrGetTPDestinationIds, reply *[]string) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid"}); len(missing) != 0 { //Params missing + return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) + } + if ids, err := self.StorDb.GetTPDestinationIds(attrs.TPid); err != nil { + return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) + } else if ids == nil { + return errors.New(utils.ERR_NOT_FOUND) + } else { + *reply = ids + } + return nil +} diff --git a/apier/tptimings.go b/apier/tptimings.go new file mode 100644 index 000000000..84fb8a53b --- /dev/null +++ b/apier/tptimings.go @@ -0,0 +1,94 @@ +/* +Rating system designed to be used in VoIP Carriers World +Copyright (C) 2013 ITsysCOM + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package apier + +import ( + "errors" + "fmt" + "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/utils" +) + +type ApierTPTiming struct { + TPid string // Tariff plan id + TimingId string // Timing id + Years string // semicolon separated list of years this timing is valid on, *all supported + Months string // semicolon separated list of months this timing is valid on, *none and *all supported + MonthDays string // semicolon separated list of month's days this timing is valid on, *none and *all supported + WeekDays string // semicolon separated list of week day names this timing is valid on *none and *all supported + Time string // String representing the time this timing starts on +} + +// Creates a new timing within a tariff plan +func (self *Apier) SetTPTiming(attrs ApierTPTiming, reply *string) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid", "TimingId", "Years","Months","MonthDays", "WeekDays","Time"}); len(missing) != 0 { + return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) + } + if exists, err := self.StorDb.ExistsTPTiming(attrs.TPid, attrs.TimingId); err != nil { + return fmt.Errorf("%s:%v", utils.ERR_SERVER_ERROR, err.Error()) + } else if exists { + return errors.New(utils.ERR_DUPLICATE) + } + tm := rater.NewTiming( attrs.TimingId, attrs.Years, attrs.Months, attrs.MonthDays, attrs.WeekDays, attrs.Time ) + if err := self.StorDb.SetTPTiming(attrs.TPid, tm); err != nil { + return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) + } + *reply = "OK" + return nil +} + +type AttrGetTPTiming struct { + TPid string // Tariff plan id + TimingId string // Timing id +} + +// Queries specific Timing on Tariff plan +func (self *Apier) GetTPTiming(attrs AttrGetTPTiming, reply *ApierTPTiming) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid", "TimingId"}); len(missing) != 0 { //Params missing + return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) + } + if tm, err := self.StorDb.GetTPTiming(attrs.TPid, attrs.TimingId); err != nil { + return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) + } else if tm == nil { + return errors.New(utils.ERR_NOT_FOUND) + } else { + *reply = ApierTPTiming{attrs.TPid, tm.Id, tm.Years.Serialize(";"), + tm.Months.Serialize(";"), tm.MonthDays.Serialize(";"), tm.WeekDays.Serialize(";"), tm.StartTime} + } + return nil +} + +type AttrGetTPTimingIds struct { + TPid string // Tariff plan id +} + +// Queries timing identities on specific tariff plan. +func (self *Apier) GetTPTimingIds(attrs AttrGetTPTimingIds, reply *[]string) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid"}); len(missing) != 0 { //Params missing + return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) + } + if ids, err := self.StorDb.GetTPTimingIds(attrs.TPid); err != nil { + return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) + } else if ids == nil { + return errors.New(utils.ERR_NOT_FOUND) + } else { + *reply = ids + } + return nil +} diff --git a/data/storage/mysql/create_tariffplan_tables.sql b/data/storage/mysql/create_tariffplan_tables.sql index 158f1a610..b2abea748 100644 --- a/data/storage/mysql/create_tariffplan_tables.sql +++ b/data/storage/mysql/create_tariffplan_tables.sql @@ -11,7 +11,8 @@ CREATE TABLE `tp_timings` ( `week_days` varchar(255) NOT NULL, `time` varchar(16) NOT NULL, PRIMARY KEY (`id`), - KEY `tpid` (`tpid`) + KEY `tpid` (`tpid`), + UNIQUE KEY `tpid_tmid` (`tpid`,`tag`) ); -- @@ -24,8 +25,8 @@ CREATE TABLE `tp_destinations` ( `tag` varchar(24) NOT NULL, `prefix` varchar(24) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `tpid_dest_prefix` (`tpid`,`tag`,`prefix`), - KEY `tpid` (`tpid`) + KEY `tpid` (`tpid`), + UNIQUE KEY `tpid_dest_prefix` (`tpid`,`tag`,`prefix`) ); -- diff --git a/docs/api_tptimings.rst b/docs/api_tptimings.rst new file mode 100644 index 000000000..c1cb60754 --- /dev/null +++ b/docs/api_tptimings.rst @@ -0,0 +1,202 @@ +Apier.SetTPTiming ++++++++++++++++++ + +Creates a new timing within a tariff plan. + +**Request**: + + Data: + :: + + type ApierTPTiming struct { + TPid string // Tariff plan id + TimingId string // Timing id + Years string // semicolon separated list of years this timing is valid on, \*all supported + Months string // semicolon separated list of months this timing is valid on, \*none and \*all supported + MonthDays string // semicolon separated list of month's days this timing is valid on, \*none and \*all supported + WeekDays string // semicolon separated list of week day names this timing is valid on \*none and \*all supported + Time string // String representing the time this timing starts on + } + + Mandatory parameters: ``[]string{"TPid", "TimingId", "Years","Months","MonthDays", "WeekDays","Time"}`` + + *JSON sample*: + :: + + { + "id": 3, + "method": "Apier.SetTPTiming", + "params": [ + { + "MonthDays": "1;2;3;31", + "Months": "1;3;6", + "TPid": "SAMPLE_TP", + "Time": "13:00:00", + "TimingId": "SAMPLE_TIMING_5", + "WeekDays": "0", + "Years": "2013;2014" + } + ] + } + +**Reply**: + + Data: + :: + + string + + Possible answers: + ``OK`` - Success. + + *JSON sample*: + :: + + { + "error": null, + "id": 3, + "result": "OK" + } + +**Errors**: + + ``MANDATORY_IE_MISSING`` - Mandatory parameter missing from request. + + ``SERVER_ERROR`` - Server error occurred. + + ``DUPLICATE`` - The specified combination of TPid/DestinationId already exists in StorDb. + + +Apier.GetTPTiming ++++++++++++++++++ + +Queries specific Timing on tariff plan. + +**Request**: + + Data: + :: + + type AttrGetTPTiming struct { + TPid string // Tariff plan id + TimingId string // Timing id + } + + Mandatory parameters: ``[]string{"TPid", "TimingId"}`` + + *JSON sample*: + :: + + { + "id": 4, + "method": "Apier.GetTPTiming", + "params": [ + { + "TPid": "SAMPLE_TP", + "TimingId": "SAMPLE_TIMING_7" + } + ] + } + +**Reply**: + + Data: + :: + + type ApierTPTiming struct { + TPid string // Tariff plan id + TimingId string // Timing id + Years string // semicolon separated list of years this timing is valid on, \*all supported + Months string // semicolon separated list of months this timing is valid on, \*none and \*all supported + MonthDays string // semicolon separated list of month's days this timing is valid on, \*none and \*all supported + WeekDays string // semicolon separated list of week day names this timing is valid on \*none and \*all supported + Time string // String representing the time this timing starts on + } + + *JSON sample*: + :: + + { + "error": null, + "id": 4, + "result": { + "MonthDays": "1;2;3;31", + "Months": "1;3;6", + "TPid": "SAMPLE_TP", + "Time": "13:00:00", + "TimingId": "SAMPLE_TIMING_7", + "WeekDays": "*all", + "Years": "2013;2014" + } + } + +**Errors**: + + ``MANDATORY_IE_MISSING`` - Mandatory parameter missing from request. + + ``SERVER_ERROR`` - Server error occurred. + + ``NOT_FOUND`` - Requested destination id not found. + + +Apier.GetTPDestinationIds ++++++++++++++++++++++++++ + +Queries timing identities on tariff plan. + +**Request**: + + Data: + :: + + type AttrGetTPDestinationIds struct { + TPid string // Tariff plan id + } + + Required parameters: ``[]string{"TPid"}`` + + *JSON sample*: + :: + + { + "id": 5, + "method": "Apier.GetTPTimingIds", + "params": [ + { + "TPid": "SAMPLE_TP" + } + ] + } + +**Reply**: + + Data: + :: + + []string + + *JSON sample*: + :: + + { + "error": null, + "id": 5, + "result": [ + "SAMPLE_TIMING_1", + "SAMPLE_TIMING_2", + "SAMPLE_TIMING_3", + "SAMPLE_TIMING_4", + "SAMPLE_TIMING_5" + ] + } + + +**Errors**: + + ``MANDATORY_IE_MISSING`` - Mandatory parameter missing from request. + + ``SERVER_ERROR`` - Server error occurred. + + ``NOT_FOUND`` - Requested tariff plan not found. + + diff --git a/docs/apicalls.rst b/docs/apicalls.rst index 5d410861f..4c785550c 100644 --- a/docs/apicalls.rst +++ b/docs/apicalls.rst @@ -125,13 +125,6 @@ Destinations ~~~~~~~~~~~~ -:: - - type Destination struct { - Tag string - Prefixes []string - } - Apier.SetTPDestination ++++++++++++++++++++++ @@ -142,12 +135,14 @@ Creates a new destination within a tariff plan id. Data: :: - type AttrSetTPDestination struct { - TPid string // Tariff plan id - DestinationId string // Unique identity within the tariff plan id - Prefixes []string // Set of prefixes grouped by this destination + type ApierTPDestination struct { + TPid string // Tariff plan id + DestinationId string // Destination id + Prefixes []string // Prefixes attached to this destination } + Required parameters: ``[]string{"TPid", "DestinationId", "Prefixes"}`` + *JSON sample*: :: @@ -209,6 +204,8 @@ Queries a specific destination. DestinationId string // Destination id } + Required parameters: ``[]string{"TPid", "DestinationId"}`` + *JSON sample*: :: @@ -228,9 +225,10 @@ Queries a specific destination. Data: :: - type Destination struct { - Id string // Destination id - Prefixes []string // List of prefixes attached to destination + type ApierTPDestination struct { + TPid string // Tariff plan id + DestinationId string // Destination id + Prefixes []string // Prefixes attached to this destination } *JSON sample*: @@ -240,7 +238,8 @@ Queries a specific destination. "error": null, "id": 0, "result": { - "Id": "FIST_DST2", + "TPid":"FIST_TP", + "DestinationId": "FIST_DST2", "Prefixes": [ "123", "345" @@ -272,6 +271,8 @@ Queries destination identities on specific tariff plan. TPid string // Tariff plan id } + Required parameters: ``[]string{"TPid"}`` + *JSON sample*: :: @@ -321,36 +322,10 @@ Queries destination identities on specific tariff plan. Timings +++++++ -:: +.. toctree:: + :maxdepth: 2 - type Timing struct { - Tag - Years - Months - MonthDays - WeekDays - Time - } - -**SetTPTiming** - -Parametrs: - -TPid - A string containing traiff plan id - -Timing - A JSON string containing timing data. - -Example - - SetTPTiming("1dec2012", '{"Tag": "MIDNIGHT", Year: "\*all", Months: "\*all", MonthDays: "\*all", WeekDays: "\*all", "Time": "00:00:00"}') - -GetTPTiming - -DeleteTPTiming - -GetAllTPTimings + api_tptimings SetTPRate diff --git a/rater/dateseries.go b/rater/dateseries.go index 31d3f9538..04dcaa581 100644 --- a/rater/dateseries.go +++ b/rater/dateseries.go @@ -19,12 +19,12 @@ along with this program. If not, see package rater import ( - // "log" "sort" "strconv" "strings" "time" - // "log" + "fmt" + "reflect" ) // Defines years days series @@ -58,7 +58,7 @@ func (ys Years) Contains(year int) (result bool) { return } -// Parse MonthDay elements from string separated by sep. +// Parse Years elements from string separated by sep. func (ys *Years) Parse(input, sep string) { switch input { case "*all", "": @@ -73,6 +73,24 @@ func (ys *Years) Parse(input, sep string) { } } +func (ys Years) Serialize( sep string ) string { + if len(ys) == 0 { + return "*all" + } + var yStr string + for idx, yr := range ys { + if idx != 0 { + yStr = fmt.Sprintf("%s%s%d", yStr, sep, yr) + } else { + yStr = strconv.Itoa(yr) + } + } + return yStr +} + +var allMonths []time.Month = []time.Month{time.January, time.February, time.March, time.April, time.May, time.June, + time.July, time.August, time.September, time.October, time.November, time.December} + // Defines months series type Months []time.Month @@ -107,8 +125,9 @@ func (m Months) Contains(month time.Month) (result bool) { func (m *Months) Parse(input, sep string) { switch input { case "*all": - *m = []time.Month{time.January, time.February, time.March, time.April, time.May, time.June, - time.July, time.August, time.September, time.October, time.November, time.December} + *m = allMonths + case "*none": // Apier cannot receive empty string, hence using meta-tag + *m = []time.Month{} case "": *m = []time.Month{} default: @@ -121,6 +140,28 @@ func (m *Months) Parse(input, sep string) { } } +// Dumps the months in a serialized string, similar to the one parsed +func (m Months) Serialize( sep string ) string { + if len(m) == 0 { + return "*none" + } + if reflect.DeepEqual( m, Months(allMonths) ) { + return "*all" + } + var mStr string + for idx, mt := range m { + if idx != 0 { + mStr = fmt.Sprintf("%s%s%d", mStr, sep, mt) + } else { + mStr = strconv.Itoa(int(mt)) + } + } + return mStr +} + + +var allMonthDays []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31} + // Defines month days series type MonthDays []int @@ -156,7 +197,7 @@ func (md MonthDays) Contains(monthDay int) (result bool) { func (md *MonthDays) Parse(input, sep string) { switch input { case "*all": - *md = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31} + *md = allMonthDays case "": *md = []int{} default: @@ -169,6 +210,26 @@ func (md *MonthDays) Parse(input, sep string) { } } +// Dumps the month days in a serialized string, similar to the one parsed +func (md MonthDays) Serialize( sep string ) string { + if len(md) == 0 { + return "*none" + } + if reflect.DeepEqual(md, MonthDays(allMonthDays)) { + return "*all" + } + var mdsStr string + for idx, mDay := range md { + if idx != 0 { + mdsStr = fmt.Sprintf("%s%s%d", mdsStr, sep, mDay) + } else { + mdsStr = strconv.Itoa(mDay) + } + } + return mdsStr +} + +var allWeekDays []time.Weekday = []time.Weekday{time.Monday, time.Tuesday, time.Wednesday, time.Thursday, time.Friday, time.Saturday, time.Sunday} // Defines week days series type WeekDays []time.Weekday @@ -203,7 +264,7 @@ func (wd WeekDays) Contains(weekDay time.Weekday) (result bool) { func (wd *WeekDays) Parse(input, sep string) { switch input { case "*all": - *wd = []time.Weekday{time.Monday, time.Tuesday, time.Wednesday, time.Thursday, time.Friday, time.Saturday, time.Sunday} + *wd = allWeekDays case "": *wd = []time.Weekday{} default: @@ -215,3 +276,22 @@ func (wd *WeekDays) Parse(input, sep string) { } } } + +// Dumps the week days in a serialized string, similar to the one parsed +func (wd WeekDays) Serialize( sep string ) string { + if len(wd) == 0 { + return "*none" + } + if reflect.DeepEqual( wd, WeekDays(allWeekDays) ) { + return "*all" + } + var wdStr string + for idx, d := range wd { + if idx != 0 { + wdStr = fmt.Sprintf("%s%s%d", wdStr, sep, d) + } else { + wdStr = strconv.Itoa(int(d)) + } + } + return wdStr +} diff --git a/rater/dateseries_test.go b/rater/dateseries_test.go index 401a5604e..aab47860b 100644 --- a/rater/dateseries_test.go +++ b/rater/dateseries_test.go @@ -63,3 +63,106 @@ func TestWeekDayStoreRestoreJson(t *testing.T) { t.Errorf("Expected %v was %v", wd, o) } } + +func TestYearsSerialize(t *testing.T) { + ys := &Years{} + yString := ys.Serialize(";") + expectString := "*all" + if expectString != yString { + t.Errorf("Expected: %s, got: %s", expectString, yString) + } + ys2 := &Years{2012} + yString2 := ys2.Serialize(";") + expectString2 := "2012" + if expectString2 != yString2 { + t.Errorf("Expected: %s, got: %s", expectString2, yString2) + } + ys3 := &Years{2013,2014,2015} + yString3 := ys3.Serialize(";") + expectString3 := "2013;2014;2015" + if expectString3 != yString3 { + t.Errorf("Expected: %s, got: %s", expectString3, yString3) + } +} + +func TestMonthsSerialize(t *testing.T) { + mths := &Months{} + mString := mths.Serialize(";") + expectString := "*none" + if expectString != mString { + t.Errorf("Expected: %s, got: %s", expectString, mString) + } + mths1 := Months(allMonths) + mString1 := mths1.Serialize(";") + expectString1 := "*all" + if expectString1 != mString1 { + t.Errorf("Expected: %s, got: %s", expectString1, mString1) + } + mths2 := &Months{time.January} + mString2 := mths2.Serialize(";") + expectString2 := "1" + if expectString2 != mString2 { + t.Errorf("Expected: %s, got: %s", expectString2, mString2) + } + mths3 := &Months{time.January,time.December} + mString3 := mths3.Serialize(";") + expectString3 := "1;12" + if expectString3 != mString3 { + t.Errorf("Expected: %s, got: %s", expectString3, mString3) + } +} + +func TestMonthDaysSerialize(t *testing.T) { + mds := &MonthDays{} + mdsString := mds.Serialize(";") + expectString := "*none" + if expectString != mdsString { + t.Errorf("Expected: %s, got: %s", expectString, mdsString) + } + mds1 := MonthDays(allMonthDays) + mdsString1 := mds1.Serialize(";") + expectString1 := "*all" + if expectString1 != mdsString1 { + t.Errorf("Expected: %s, got: %s", expectString1, mdsString1) + } + mds2 := &MonthDays{1} + mdsString2 := mds2.Serialize(";") + expectString2 := "1" + if expectString2 != mdsString2 { + t.Errorf("Expected: %s, got: %s", expectString2, mdsString2) + } + mds3 := &MonthDays{1,2,3,4,5} + mdsString3 := mds3.Serialize(";") + expectString3 := "1;2;3;4;5" + if expectString3 != mdsString3 { + t.Errorf("Expected: %s, got: %s", expectString3, mdsString3) + } +} + +func TestWeekDaysSerialize(t *testing.T) { + wds := &WeekDays{} + wdsString := wds.Serialize(";") + expectString := "*none" + if expectString != wdsString { + t.Errorf("Expected: %s, got: %s", expectString, wdsString) + } + wds1 := WeekDays(allWeekDays) + wdsString1 := wds1.Serialize(";") + expectString1 := "*all" + if expectString1 != wdsString1 { + t.Errorf("Expected: %s, got: %s", expectString1, wdsString1) + } + wds2 := &WeekDays{time.Monday} + wdsString2 := wds2.Serialize(";") + expectString2 := "1" + if expectString2 != wdsString2 { + t.Errorf("Expected: %s, got: %s", expectString2, wdsString2) + } + wds3 := &WeekDays{time.Monday, time.Saturday,time.Sunday} + wdsString3 := wds3.Serialize(";") + expectString3 := "1;6;0" + if expectString3 != wdsString3 { + t.Errorf("Expected: %s, got: %s", expectString3, wdsString3) + } +} + diff --git a/rater/loader_csv.go b/rater/loader_csv.go index df9c0dd95..a1f3fd70d 100644 --- a/rater/loader_csv.go +++ b/rater/loader_csv.go @@ -213,7 +213,7 @@ func (csvr *CSVReader) LoadTimings() (err error) { continue } - csvr.timings[tag] = NewTiming(record[1:]...) + csvr.timings[tag] = NewTiming(record...) } return } diff --git a/rater/loader_helpers.go b/rater/loader_helpers.go index 75070125d..e5b6c044c 100644 --- a/rater/loader_helpers.go +++ b/rater/loader_helpers.go @@ -86,6 +86,7 @@ type DestinationRate struct { } type Timing struct { + Id string Years Years Months Months MonthDays MonthDays @@ -93,13 +94,14 @@ type Timing struct { StartTime string } -func NewTiming(timeingInfo ...string) (rt *Timing) { +func NewTiming(timingInfo ...string) (rt *Timing) { rt = &Timing{} - rt.Years.Parse(timeingInfo[0], ";") - rt.Months.Parse(timeingInfo[1], ";") - rt.MonthDays.Parse(timeingInfo[2], ";") - rt.WeekDays.Parse(timeingInfo[3], ";") - rt.StartTime = timeingInfo[4] + rt.Id = timingInfo[0] + rt.Years.Parse(timingInfo[1], ";") + rt.Months.Parse(timingInfo[2], ";") + rt.MonthDays.Parse(timingInfo[3], ";") + rt.WeekDays.Parse(timingInfo[4], ";") + rt.StartTime = timingInfo[5] return } diff --git a/rater/storage_interface.go b/rater/storage_interface.go index 3418c3892..53a3a9f4d 100644 --- a/rater/storage_interface.go +++ b/rater/storage_interface.go @@ -57,10 +57,16 @@ type DataStorage interface { SetRatingProfile(*RatingProfile) error GetDestination(string) (*Destination, error) SetDestination(*Destination) error - GetTPDestinationIds(string) ([]string, error) + // Apier functions + SetTPTiming(string, *Timing) error + ExistsTPTiming(string, string) (bool, error) + GetTPTiming(string, string) (*Timing, error) + GetTPTimingIds(string) ([]string, error) + SetTPDestination(string, *Destination) error ExistsTPDestination(string, string) (bool, error) GetTPDestination(string, string) (*Destination, error) - SetTPDestination(string, *Destination) error + GetTPDestinationIds(string) ([]string, error) + // End Apier functions GetActions(string) (Actions, error) SetActions(string, Actions) error GetUserBalance(string) (*UserBalance, error) diff --git a/rater/storage_map.go b/rater/storage_map.go index 89615d01e..3faa3454b 100644 --- a/rater/storage_map.go +++ b/rater/storage_map.go @@ -73,10 +73,26 @@ func (ms *MapStorage) SetDestination(dest *Destination) (err error) { return } -func (ms *MapStorage) GetTPDestinationIds(tpid string) ([]string, error) { +func (ms *MapStorage) SetTPTiming(tpid string, tm *Timing) error { + return errors.New(utils.ERR_NOT_IMPLEMENTED) +} + +func (ms *MapStorage) ExistsTPTiming(tpid, tmId string) (bool, error) { + return false, errors.New(utils.ERR_NOT_IMPLEMENTED) +} + +func (ms *MapStorage) GetTPTiming(tpid, tmId string) (*Timing, error) { + return nil, nil +} + +func (ms *MapStorage) GetTPTimingIds(tpid string) ([]string, error) { return nil, errors.New(utils.ERR_NOT_IMPLEMENTED) } +func (ms *MapStorage) SetTPDestination(tpid string, dest *Destination) error { + return errors.New(utils.ERR_NOT_IMPLEMENTED) +} + func (ms *MapStorage) ExistsTPDestination(tpid, destTag string) (bool, error) { return false, errors.New(utils.ERR_NOT_IMPLEMENTED) } @@ -86,8 +102,8 @@ func (ms *MapStorage) GetTPDestination(tpid, destTag string) (*Destination, erro return nil, nil } -func (ms *MapStorage) SetTPDestination(tpid string, dest *Destination) error { - return errors.New(utils.ERR_NOT_IMPLEMENTED) +func (ms *MapStorage) GetTPDestinationIds(tpid string) ([]string, error) { + return nil, errors.New(utils.ERR_NOT_IMPLEMENTED) } func (ms *MapStorage) GetActions(key string) (as Actions, err error) { diff --git a/rater/storage_mongo.go b/rater/storage_mongo.go index 5eb593077..8f0837a97 100644 --- a/rater/storage_mongo.go +++ b/rater/storage_mongo.go @@ -147,6 +147,22 @@ func (ms *MongoStorage) SetDestination(dest *Destination) error { return ms.db.C("destinations").Insert(dest) } +func (ms *MongoStorage) SetTPTiming(tpid string, tm *Timing) error { + return errors.New(utils.ERR_NOT_IMPLEMENTED) +} + +func (ms *MongoStorage) ExistsTPTiming(tpid, tmId string) (bool, error) { + return false, errors.New(utils.ERR_NOT_IMPLEMENTED) +} + +func (ms *MongoStorage) GetTPTiming(tpid, tmId string) (*Timing, error) { + return nil, nil +} + +func (ms *MongoStorage) GetTPTimingIds(tpid string) ([]string, error) { + return nil, errors.New(utils.ERR_NOT_IMPLEMENTED) +} + func (ms *MongoStorage) GetTPDestinationIds(tpid string) ([]string, error) { return nil, errors.New(utils.ERR_NOT_IMPLEMENTED) } diff --git a/rater/storage_redis.go b/rater/storage_redis.go index 2ae000bd1..cb431bce4 100644 --- a/rater/storage_redis.go +++ b/rater/storage_redis.go @@ -102,6 +102,22 @@ func (rs *RedisStorage) SetDestination(dest *Destination) (err error) { return } +func (rs *RedisStorage) SetTPTiming(tpid string, tm *Timing) error { + return errors.New(utils.ERR_NOT_IMPLEMENTED) +} + +func (rs *RedisStorage) ExistsTPTiming(tpid, tmId string) (bool, error) { + return false, errors.New(utils.ERR_NOT_IMPLEMENTED) +} + +func (rs *RedisStorage) GetTPTiming(tpid, tmId string) (*Timing, error) { + return nil, nil +} + +func (rs *RedisStorage) GetTPTimingIds(tpid string) ([]string, error) { + return nil, errors.New(utils.ERR_NOT_IMPLEMENTED) +} + func (rs *RedisStorage) GetTPDestinationIds(tpid string) ([]string, error) { return nil, errors.New(utils.ERR_NOT_IMPLEMENTED) } diff --git a/rater/storage_sql.go b/rater/storage_sql.go index ceb823e29..42411d547 100644 --- a/rater/storage_sql.go +++ b/rater/storage_sql.go @@ -29,34 +29,64 @@ type SQLStorage struct { Db *sql.DB } -func (sql *SQLStorage) Close() {} +func (self *SQLStorage) Close() {} -func (sql *SQLStorage) Flush() (err error) { +func (self *SQLStorage) Flush() (err error) { return } -func (sql *SQLStorage) GetRatingProfile(string) (rp *RatingProfile, err error) { - /*row := sql.Db.QueryRow(fmt.Sprintf("SELECT * FROM ratingprofiles WHERE id='%s'", id)) +func (self *SQLStorage) GetRatingProfile(string) (rp *RatingProfile, err error) { + /*row := self.Db.QueryRow(fmt.Sprintf("SELECT * FROM ratingprofiles WHERE id='%s'", id)) err = row.Scan(&rp, &cc.Direction, &cc.Tenant, &cc.TOR, &cc.Subject, &cc.Destination, &cc.Cost, &cc.ConnectFee, ×pansJson) err = json.Unmarshal([]byte(timespansJson), cc.Timespans)*/ return } -func (sql *SQLStorage) SetRatingProfile(rp *RatingProfile) (err error) { +func (self *SQLStorage) SetRatingProfile(rp *RatingProfile) (err error) { return } -func (sql *SQLStorage) GetDestination(string) (d *Destination, err error) { +func (self *SQLStorage) GetDestination(string) (d *Destination, err error) { return } -func (sql *SQLStorage) SetDestination(d *Destination) (err error) { +func (self *SQLStorage) SetDestination(d *Destination) (err error) { return } -// Extracts destinations from StorDB on specific tariffplan id -func (sql *SQLStorage) GetTPDestinationIds(tpid string) ([]string, error) { - rows, err := sql.Db.Query(fmt.Sprintf("SELECT DISTINCT tag FROM %s where tpid='%s'", utils.TBL_TP_DESTINATIONS, tpid)) +func (self *SQLStorage) SetTPTiming(tpid string, tm *Timing) error { + if _, err := self.Db.Exec(fmt.Sprintf("INSERT INTO %s (tpid, tag, years, months, month_days, week_days, time) VALUES('%s','%s','%s','%s','%s','%s','%s')", + utils.TBL_TP_TIMINGS, tpid, tm.Id, tm.Years.Serialize(";"), tm.Months.Serialize(";"), tm.MonthDays.Serialize(";"), + tm.WeekDays.Serialize(";"), tm.StartTime )); err != nil { + return err + } + return nil +} + +func (self *SQLStorage) ExistsTPTiming(tpid, tmId string) (bool, error) { + var exists bool + err := self.Db.QueryRow(fmt.Sprintf("SELECT EXISTS (SELECT 1 FROM %s WHERE tpid='%s' AND tag='%s')", utils.TBL_TP_TIMINGS, tpid, tmId)).Scan(&exists) + if err != nil { + return false, err + } + return exists, nil +} + +func (self *SQLStorage) GetTPTiming(tpid, tmId string) (*Timing, error) { + var years, months, monthDays, weekDays, time string + err := self.Db.QueryRow(fmt.Sprintf("SELECT years, months, month_days, week_days, time FROM %s WHERE tpid='%s' AND tag='%s' LIMIT 1", + utils.TBL_TP_TIMINGS, tpid, tmId)).Scan(&years,&months,&monthDays,&weekDays,&time) + switch { + case err == sql.ErrNoRows: + return nil,nil + case err!=nil: + return nil, err + } + return NewTiming( tmId, years, months, monthDays, weekDays, time ), nil +} + +func (self *SQLStorage) GetTPTimingIds(tpid string) ([]string, error) { + rows, err := self.Db.Query(fmt.Sprintf("SELECT DISTINCT tag FROM %s where tpid='%s'", utils.TBL_TP_TIMINGS, tpid)) if err != nil { return nil, err } @@ -64,7 +94,7 @@ func (sql *SQLStorage) GetTPDestinationIds(tpid string) ([]string, error) { ids := []string{} i := 0 for rows.Next() { - i++ //Keep here a reference so we know we got at least one prefix + i++ //Keep here a reference so we know we got at least one var id string err = rows.Scan(&id) if err != nil { @@ -78,9 +108,33 @@ func (sql *SQLStorage) GetTPDestinationIds(tpid string) ([]string, error) { return ids, nil } -func (sql *SQLStorage) ExistsTPDestination(tpid, destTag string) (bool, error) { +// Extracts destinations from StorDB on specific tariffplan id +func (self *SQLStorage) GetTPDestinationIds(tpid string) ([]string, error) { + rows, err := self.Db.Query(fmt.Sprintf("SELECT DISTINCT tag FROM %s where tpid='%s'", utils.TBL_TP_DESTINATIONS, tpid)) + if err != nil { + return nil, err + } + defer rows.Close() + ids := []string{} + i := 0 + for rows.Next() { + i++ //Keep here a reference so we know we got at least one + var id string + err = rows.Scan(&id) + if err != nil { + return nil, err + } + ids = append(ids, id) + } + if i == 0 { + return nil, nil + } + return ids, nil +} + +func (self *SQLStorage) ExistsTPDestination(tpid, destTag string) (bool, error) { var exists bool - err := sql.Db.QueryRow(fmt.Sprintf("SELECT EXISTS (SELECT 1 FROM %s WHERE tpid='%s' AND tag='%s')", utils.TBL_TP_DESTINATIONS, tpid, destTag)).Scan(&exists) + err := self.Db.QueryRow(fmt.Sprintf("SELECT EXISTS (SELECT 1 FROM %s WHERE tpid='%s' AND tag='%s')", utils.TBL_TP_DESTINATIONS, tpid, destTag)).Scan(&exists) if err != nil { return false, err } @@ -88,8 +142,8 @@ func (sql *SQLStorage) ExistsTPDestination(tpid, destTag string) (bool, error) { } // Extracts destinations from StorDB on specific tariffplan id -func (sql *SQLStorage) GetTPDestination(tpid, destTag string) (*Destination, error) { - rows, err := sql.Db.Query(fmt.Sprintf("SELECT prefix FROM %s WHERE tpid='%s' AND tag='%s'", utils.TBL_TP_DESTINATIONS, tpid, destTag)) +func (self *SQLStorage) GetTPDestination(tpid, destTag string) (*Destination, error) { + rows, err := self.Db.Query(fmt.Sprintf("SELECT prefix FROM %s WHERE tpid='%s' AND tag='%s'", utils.TBL_TP_DESTINATIONS, tpid, destTag)) if err != nil { return nil, err } @@ -111,35 +165,35 @@ func (sql *SQLStorage) GetTPDestination(tpid, destTag string) (*Destination, err return d, nil } -func (sql *SQLStorage) SetTPDestination(tpid string, dest *Destination) error { +func (self *SQLStorage) SetTPDestination(tpid string, dest *Destination) error { for _, prefix := range dest.Prefixes { - if _, err := sql.Db.Exec(fmt.Sprintf("INSERT INTO %s (tpid, tag, prefix) VALUES( '%s','%s','%s')", utils.TBL_TP_DESTINATIONS, tpid, dest.Id, prefix)); err != nil { + if _, err := self.Db.Exec(fmt.Sprintf("INSERT INTO %s (tpid, tag, prefix) VALUES( '%s','%s','%s')", utils.TBL_TP_DESTINATIONS, tpid, dest.Id, prefix)); err != nil { return err } } return nil } -func (sql *SQLStorage) GetActions(string) (as Actions, err error) { +func (self *SQLStorage) GetActions(string) (as Actions, err error) { return } -func (sql *SQLStorage) SetActions(key string, as Actions) (err error) { return } +func (self *SQLStorage) SetActions(key string, as Actions) (err error) { return } -func (sql *SQLStorage) GetUserBalance(string) (ub *UserBalance, err error) { return } +func (self *SQLStorage) GetUserBalance(string) (ub *UserBalance, err error) { return } -func (sql *SQLStorage) SetUserBalance(ub *UserBalance) (err error) { return } +func (self *SQLStorage) SetUserBalance(ub *UserBalance) (err error) { return } -func (sql *SQLStorage) GetActionTimings(key string) (ats ActionTimings, err error) { return } +func (self *SQLStorage) GetActionTimings(key string) (ats ActionTimings, err error) { return } -func (sql *SQLStorage) SetActionTimings(key string, ats ActionTimings) (err error) { return } +func (self *SQLStorage) SetActionTimings(key string, ats ActionTimings) (err error) { return } -func (sql *SQLStorage) GetAllActionTimings() (ats map[string]ActionTimings, err error) { +func (self *SQLStorage) GetAllActionTimings() (ats map[string]ActionTimings, err error) { return } -func (sql *SQLStorage) LogCallCost(uuid, source string, cc *CallCost) (err error) { - if sql.Db == nil { +func (self *SQLStorage) LogCallCost(uuid, source string, cc *CallCost) (err error) { + if self.Db == nil { //timespans.Logger.Warning("Cannot write log to database.") return } @@ -147,7 +201,7 @@ func (sql *SQLStorage) LogCallCost(uuid, source string, cc *CallCost) (err error if err != nil { Logger.Err(fmt.Sprintf("Error marshalling timespans to json: %v", err)) } - _, err = sql.Db.Exec(fmt.Sprintf("INSERT INTO callcosts VALUES ('NULL','%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', %v, %v, '%s')", + _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO callcosts VALUES ('NULL','%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', %v, %v, '%s')", uuid, source, cc.Direction, @@ -165,8 +219,8 @@ func (sql *SQLStorage) LogCallCost(uuid, source string, cc *CallCost) (err error return } -func (sql *SQLStorage) GetCallCostLog(uuid, source string) (cc *CallCost, err error) { - row := sql.Db.QueryRow(fmt.Sprintf("SELECT * FROM callcosts WHERE uuid='%s' AND source='%s'", uuid, source)) +func (self *SQLStorage) GetCallCostLog(uuid, source string) (cc *CallCost, err error) { + row := self.Db.QueryRow(fmt.Sprintf("SELECT * FROM callcosts WHERE uuid='%s' AND source='%s'", uuid, source)) var uuid_found string var timespansJson string err = row.Scan(&uuid_found, &cc.Direction, &cc.Tenant, &cc.TOR, &cc.Subject, &cc.Destination, &cc.Cost, &cc.ConnectFee, ×pansJson) @@ -174,20 +228,20 @@ func (sql *SQLStorage) GetCallCostLog(uuid, source string) (cc *CallCost, err er return } -func (sql *SQLStorage) LogActionTrigger(ubId, source string, at *ActionTrigger, as Actions) (err error) { +func (self *SQLStorage) LogActionTrigger(ubId, source string, at *ActionTrigger, as Actions) (err error) { return } -func (sql *SQLStorage) LogActionTiming(source string, at *ActionTiming, as Actions) (err error) { +func (self *SQLStorage) LogActionTiming(source string, at *ActionTiming, as Actions) (err error) { return } -func (sql *SQLStorage) LogError(uuid, source, errstr string) (err error) { return } +func (self *SQLStorage) LogError(uuid, source, errstr string) (err error) { return } -func (sql *SQLStorage) SetCdr(cdr utils.CDR) (err error) { +func (self *SQLStorage) SetCdr(cdr utils.CDR) (err error) { startTime, err := cdr.GetAnswerTime() if err != nil { return err } - _, err = sql.Db.Exec(fmt.Sprintf("INSERT INTO cdrs_primary VALUES (NULL, '%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)", + _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO cdrs_primary VALUES (NULL, '%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)", cdr.GetCgrId(), cdr.GetAccId(), cdr.GetCdrHost(), @@ -208,7 +262,7 @@ func (sql *SQLStorage) SetCdr(cdr utils.CDR) (err error) { if err != nil { Logger.Err(fmt.Sprintf("Error marshalling cdr extra fields to json: %v", err)) } - _, err = sql.Db.Exec(fmt.Sprintf("INSERT INTO cdrs_extra VALUES ('NULL','%s', '%s')", + _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO cdrs_extra VALUES ('NULL','%s', '%s')", cdr.GetCgrId(), extraFields, )) @@ -219,8 +273,8 @@ func (sql *SQLStorage) SetCdr(cdr utils.CDR) (err error) { return } -func (sql *SQLStorage) SetRatedCdr(cdr utils.CDR, cc *CallCost) (err error) { - _, err = sql.Db.Exec(fmt.Sprintf("INSERT INTO rated_cdrs VALUES ('%s', '%s', '%s', '%s')", +func (self *SQLStorage) SetRatedCdr(cdr utils.CDR, cc *CallCost) (err error) { + _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO rated_cdrs VALUES ('%s', '%s', '%s', '%s')", cdr.GetCgrId(), cc.Cost, "cgrcostid", @@ -233,17 +287,17 @@ func (sql *SQLStorage) SetRatedCdr(cdr utils.CDR, cc *CallCost) (err error) { return } -func (sql *SQLStorage) GetAllRatedCdr() ([]utils.CDR, error) { +func (self *SQLStorage) GetAllRatedCdr() ([]utils.CDR, error) { return nil, nil } -func (sql *SQLStorage) GetTpDestinations(tpid, tag string) ([]*Destination, error) { +func (self *SQLStorage) GetTpDestinations(tpid, tag string) ([]*Destination, error) { var dests []*Destination q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_DESTINATIONS, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -269,13 +323,13 @@ func (sql *SQLStorage) GetTpDestinations(tpid, tag string) ([]*Destination, erro return dests, rows.Err() } -func (sql *SQLStorage) GetTpRates(tpid, tag string) (map[string]*Rate, error) { +func (self *SQLStorage) GetTpRates(tpid, tag string) (map[string]*Rate, error) { rts := make(map[string]*Rate) q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_RATES, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -300,13 +354,13 @@ func (sql *SQLStorage) GetTpRates(tpid, tag string) (map[string]*Rate, error) { return rts, rows.Err() } -func (sql *SQLStorage) GetTpDestinationRates(tpid, tag string) (map[string][]*DestinationRate, error) { +func (self *SQLStorage) GetTpDestinationRates(tpid, tag string) (map[string][]*DestinationRate, error) { rts := make(map[string][]*DestinationRate) q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_DESTINATION_RATES, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -328,13 +382,13 @@ func (sql *SQLStorage) GetTpDestinationRates(tpid, tag string) (map[string][]*De return rts, rows.Err() } -func (sql *SQLStorage) GetTpTimings(tpid, tag string) (map[string]*Timing, error) { +func (self *SQLStorage) GetTpTimings(tpid, tag string) (map[string]*Timing, error) { tms := make(map[string]*Timing) q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_TIMINGS, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -344,18 +398,18 @@ func (sql *SQLStorage) GetTpTimings(tpid, tag string) (map[string]*Timing, error if err := rows.Scan(&id, &tpid, &tag, &years, &months, &month_days, &week_days, &start_time); err != nil { return nil, err } - tms[tag] = NewTiming(years, months, month_days, week_days, start_time) + tms[tag] = NewTiming(tag, years, months, month_days, week_days, start_time) } return tms, rows.Err() } -func (sql *SQLStorage) GetTpDestinationRateTimings(tpid, tag string) ([]*DestinationRateTiming, error) { +func (self *SQLStorage) GetTpDestinationRateTimings(tpid, tag string) ([]*DestinationRateTiming, error) { var rts []*DestinationRateTiming q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_DESTINATION_RATE_TIMINGS, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -377,13 +431,13 @@ func (sql *SQLStorage) GetTpDestinationRateTimings(tpid, tag string) ([]*Destina return rts, rows.Err() } -func (sql *SQLStorage) GetTpRatingProfiles(tpid, tag string) (map[string]*RatingProfile, error) { +func (self *SQLStorage) GetTpRatingProfiles(tpid, tag string) (map[string]*RatingProfile, error) { rpfs := make(map[string]*RatingProfile) q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_RATE_PROFILES, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -408,13 +462,13 @@ func (sql *SQLStorage) GetTpRatingProfiles(tpid, tag string) (map[string]*Rating } return rpfs, rows.Err() } -func (sql *SQLStorage) GetTpActions(tpid, tag string) (map[string][]*Action, error) { +func (self *SQLStorage) GetTpActions(tpid, tag string) (map[string][]*Action, error) { as := make(map[string][]*Action) q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_ACTIONS, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -461,13 +515,13 @@ func (sql *SQLStorage) GetTpActions(tpid, tag string) (map[string][]*Action, err return as, rows.Err() } -func (sql *SQLStorage) GetTpActionTimings(tpid, tag string) (ats map[string][]*ActionTiming, err error) { +func (self *SQLStorage) GetTpActionTimings(tpid, tag string) (ats map[string][]*ActionTiming, err error) { ats = make(map[string][]*ActionTiming) q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_ACTION_TIMINGS, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -490,13 +544,13 @@ func (sql *SQLStorage) GetTpActionTimings(tpid, tag string) (ats map[string][]*A return ats, rows.Err() } -func (sql *SQLStorage) GetTpActionTriggers(tpid, tag string) (map[string][]*ActionTrigger, error) { +func (self *SQLStorage) GetTpActionTriggers(tpid, tag string) (map[string][]*ActionTrigger, error) { ats := make(map[string][]*ActionTrigger) q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_ACTION_TRIGGERS, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err } @@ -522,13 +576,13 @@ func (sql *SQLStorage) GetTpActionTriggers(tpid, tag string) (map[string][]*Acti return ats, rows.Err() } -func (sql *SQLStorage) GetTpAccountActions(tpid, tag string) ([]*AccountAction, error) { +func (self *SQLStorage) GetTpAccountActions(tpid, tag string) ([]*AccountAction, error) { var acs []*AccountAction q := fmt.Sprintf("SELECT * FROM %s WHERE tpid=%s", utils.TBL_TP_ACCOUNT_ACTIONS, tpid) if tag != "" { q += "AND tag=" + tag } - rows, err := sql.Db.Query(q, tpid) + rows, err := self.Db.Query(q, tpid) if err != nil { return nil, err }