Skip to content
36 changes: 36 additions & 0 deletions api/source/source.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
)

var dbQ *sql.DB
var dbMig *sql.DB
var dbP *sql.DB
var dbF *sql.DB

Expand All @@ -44,6 +45,15 @@ func CDRInstance() *sql.DB {
return dbQ
}

// CDRMigrationInstance returns a DB pool without read/write timeouts,
// suitable for long-running DDL operations (ALTER TABLE ADD INDEX, bulk UPDATEs).
func CDRMigrationInstance() *sql.DB {
if dbMig == nil {
dbMig = CDRMigrationInit()
}
return dbMig
}

func PhonebookInstance() *sql.DB {
if dbP == nil {
dbP = PhonebookInit()
Expand Down Expand Up @@ -84,6 +94,32 @@ func CDRInit() *sql.DB {
return db
}

func CDRMigrationInit() *sql.DB {
// define uri connection string
uri := configuration.Config.CDRDatabase.User + ":" + configuration.Config.CDRDatabase.Password + "@tcp(" + configuration.Config.CDRDatabase.Host + ":" + configuration.Config.CDRDatabase.Port + ")/" + configuration.Config.CDRDatabase.Name

// No read/write timeout for long-running migration operations (DDL, bulk updates)
db, err := sql.Open("mysql", uri+"?charset=utf8&parseTime=True&multiStatements=true&timeout=300s")

// handle error
if err != nil {
utils.LogError(errors.Wrap(err, "error connecting to migration database"))
}

// test the connection
if err := db.Ping(); err != nil {
utils.LogError(errors.Wrap(err, "error pinging migration database"))
}

// limited pool for migration operations
db.SetMaxOpenConns(2)
db.SetMaxIdleConns(1)
db.SetConnMaxLifetime(30 * time.Minute)

// return db object
return db
}

func PhonebookInit() *sql.DB {
// define uri connection string
uri := configuration.Config.PhonebookDatabase.User + ":" + configuration.Config.PhonebookDatabase.Password + "@tcp(" + configuration.Config.PhonebookDatabase.Host + ":" + configuration.Config.PhonebookDatabase.Port + ")/" + configuration.Config.PhonebookDatabase.Name
Expand Down
8 changes: 4 additions & 4 deletions api/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -354,14 +354,14 @@ func ExtractDispositions(d []string) string {
// declare numbers array
var dispositions []string

// loop dispositions: dispositions REGEXP <d1> OR dispositions = <d2> OR ...
// loop dispositions: dispositions LIKE <d1> OR dispositions LIKE <d2> OR ...
for _, disposition := range d {
if disposition == "ANSWERED" {
dispositions = append(dispositions, "dispositions REGEXP 'ANSWERED'")
dispositions = append(dispositions, "dispositions LIKE '%ANSWERED%'")
} else if disposition == "FAILED" {
dispositions = append(dispositions, "dispositions NOT REGEXP 'ANSWERED' AND (dispositions REGEXP 'FAILED$' OR dispositions REGEXP 'CONGESTION$')")
dispositions = append(dispositions, "dispositions NOT LIKE '%ANSWERED%' AND (dispositions LIKE '%FAILED' OR dispositions LIKE '%CONGESTION')")
} else {
dispositions = append(dispositions, "dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP '"+disposition+"$'")
dispositions = append(dispositions, "dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%"+disposition+"'")
}
}
return strings.Join(dispositions[:], " OR ")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
SELECT type,
call_type,
Count(*) AS "total£num",
Sum(IF(dispositions REGEXP 'ANSWERED', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'NO ANSWER$', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'BUSY$', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND ( dispositions REGEXP 'FAILED$'
OR dispositions REGEXP 'CONGESTION$' ), 1, 0)) AS "failed£num",
Sum(IF(dispositions LIKE '%ANSWERED%', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%NO ANSWER', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%BUSY', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND ( dispositions LIKE '%FAILED'
OR dispositions LIKE '%CONGESTION' ), 1, 0)) AS "failed£num",
Sum(duration) AS "totalDuration£seconds",
Avg(duration) AS "avgDuration£seconds",
Sum(COALESCE(cost,0)) AS "totalCost£currency",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SELECT
{{ MaskSrcSQL .Privacy .UserExtensions }} AS src£phoneNumber,
{{ MaskDstSQL .Privacy .UserExtensions }} AS dst£phoneNumber,
type AS call_type£label,
IF(dispositions REGEXP 'ANSWERED', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
IF(dispositions LIKE '%ANSWERED%', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
duration AS totalDuration£seconds,
billsec AS billsec£seconds,
did
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
SELECT type,
call_type,
Count(*) AS "total£num",
Sum(IF(dispositions REGEXP 'ANSWERED', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'NO ANSWER$', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'BUSY$', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND ( dispositions REGEXP 'FAILED$'
OR dispositions REGEXP 'CONGESTION$' ), 1, 0)) AS "failed£num",
Sum(IF(dispositions LIKE '%ANSWERED%', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%NO ANSWER', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%BUSY', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND ( dispositions LIKE '%FAILED'
OR dispositions LIKE '%CONGESTION' ), 1, 0)) AS "failed£num",
Sum(duration) AS "totalDuration£seconds",
Avg(duration) AS "avgDuration£seconds",
Sum(COALESCE(cost,0)) AS "totalCost£currency",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SELECT
{{ MaskSrcLocalSQL .Privacy .UserExtensions }} AS src£phoneNumber,
{{ MaskDstLocalSQL .Privacy .UserExtensions }} AS dst£phoneNumber,
type AS call_type£label,
IF(dispositions REGEXP 'ANSWERED', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
IF(dispositions LIKE '%ANSWERED%', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
duration AS totalDuration£seconds,
billsec AS billsec£seconds
FROM `<CDR_TABLE>`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
SELECT type,
call_type,
Count(*) AS "total£num",
Sum(IF(dispositions REGEXP 'ANSWERED', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'NO ANSWER$', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'BUSY$', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND ( dispositions REGEXP 'FAILED$'
OR dispositions REGEXP 'CONGESTION$' ), 1, 0)) AS "failed£num",
Sum(IF(dispositions LIKE '%ANSWERED%', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%NO ANSWER', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%BUSY', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND ( dispositions LIKE '%FAILED'
OR dispositions LIKE '%CONGESTION' ), 1, 0)) AS "failed£num",
Sum(duration) AS "totalDuration£seconds",
Avg(duration) AS "avgDuration£seconds",
Sum(COALESCE(cost,0)) AS "totalCost£currency",
Expand Down Expand Up @@ -45,11 +45,11 @@ UNION ALL
SELECT type,
'Total' AS call_type,
Count(*) AS "total£num",
Sum(IF(dispositions REGEXP 'ANSWERED', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'NO ANSWER$', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'BUSY$', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND ( dispositions REGEXP 'FAILED$'
OR dispositions REGEXP 'CONGESTION$' ), 1, 0)) AS "failed£num",
Sum(IF(dispositions LIKE '%ANSWERED%', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%NO ANSWER', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%BUSY', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND ( dispositions LIKE '%FAILED'
OR dispositions LIKE '%CONGESTION' ), 1, 0)) AS "failed£num",
Sum(duration) AS "totalDuration£seconds",
Avg(duration) AS "avgDuration£seconds",
Sum(COALESCE(cost,0)) AS "totalCost£currency",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SELECT
{{ MaskSrcSQL .Privacy .UserExtensions }} AS src£phoneNumber,
{{ MaskDstSQL .Privacy .UserExtensions }} AS dst£phoneNumber,
type AS call_type£label,
IF(dispositions REGEXP 'ANSWERED', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
IF(dispositions LIKE '%ANSWERED%', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
duration AS totalDuration£seconds,
billsec AS billsec£seconds,
cost AS cost£currency
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
SELECT type,
call_type,
Count(*) AS "total£num",
Sum(IF(dispositions REGEXP 'ANSWERED', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'NO ANSWER$', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'BUSY$', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND ( dispositions REGEXP 'FAILED$'
OR dispositions REGEXP 'CONGESTION$' ), 1, 0)) AS "failed£num",
Sum(IF(dispositions LIKE '%ANSWERED%', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%NO ANSWER', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%BUSY', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND ( dispositions LIKE '%FAILED'
OR dispositions LIKE '%CONGESTION' ), 1, 0)) AS "failed£num",
Sum(duration) AS "totalDuration£seconds",
Avg(duration) AS "avgDuration£seconds",
Sum(COALESCE(cost,0)) AS "totalCost£currency",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SELECT
IF(cnum IS NULL OR cnum = "", src, cnum) AS src£phoneNumber,
dst AS dst£phoneNumber,
type AS call_type£label,
IF(dispositions REGEXP 'ANSWERED', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
IF(dispositions LIKE '%ANSWERED%', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
duration AS totalDuration£seconds,
billsec AS billsec£seconds,
did
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
SELECT type,
call_type,
Count(*) AS "total£num",
Sum(IF(dispositions REGEXP 'ANSWERED', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'NO ANSWER$', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'BUSY$', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND ( dispositions REGEXP 'FAILED$'
OR dispositions REGEXP 'CONGESTION$' ), 1, 0)) AS "failed£num",
Sum(IF(dispositions LIKE '%ANSWERED%', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%NO ANSWER', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%BUSY', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND ( dispositions LIKE '%FAILED'
OR dispositions LIKE '%CONGESTION' ), 1, 0)) AS "failed£num",
Sum(duration) AS "totalDuration£seconds",
Avg(duration) AS "avgDuration£seconds",
Sum(COALESCE(cost,0)) AS "totalCost£currency",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SELECT
IF(cnum IS NULL OR cnum = "", src, cnum) AS src£phoneNumber,
dst AS dst£phoneNumber,
type AS call_type£label,
IF(dispositions REGEXP 'ANSWERED', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
IF(dispositions LIKE '%ANSWERED%', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
duration AS totalDuration£seconds,
billsec AS billsec£seconds
FROM `<CDR_TABLE>`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
SELECT type,
call_type,
Count(*) AS "total£num",
Sum(IF(dispositions REGEXP 'ANSWERED', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'NO ANSWER$', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'BUSY$', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND ( dispositions REGEXP 'FAILED$'
OR dispositions REGEXP 'CONGESTION$' ), 1, 0)) AS "failed£num",
Sum(IF(dispositions LIKE '%ANSWERED%', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%NO ANSWER', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%BUSY', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND ( dispositions LIKE '%FAILED'
OR dispositions LIKE '%CONGESTION' ), 1, 0)) AS "failed£num",
Sum(duration) AS "totalDuration£seconds",
Avg(duration) AS "avgDuration£seconds",
Sum(COALESCE(cost,0)) AS "totalCost£currency",
Expand Down Expand Up @@ -45,11 +45,11 @@ UNION ALL
SELECT type,
'Total' AS call_type,
Count(*) AS "total£num",
Sum(IF(dispositions REGEXP 'ANSWERED', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'NO ANSWER$', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND dispositions REGEXP 'BUSY$', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT REGEXP 'ANSWERED' AND ( dispositions REGEXP 'FAILED$'
OR dispositions REGEXP 'CONGESTION$' ), 1, 0)) AS "failed£num",
Sum(IF(dispositions LIKE '%ANSWERED%', 1, 0)) AS "answered£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%NO ANSWER', 1, 0)) AS "noAnswer£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND dispositions LIKE '%BUSY', 1, 0)) AS "busy£num",
Sum(IF(dispositions NOT LIKE '%ANSWERED%' AND ( dispositions LIKE '%FAILED'
OR dispositions LIKE '%CONGESTION' ), 1, 0)) AS "failed£num",
Sum(duration) AS "totalDuration£seconds",
Avg(duration) AS "avgDuration£seconds",
Sum(COALESCE(cost,0)) AS "totalCost£currency",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SELECT
IF(cnum IS NULL OR cnum = "", src, cnum) AS src£phoneNumber,
dst AS dst£phoneNumber,
type AS call_type£label,
IF(dispositions REGEXP 'ANSWERED', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
IF(dispositions LIKE '%ANSWERED%', 'ANSWERED', SUBSTRING_INDEX(dispositions, ',',- 1)) AS result£label, -- get last disposition
duration AS totalDuration£seconds,
billsec AS billsec£seconds,
cost AS cost£currency
Expand Down
7 changes: 4 additions & 3 deletions root/opt/nethvoice-report/api/templates/cdr_month.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ CREATE TABLE IF NOT EXISTS `cdr_{{ YearMap .Year }}-{{ MonthMap .Month }}`
(UNIQUE KEY uniq (calldate,uniqueid,dstchannel,duration))
SELECT *
FROM `cdr_{{ YearMap .Year }}`
WHERE date_format(calldate, "%Y-%m") = "{{ .Year }}-{{ MonthMap .Month }}";
WHERE calldate >= '{{ YearMap .Year }}-{{ MonthMap .Month }}-01'
AND calldate < '{{ YearMap .Year }}-{{ MonthMap .Month }}-01' + INTERVAL 1 MONTH;

INSERT IGNORE INTO `cdr_{{ YearMap .Year }}-{{ MonthMap .Month }}`
SELECT *
FROM `cdr_{{ YearMap .Year }}`
WHERE date_format(calldate, "%Y-%m") = "{{ .Year }}-{{ MonthMap .Month }}"
AND date_format(calldate, "%Y-%m-%d") = date_format(NOW() - INTERVAL 1 DAY, "%Y-%m-%d");
WHERE calldate >= DATE(NOW() - INTERVAL 1 DAY)
AND calldate < DATE(NOW());
Loading
Loading