diff --git a/cdrs/fscdr.go b/cdrs/fscdr.go index 697f8ec29..85b8001e1 100644 --- a/cdrs/fscdr.go +++ b/cdrs/fscdr.go @@ -45,6 +45,7 @@ const ( PARK_TIME = "start_epoch" START_TIME = "answer_epoch" END_TIME = "end_epoch" + DURATION = "billsec" USERNAME = "user_name" FS_IP = "sip_local_network_addr" RATE = "rate" @@ -133,6 +134,12 @@ func (fsCdr FSCdr) GetEndTime() (t time.Time, err error) { t = time.Unix(0, st*1000) return } +// Extracts duration as considered by the telecom switch +func (fsCdr FSCdr) GetDuration() int64 { + dur, _ := strconv.ParseInt(fsCdr[DURATION], 0, 64) + return dur +} + func (fsCdr FSCdr) GetRate() (float64, error) { rate, ok := fsCdr[RATE] diff --git a/cmd/cgr-rater/cgr-rater.go b/cmd/cgr-rater/cgr-rater.go index bb3620d6e..601d4dbec 100644 --- a/cmd/cgr-rater/cgr-rater.go +++ b/cmd/cgr-rater/cgr-rater.go @@ -45,6 +45,7 @@ const ( JSON = "json" GOB = "gob" POSTGRES = "postgres" + MYSQL = "mysql" MONGO = "mongo" REDIS = "redis" SAME = "same" @@ -241,6 +242,8 @@ func configureDatabase(db_type, host, port, name, user, pass string) (getter rat getter, err = rater.NewMongoStorage(host, port, name, user, pass) case POSTGRES: getter, err = rater.NewPostgresStorage(host, port, name, user, pass) + case MYSQL: + getter, err = rater.NewMySQLStorage(host, port, name, user, pass) default: err = errors.New("unknown db") return nil, err diff --git a/mediator/mediator.go b/mediator/mediator.go index 935c29498..9654881e9 100644 --- a/mediator/mediator.go +++ b/mediator/mediator.go @@ -245,6 +245,7 @@ func (m *Mediator) MediateCdrFromDB(cdr rater.CDR, db rater.DataStorage) error { TimeStart: startTime, TimeEnd: endTime} if err := m.connector.GetCost(cd, cc); err != nil { + fmt.Println("Got error in the mediator getCost", err.Error()) return err } return db.SetRatedCdr(cdr, cc) diff --git a/rater/cdr.go b/rater/cdr.go index a355bf803..07c20c6c4 100644 --- a/rater/cdr.go +++ b/rater/cdr.go @@ -39,6 +39,7 @@ type CDR interface { GetReqType() string GetStartTime() (time.Time, error) GetEndTime() (time.Time, error) + GetDuration() int64 GetFallbackSubj() string GetExtraParameters() string GetRate() (float64, error) diff --git a/rater/storage_mysql.go b/rater/storage_mysql.go index c198522a9..0cb6d571c 100644 --- a/rater/storage_mysql.go +++ b/rater/storage_mysql.go @@ -30,7 +30,7 @@ type MySQLStorage struct { } func NewMySQLStorage(host, port, name, user, password string) (DataStorage, error) { - db, err := sql.Open("mysql", "cgrates:testus@tcp(192.168.0.17:3306)/cgrates?charset=utf8") + db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", user, password, host, port, name)) if err != nil { return nil, err } @@ -87,7 +87,7 @@ func (mys *MySQLStorage) LogCallCost(uuid, source string, cc *CallCost) (err err if err != nil { Logger.Err(fmt.Sprintf("Error marshalling timespans to json: %v", err)) } - _, err = mys.Db.Exec(fmt.Sprintf("INSERT INTO call_costs VALUES ('%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', %v, %v, '%s')", + _, err = mys.Db.Exec(fmt.Sprintf("INSERT INTO callcosts VALUES ('NULL','%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', %v, %v, '%s')", uuid, source, cc.Direction, @@ -106,7 +106,7 @@ func (mys *MySQLStorage) LogCallCost(uuid, source string, cc *CallCost) (err err } func (mys *MySQLStorage) GetCallCostLog(uuid, source string) (cc *CallCost, err error) { - row := mys.Db.QueryRow(fmt.Sprintf("SELECT * FROM call_costs WHERE uuid='%s' AND source='%s'", uuid, source)) + row := mys.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) @@ -127,11 +127,7 @@ func (mys *MySQLStorage) SetCdr(cdr CDR) (err error) { if err != nil { return err } - endTime, err := cdr.GetEndTime() - if err != nil { - return err - } - _, err = mys.Db.Exec(fmt.Sprintf("INSERT INTO cdrs_primary VALUES ('%s', '%s','%s', '%s', '%s', '%s', '%s', '%s', %v, %v, '%s')", + _, err = mys.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(), @@ -143,12 +139,12 @@ func (mys *MySQLStorage) SetCdr(cdr CDR) (err error) { cdr.GetSubject(), cdr.GetDestination(), startTime, - endTime, //duration + cdr.GetDuration(), //duration )) if err != nil { Logger.Err(fmt.Sprintf("failed to execute cdr insert statement: %v", err)) } - _, err = mys.Db.Exec(fmt.Sprintf("INSERT INTO cdrs_extra VALUES ('%s', '%s')", + _, err = mys.Db.Exec(fmt.Sprintf("INSERT INTO cdrs_extra VALUES ('NULL','%s', '%s')", cdr.GetCgrId(), cdr.GetExtraParameters(), )) @@ -162,9 +158,10 @@ func (mys *MySQLStorage) SetCdr(cdr CDR) (err error) { func (mys *MySQLStorage) SetRatedCdr(cdr CDR, callcost *CallCost) (err error) { rate, err := cdr.GetRate() if err != nil { + fmt.Println("Could not find rate in cdr") return err } - _, err = mys.Db.Exec(fmt.Sprintf("INSERT INTO cdrs_extra VALUES ('%s', '%s', '%s', '%s')", + _, err = mys.Db.Exec(fmt.Sprintf("INSERT INTO rated_cdrs VALUES ('%s', '%s', '%s', '%s')", cdr.GetCgrId(), rate, "cgrcostid",