diff --git a/apier/v1/tpaccountprofiles_it_test.go b/apier/v1/tpaccountprofiles_it_test.go index b20f37db1..d8c7a3de7 100644 --- a/apier/v1/tpaccountprofiles_it_test.go +++ b/apier/v1/tpaccountprofiles_it_test.go @@ -121,12 +121,13 @@ func testTPAcctPrfGetTPAcctPrfBeforeSet(t *testing.T) { func testTPAcctPrfSetTPAcctPrf(t *testing.T) { tpAcctPrf = &utils.TPAccountProfile{ - TPid: "TP1", - Tenant: "cgrates.org", - ID: "1001", - Weight: 20, + TPid: "TP1", + Tenant: "cgrates.org", + ID: "1001", + Weight: 20, + FilterIDs: make([]string, 0), Balances: map[string]*utils.TPAccountBalance{ - "MonetaryBalance": &utils.TPAccountBalance{ + "MonetaryBalance": { ID: "MonetaryBalance", FilterIDs: []string{}, Weight: 10, @@ -200,7 +201,7 @@ func testTPAcctPrfGetTPAcctBalAfterUpdate(t *testing.T) { ID: "1001", Weight: 20, Balances: map[string]*utils.TPAccountBalance{ - "MonetaryBalance2": &utils.TPAccountBalance{ + "MonetaryBalance2": { ID: "MonetaryBalance2", FilterIDs: []string{}, Weight: 12, diff --git a/apier/v1/tpactionprofiles_it_test.go b/apier/v1/tpactionprofiles_it_test.go index 52ffe6ace..f633869ae 100644 --- a/apier/v1/tpactionprofiles_it_test.go +++ b/apier/v1/tpactionprofiles_it_test.go @@ -122,11 +122,12 @@ func testTPActPrfGetTPActPrfBeforeSet(t *testing.T) { func testTPActPrfSetTPActPrf(t *testing.T) { tpActPrf = &utils.TPActionProfile{ - TPid: "TP1", - Tenant: "cgrates.org", - ID: "ONE_TIME_ACT", - Weight: 10, - Schedule: utils.MetaASAP, + TPid: "TP1", + Tenant: "cgrates.org", + ID: "ONE_TIME_ACT", + Weight: 10, + Schedule: utils.MetaASAP, + FilterIDs: make([]string, 0), Targets: []*utils.TPActionTarget{ &utils.TPActionTarget{ TargetType: utils.MetaAccounts, diff --git a/apier/v1/tpdispatchers_it_test.go b/apier/v1/tpdispatchers_it_test.go index 1723abb0d..4bf25f09c 100644 --- a/apier/v1/tpdispatchers_it_test.go +++ b/apier/v1/tpdispatchers_it_test.go @@ -122,10 +122,11 @@ func ttestTPDispatcherGetTPDispatcherBeforeSet(t *testing.T) { func testTPDispatcherSetTPDispatcher(t *testing.T) { tpDispatcher = &utils.TPDispatcherProfile{ - TPid: "TP1", - Tenant: "cgrates.org", - ID: "Dsp1", - FilterIDs: []string{"*string:Account:1002"}, + TPid: "TP1", + Tenant: "cgrates.org", + ID: "Dsp1", + FilterIDs: []string{"*string:Account:1002"}, + Subsystems: make([]string, 0), ActivationInterval: &utils.TPActivationInterval{ ActivationTime: "2014-07-29T15:00:00Z", ExpiryTime: "", diff --git a/apier/v1/tprateprofiles_it_test.go b/apier/v1/tprateprofiles_it_test.go index 52192b1da..b3b2c80ff 100644 --- a/apier/v1/tprateprofiles_it_test.go +++ b/apier/v1/tprateprofiles_it_test.go @@ -127,6 +127,7 @@ func testTPRatePrfSetTPRatePrf(t *testing.T) { Weight: 10, RoundingDecimals: 4, RoundingMethod: "*up", + FilterIDs: make([]string, 0), Rates: map[string]*utils.TPRate{ "RT_ALWAYS": { ID: "RT_ALWAYS", diff --git a/ees/sql.go b/ees/sql.go index 30d7b5b51..91fa447a8 100644 --- a/ees/sql.go +++ b/ees/sql.go @@ -19,12 +19,15 @@ along with this program. If not, see package ees import ( + "database/sql" "fmt" "net/url" "strings" "sync" - "github.com/jinzhu/gorm" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/gorm" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" @@ -57,23 +60,26 @@ func NewSQLEe(cgrCfg *config.CGRConfig, cfgIdx int, filterS *engine.FilterS, sqlEe.tableName = utils.IfaceAsString(iface) } - var connString string + var dialect gorm.Dialector switch u.Scheme { case utils.MySQL: - connString = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&loc=Local&parseTime=true&sql_mode='ALLOW_INVALID_DATES'", - u.User.Username(), password, u.Hostname(), u.Port(), dbname) + dialect = mysql.Open(fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&loc=Local&parseTime=true&sql_mode='ALLOW_INVALID_DATES'", + u.User.Username(), password, u.Hostname(), u.Port(), dbname)) case utils.Postgres: - connString = fmt.Sprintf("host=%s port=%s dbname=%s user=%s password=%s sslmode=%s", u.Hostname(), u.Port(), dbname, u.User.Username(), password, ssl) + dialect = postgres.Open(fmt.Sprintf("host=%s port=%s dbname=%s user=%s password=%s sslmode=%s", u.Hostname(), u.Port(), dbname, u.User.Username(), password, ssl)) default: - return nil, fmt.Errorf("unknown db_type %s", u.Scheme) + return nil, fmt.Errorf("db type <%s> not supported", u.Scheme) } - - db, err := gorm.Open(u.Scheme, connString) - if err != nil { - return nil, err + var db *gorm.DB + if db, err = gorm.Open(dialect, &gorm.Config{AllowGlobalUpdate: true}); err != nil { + return } - if err = db.DB().Ping(); err != nil { - return nil, err + var sqlDB *sql.DB + if sqlDB, err = db.DB(); err != nil { + return + } + if err = sqlDB.Ping(); err != nil { + return } if iface, has := cgrCfg.EEsCfg().Exporters[cfgIdx].Opts[utils.SQLMaxIdleConns]; has { @@ -81,24 +87,25 @@ func NewSQLEe(cgrCfg *config.CGRConfig, cfgIdx int, filterS *engine.FilterS, if err != nil { return nil, err } - db.DB().SetMaxIdleConns(int(val)) + sqlDB.SetMaxIdleConns(int(val)) } if iface, has := cgrCfg.EEsCfg().Exporters[cfgIdx].Opts[utils.SQLMaxOpenConns]; has { val, err := utils.IfaceAsTInt64(iface) if err != nil { return nil, err } - db.DB().SetMaxOpenConns(int(val)) + sqlDB.SetMaxOpenConns(int(val)) } if iface, has := cgrCfg.EEsCfg().Exporters[cfgIdx].Opts[utils.SQLMaxConnLifetime]; has { val, err := utils.IfaceAsDuration(iface) if err != nil { return nil, err } - db.DB().SetConnMaxLifetime(val) + sqlDB.SetConnMaxLifetime(val) } sqlEe.db = db + sqlEe.sqldb = sqlDB return } @@ -109,6 +116,7 @@ type SQLEe struct { cfgIdx int // index of config instance within ERsCfg.Readers filterS *engine.FilterS db *gorm.DB + sqldb *sql.DB tableName string @@ -123,6 +131,7 @@ func (sqlEe *SQLEe) ID() string { // OnEvicted implements EventExporter, doing the cleanup before exit func (sqlEe *SQLEe) OnEvicted(_ string, _ interface{}) { + sqlEe.sqldb.Close() return } diff --git a/ees/sql_it_test.go b/ees/sql_it_test.go index 031917981..6ad665360 100644 --- a/ees/sql_it_test.go +++ b/ees/sql_it_test.go @@ -29,7 +29,9 @@ import ( "github.com/cgrates/cgrates/utils" - "github.com/jinzhu/gorm" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" @@ -78,33 +80,33 @@ func (_ *testModelSql) TableName() string { return "expTable" } -type nopLogger struct{} - -func (nopLogger) Print(values ...interface{}) {} - func testSqlEeCreateTable(t *testing.T) { var err error - if db2, err = gorm.Open("mysql", fmt.Sprintf(dbConnString, "cgrates")); err != nil { + if db2, err = gorm.Open(mysql.Open(fmt.Sprintf(dbConnString, "cgrates")), &gorm.Config{ + AllowGlobalUpdate: true, + Logger: logger.Default.LogMode(logger.Silent), + }); err != nil { + return + } + if err = db2.Exec(`CREATE DATABASE IF NOT EXISTS exportedDatabase;`).Error; err != nil { t.Fatal(err) } - db2.SetLogger(new(nopLogger)) - if _, err = db2.DB().Exec(`CREATE DATABASE IF NOT EXISTS exportedDatabase;`); err != nil { - t.Fatal(err) - } - if db2, err = gorm.Open("mysql", fmt.Sprintf(dbConnString, "exportedDatabase")); err != nil { - t.Fatal(err) + + if db2, err = gorm.Open(mysql.Open(fmt.Sprintf(dbConnString, "exportedDatabase")), &gorm.Config{ + AllowGlobalUpdate: true, + Logger: logger.Default.LogMode(logger.Silent), + }); err != nil { + return } tx := db2.Begin() - if tx.HasTable("expTable") { - tx = tx.DropTable(new(testModelSql)) - if err = tx.Error; err != nil { + if tx.Migrator().HasTable("expTable") { + if err = tx.Migrator().DropTable(new(testModelSql)); err != nil { tx.Rollback() t.Fatal(err) } } - tx = tx.CreateTable(new(testModelSql)) - if err = tx.Error; err != nil { + if err = tx.Migrator().CreateTable(new(testModelSql)); err != nil { tx.Rollback() t.Fatal(err) } diff --git a/ers/sql.go b/ers/sql.go index a950a223b..8fb7fc321 100644 --- a/ers/sql.go +++ b/ers/sql.go @@ -37,6 +37,12 @@ import ( "gorm.io/gorm" ) +const ( + createdAt = "created_at" + updatedAt = "updated_at" + deletedAt = "deleted_at" +) + // NewSQLEventReader return a new sql event reader func NewSQLEventReader(cfg *config.CGRConfig, cfgIdx int, rdrEvents chan *erEvent, rdrErr chan error, @@ -109,7 +115,7 @@ func (rdr *SQLEventReader) Serve() (err error) { if sqlDB, err = db.DB(); err != nil { return } - // sqlDB.SetMaxOpenConns(10) + sqlDB.SetMaxOpenConns(10) if err = sqlDB.Ping(); err != nil { return } @@ -124,11 +130,7 @@ func (rdr *SQLEventReader) readLoop(db *gorm.DB, sqlDB io.Closer) { defer sqlDB.Close() tm := time.NewTimer(0) for { - if db = db.Table(rdr.tableName).Select("*"); db.Error != nil { - rdr.rdrErr <- db.Error - return - } - rows, err := db.Rows() + rows, err := db.Table(rdr.tableName).Select(utils.Meta).Rows() if err != nil { rdr.rdrErr <- err return @@ -136,6 +138,7 @@ func (rdr *SQLEventReader) readLoop(db *gorm.DB, sqlDB io.Closer) { colNames, err := rows.Columns() if err != nil { rdr.rdrErr <- err + rows.Close() return } for rows.Next() { @@ -144,11 +147,13 @@ func (rdr *SQLEventReader) readLoop(db *gorm.DB, sqlDB io.Closer) { utils.Logger.Info( fmt.Sprintf("<%s> stop monitoring sql DB <%s>", utils.ERs, rdr.Config().SourcePath)) + rows.Close() return default: } if err := rows.Err(); err != nil { rdr.rdrErr <- err + rows.Close() return } if rdr.Config().ConcurrentReqs != -1 { @@ -161,14 +166,39 @@ func (rdr *SQLEventReader) readLoop(db *gorm.DB, sqlDB io.Closer) { } if err = rows.Scan(columnPointers...); err != nil { rdr.rdrErr <- err + rows.Close() return } - go func(columns []interface{}, colNames []string) { - msg := make(map[string]interface{}) - for i, colName := range colNames { - msg[colName] = columns[i] + msg := make(map[string]interface{}) + fltr := make(map[string]string) + for i, colName := range colNames { + msg[colName] = columns[i] + if colName != createdAt && colName != updatedAt && colName != deletedAt { // ignore the sql colums for filter only + switch tm := columns[i].(type) { // also ignore the values that are zero for time + case time.Time: + if tm.IsZero() { + continue + } + case *time.Time: + if tm == nil || tm.IsZero() { + continue + } + case nil: + continue + } + fltr[colName] = utils.IfaceAsString(columns[i]) } - db = db.Delete(msg) // to ensure we don't read it again + } + if err = db.Table(rdr.tableName).Delete(nil, fltr).Error; err != nil { // to ensure we don't read it again + utils.Logger.Warning( + fmt.Sprintf("<%s> deleting message %s error: %s", + utils.ERs, utils.ToJSON(msg), err.Error())) + rdr.rdrErr <- err + rows.Close() + return + } + + go func(msg map[string]interface{}) { if err := rdr.processMessage(msg); err != nil { utils.Logger.Warning( fmt.Sprintf("<%s> processing message %s error: %s", @@ -184,8 +214,9 @@ func (rdr *SQLEventReader) readLoop(db *gorm.DB, sqlDB io.Closer) { if rdr.Config().ConcurrentReqs != -1 { rdr.cap <- struct{}{} } - }(columns, colNames) + }(msg) } + rows.Close() if rdr.Config().RunDelay < 0 { return } diff --git a/ers/sql_it_test.go b/ers/sql_it_test.go index dd1b04d87..53f543d7f 100644 --- a/ers/sql_it_test.go +++ b/ers/sql_it_test.go @@ -29,14 +29,11 @@ import ( "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" - _ "github.com/go-sql-driver/mysql" + "gorm.io/driver/mysql" "gorm.io/gorm" + "gorm.io/gorm/logger" ) -type nopLogger struct{} - -func (nopLogger) Print(values ...interface{}) {} - var ( sqlCfgPath string sqlCfg *config.CGRConfig @@ -146,34 +143,37 @@ func (_ *testModelSql) TableName() string { func testSQLInitDBs(t *testing.T) { var err error var db2 *gorm.DB - if db2, err = gorm.Open("mysql", fmt.Sprintf(dbConnString, "cgrates")); err != nil { + if db2, err = gorm.Open(mysql.Open(fmt.Sprintf(dbConnString, "cgrates")), + &gorm.Config{ + AllowGlobalUpdate: true, + Logger: logger.Default.LogMode(logger.Silent), + }); err != nil { t.Fatal(err) } - db2.SetLogger(new(nopLogger)) - if _, err = db2.DB().Exec(`CREATE DATABASE IF NOT EXISTS cgrates2;`); err != nil { + if err = db2.Exec(`CREATE DATABASE IF NOT EXISTS cgrates2;`).Error; err != nil { t.Fatal(err) } } func testSQLInitDB(t *testing.T) { cdr.CGRID = utils.UUIDSha1Prefix() var err error - db, err = gorm.Open("mysql", fmt.Sprintf(dbConnString, "cgrates2")) - if err != nil { + if db, err = gorm.Open(mysql.Open(fmt.Sprintf(dbConnString, "cgrates2")), + &gorm.Config{ + AllowGlobalUpdate: true, + Logger: logger.Default.LogMode(logger.Silent), + }); err != nil { t.Fatal(err) } - db.SetLogger(new(nopLogger)) tx := db.Begin() - if !tx.HasTable("cdrs") { - tx = tx.CreateTable(new(engine.CDRsql)) - if err = tx.Error; err != nil { + if !tx.Migrator().HasTable("cdrs") { + if err = tx.Migrator().CreateTable(new(engine.CDRsql)); err != nil { tx.Rollback() t.Fatal(err) } } - if !tx.HasTable("cdrs2") { - tx = tx.CreateTable(new(testModelSql)) - if err = tx.Error; err != nil { + if !tx.Migrator().HasTable("cdrs2") { + if err = tx.Migrator().CreateTable(new(testModelSql)); err != nil { tx.Rollback() t.Fatal(err) } @@ -306,13 +306,20 @@ func testSQLPoster(t *testing.T) { } func testSQLStop(t *testing.T) { - if _, err := db.DB().Exec(`DROP DATABASE cgrates2;`); err != nil { + close(rdrExit) + if err := db.Migrator().DropTable("cdrs2"); err != nil { t.Fatal(err) } - close(rdrExit) - db = db.DropTable("cdrs2") - db = db.DropTable("cdrs") - if err := db.Close(); err != nil { - t.Error(err) + if err := db.Migrator().DropTable("cdrs"); err != nil { + t.Fatal(err) } + if err := db.Exec(`DROP DATABASE cgrates2;`).Error; err != nil { + t.Fatal(err) + } + if db2, err := db.DB(); err != nil { + t.Fatal(err) + } else if err = db2.Close(); err != nil { + t.Fatal(err) + } + } diff --git a/go.mod b/go.mod index 1f87872a4..4fb2cbe94 100644 --- a/go.mod +++ b/go.mod @@ -45,9 +45,8 @@ require ( github.com/golang/protobuf v1.4.2 // indirect github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07 // indirect - github.com/jinzhu/gorm v1.9.16 github.com/jmhodges/levigo v1.0.0 // indirect - github.com/lib/pq v1.8.0 + github.com/lib/pq v1.8.0 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mediocregopher/radix/v3 v3.5.2 github.com/miekg/dns v1.1.30 diff --git a/go.sum b/go.sum index 2abd63980..37ced7da8 100644 --- a/go.sum +++ b/go.sum @@ -44,10 +44,8 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/RoaringBitmap/roaring v0.4.23 h1:gpyfd12QohbqhFO4NVDUdoPOCXsyahYRQhINmlHxKeo= github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/antchfx/xmlquery v1.2.4 h1:T/SH1bYdzdjTMoz2RgsfVKbM5uWh3gjDYYepFqQmFv4= github.com/antchfx/xmlquery v1.2.4/go.mod h1:KQQuESaxSlqugE2ZBcM/qn+ebIpt+d+4Xx7YcSGAIrM= github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= @@ -138,7 +136,6 @@ github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= @@ -151,7 +148,6 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ericlagergren/decimal v0.0.0-20191206042408-88212e6cfca9 h1:mMVotm9OVwoOS2IFGRRS5AfMTFWhtf8wj34JEYh47/k= github.com/ericlagergren/decimal v0.0.0-20191206042408-88212e6cfca9/go.mod h1:ZWP59etEywfyMG2lAqnoi3t8uoiZCiTmLtwt6iESIsQ= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= @@ -202,7 +198,6 @@ github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/V github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -315,11 +310,8 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.2/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= -github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -351,7 +343,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= @@ -372,7 +363,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mediocregopher/radix/v3 v3.5.2 h1:A9u3G7n4+fWmDZ2ZDHtlK+cZl4q55T+7RjKjR0/MAdk= github.com/mediocregopher/radix/v3 v3.5.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/miekg/dns v1.1.30 h1:Qww6FseFn8PRfw07jueqIXqodm0JKiiKuK0DeXSqfyo= @@ -491,7 +481,6 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -501,7 +490,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200320181102-891825fb96df/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= @@ -537,7 +525,6 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -749,8 +736,6 @@ gorm.io/driver/mysql v1.0.3/go.mod h1:twGxftLBlFgNVNakL7F+P/x9oYqoymG3YYT8cAfI9o gorm.io/driver/postgres v1.0.5 h1:raX6ezL/ciUmaYTvOq48jq1GE95aMC0CmxQYbxQ4Ufw= gorm.io/driver/postgres v1.0.5/go.mod h1:qrD92UurYzNctBMVCJ8C3VQEjffEuphycXtxOudXNCA= gorm.io/gorm v1.20.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v1.20.8 h1:iToaOdZgjNvlc44NFkxfLa3U9q63qwaxt0FdNCiwOMs= -gorm.io/gorm v1.20.8/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.20.11 h1:jYHQ0LLUViV85V8dM1TP9VBBkfzKTnuTXDjYObkI6yc= gorm.io/gorm v1.20.11/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/migrator/tp_dispatchers_it_test.go b/migrator/tp_dispatchers_it_test.go index c24fb0b37..5d1cb9034 100644 --- a/migrator/tp_dispatchers_it_test.go +++ b/migrator/tp_dispatchers_it_test.go @@ -107,11 +107,12 @@ func testTpDispITFlush(t *testing.T) { func testTpDispITPopulate(t *testing.T) { tpDisps = []*utils.TPDispatcherProfile{ - &utils.TPDispatcherProfile{ - TPid: "TP1", - Tenant: "cgrates.org", - ID: "Dsp1", - FilterIDs: []string{"*string:Account:1002"}, + { + TPid: "TP1", + Tenant: "cgrates.org", + ID: "Dsp1", + FilterIDs: []string{"*string:Account:1002"}, + Subsystems: make([]string, 0), ActivationInterval: &utils.TPActivationInterval{ ActivationTime: "2014-07-29T15:00:00Z", ExpiryTime: "",