From d112b53dda535b700c2b34f0088e080b21b13cab Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Tue, 30 Jul 2013 21:47:17 +0300 Subject: [PATCH] working on duration expire time --- .../mysql/create_tariffplan_tables.sql | 2 +- engine/action.go | 17 +++---- engine/loader_csv.go | 46 ++++++++++--------- engine/minute_buckets.go | 15 +++--- engine/storage_sql.go | 44 ++++++++---------- utils/apitpdata.go | 2 +- utils/coreutils.go | 24 ++++++++++ 7 files changed, 85 insertions(+), 65 deletions(-) diff --git a/data/storage/mysql/create_tariffplan_tables.sql b/data/storage/mysql/create_tariffplan_tables.sql index ae8fd575a..63a5569bb 100644 --- a/data/storage/mysql/create_tariffplan_tables.sql +++ b/data/storage/mysql/create_tariffplan_tables.sql @@ -117,7 +117,7 @@ CREATE TABLE `tp_actions` ( `balance_tag` varchar(24) NOT NULL, `direction` varchar(8) NOT NULL, `units` DECIMAL(5,2) NOT NULL, - `expiration_time` int(11) NOT NULL, + `expiration_time` varchar(24) NOT NULL, `destination_tag` varchar(24) NOT NULL, `rate_type` varchar(8) NOT NULL, `rate` DECIMAL(5,4) NOT NULL, diff --git a/engine/action.go b/engine/action.go index 7dd7c3f80..71bfdf291 100644 --- a/engine/action.go +++ b/engine/action.go @@ -28,14 +28,15 @@ import ( Structure to be filled for each tariff plan with the bonus value for received calls minutes. */ type Action struct { - Id string - ActionType string - BalanceId string - Direction string - ExpirationDate time.Time - Units float64 - Weight float64 - MinuteBucket *MinuteBucket + Id string + ActionType string + BalanceId string + Direction string + ExpirationString string + ExpirationDate time.Time + Units float64 + Weight float64 + MinuteBucket *MinuteBucket } const ( diff --git a/engine/loader_csv.go b/engine/loader_csv.go index 0ef392239..698b968d1 100644 --- a/engine/loader_csv.go +++ b/engine/loader_csv.go @@ -379,19 +379,17 @@ func (csvr *CSVReader) LoadActions() (err error) { if err != nil { return errors.New(fmt.Sprintf("Could not parse action units: %v", err)) } - unix, err := strconv.ParseInt(record[5], 10, 64) - if err != nil { - return errors.New(fmt.Sprintf("Could not parse expiration date: %v", err)) - } - expDate := time.Unix(unix, 0) var a *Action if record[2] != MINUTES { a = &Action{ - ActionType: record[1], - BalanceId: record[2], - Direction: record[3], - Units: units, - ExpirationDate: expDate, + ActionType: record[1], + BalanceId: record[2], + Direction: record[3], + Units: units, + ExpirationString: record[5], + } + if _, err := utils.ParseDate(a.ExpirationString); err != nil { + return errors.New(fmt.Sprintf("Could not parse expiration time: %v", err)) } } else { value, err := strconv.ParseFloat(record[8], 64) @@ -407,21 +405,25 @@ func (csvr *CSVReader) LoadActions() (err error) { return errors.New(fmt.Sprintf("Could not parse action weight: %v", err)) } a = &Action{ - Id: utils.GenUUID(), - ActionType: record[1], - BalanceId: record[2], - Direction: record[3], - Weight: weight, - ExpirationDate: expDate, + Id: utils.GenUUID(), + ActionType: record[1], + BalanceId: record[2], + Direction: record[3], + Weight: weight, + ExpirationString: record[5], MinuteBucket: &MinuteBucket{ - Seconds: units, - Weight: minutesWeight, - Price: value, - PriceType: record[7], - DestinationId: record[6], - ExpirationDate: expDate, + Seconds: units, + Weight: minutesWeight, + Price: value, + PriceType: record[7], + DestinationId: record[6], + ExpirationString: record[5], }, } + if _, err := utils.ParseDate(a.ExpirationString); err != nil { + return errors.New(fmt.Sprintf("Could not parse expiration time: %v", err)) + } + } csvr.actions[tag] = append(csvr.actions[tag], a) } diff --git a/engine/minute_buckets.go b/engine/minute_buckets.go index fd3104b72..65893e219 100644 --- a/engine/minute_buckets.go +++ b/engine/minute_buckets.go @@ -25,13 +25,14 @@ import ( ) type MinuteBucket struct { - Seconds float64 - Weight float64 - Price float64 // percentage from standard price or absolute value depending on Type - PriceType string - DestinationId string - ExpirationDate time.Time - precision int + Seconds float64 + Weight float64 + Price float64 // percentage from standard price or absolute value depending on Type + PriceType string + DestinationId string + ExpirationString string + ExpirationDate time.Time + precision int } const ( diff --git a/engine/storage_sql.go b/engine/storage_sql.go index 3242b7c35..ef050350f 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -23,8 +23,6 @@ import ( "encoding/json" "fmt" "github.com/cgrates/cgrates/utils" - "strconv" - "time" ) type SQLStorage struct { @@ -552,8 +550,7 @@ func (self *SQLStorage) GetTPActions(tpid, actsId string) (*utils.TPActions, err i := 0 for rows.Next() { i++ //Keep here a reference so we know we got at least one result - var action, balanceId, dir, destId, rateType string - var expTime int64 + var action, balanceId, dir, destId, rateType, expTime string var units, rate, minutesWeight, weight float64 if err = rows.Scan(&action, &balanceId, &dir, &units, &expTime, &destId, &rateType, &rate, &minutesWeight, &weight); err != nil { return nil, err @@ -1081,36 +1078,31 @@ func (self *SQLStorage) GetTpActions(tpid, tag string) (map[string][]*Action, er if err := rows.Scan(&id, &tpid, &tag, &action, &balance_tag, &direction, &units, &expirationDate, &destinations_tag, &rate_type, &rate, &minutes_weight, &weight); err != nil { return nil, err } - unix, err := strconv.ParseInt(expirationDate, 10, 64) - if err != nil { - return nil, err - } - expDate := time.Unix(unix, 0) var a *Action if balance_tag != MINUTES { a = &Action{ - ActionType: action, - BalanceId: balance_tag, - Direction: direction, - Units: units, - ExpirationDate: expDate, + ActionType: action, + BalanceId: balance_tag, + Direction: direction, + Units: units, + ExpirationString: expirationDate, } } else { var price float64 a = &Action{ - Id: utils.GenUUID(), - ActionType: action, - BalanceId: balance_tag, - Direction: direction, - Weight: weight, - ExpirationDate: expDate, + Id: utils.GenUUID(), + ActionType: action, + BalanceId: balance_tag, + Direction: direction, + Weight: weight, + ExpirationString: expirationDate, MinuteBucket: &MinuteBucket{ - Seconds: units, - Weight: minutes_weight, - Price: price, - PriceType: rate_type, - DestinationId: destinations_tag, - ExpirationDate: expDate, + Seconds: units, + Weight: minutes_weight, + Price: price, + PriceType: rate_type, + DestinationId: destinations_tag, + ExpirationString: expirationDate, }, } } diff --git a/utils/apitpdata.go b/utils/apitpdata.go index c389db1cf..e43ba8548 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -94,7 +94,7 @@ type Action struct { BalanceId string // Type of balance the action will operate on Direction string // Balance direction Units float64 // Number of units to add/deduct - ExpirationTime int64 // Time when the units will expire + ExpirationTime string // Time when the units will expire DestinationId string // Destination profile id RateType string // Type of price Rate float64 // Price value diff --git a/utils/coreutils.go b/utils/coreutils.go index defc797c0..9dc9c2c55 100644 --- a/utils/coreutils.go +++ b/utils/coreutils.go @@ -94,3 +94,27 @@ func Round(x float64, prec int, method string) float64 { return rounder / pow } + +func ParseDate(date string) (expDate time.Time, err error) { + if date == "" { + return // zero values are fine + } + expirationTime := []byte(date) + switch { + case string(expirationTime) == "*unlimited": + // leave it at zero + case string(expirationTime[0]) == "+": + d, err := time.ParseDuration(string(expirationTime[1:])) + if err != nil { + return expDate, err + } + expDate = time.Now().Add(d) + default: + unix, err := strconv.ParseInt(string(expirationTime), 10, 64) + if err != nil { + return expDate, err + } + expDate = time.Unix(unix, 0) + } + return expDate, err +}