From 8c0d65de06e702fcf297130ed3ef702aa0af7d78 Mon Sep 17 00:00:00 2001 From: Bowen Date: Thu, 3 Oct 2024 23:22:01 +0800 Subject: [PATCH 1/5] fix: nilaway --- console/application_test.go | 2 + database/gorm/event.go | 6 ++- database/gorm/query.go | 26 ++++++----- database/gorm/query_test.go | 15 +++++++ database/gorm/test_utils.go | 8 ++-- database/gorm/to_sql.go | 9 +++- database/gorm/to_sql_test.go | 83 ++++++++++++++++++++---------------- database/orm.go | 54 +++++++++++------------ database/service_provider.go | 3 +- foundation/application.go | 12 ++---- hash/application_test.go | 1 + http/middleware/throttle.go | 6 ++- log/logrus_writer_test.go | 14 ++++-- mail/mail_test.go | 27 ++++++------ session/manager_test.go | 2 +- session/session.go | 25 ++--------- session/session_test.go | 6 +-- support/docker/docker.go | 6 ++- testing/test_case.go | 8 ++++ 19 files changed, 175 insertions(+), 138 deletions(-) diff --git a/console/application_test.go b/console/application_test.go index f1d01305b..c6ef3b345 100644 --- a/console/application_test.go +++ b/console/application_test.go @@ -39,6 +39,7 @@ func TestFlagsToCliFlags(t *testing.T) { // Convert command flags to CLI flags cliFlags := flagsToCliFlags(flags) + assert.NotNil(t, cliFlags) // Assert that the number of CLI flags matches the number of command flags assert.Equal(t, len(cliFlags), len(flags)) @@ -49,6 +50,7 @@ func TestFlagsToCliFlags(t *testing.T) { case command.FlagTypeBool: boolFlag := flag.(*command.BoolFlag) cliBoolFlag := cliFlags[i].(*cli.BoolFlag) + assert.Equal(t, boolFlag.Name, cliBoolFlag.Name) assert.Equal(t, boolFlag.Aliases, cliBoolFlag.Aliases) assert.Equal(t, boolFlag.Usage, cliBoolFlag.Usage) diff --git a/database/gorm/event.go b/database/gorm/event.go index cff56b34e..62514d574 100644 --- a/database/gorm/event.go +++ b/database/gorm/event.go @@ -92,7 +92,7 @@ func (e *Event) IsDirty(columns ...string) bool { } func (e *Event) Query() orm.Query { - return NewQuery(e.query.ctx, e.query.config, e.query.fullConfig, e.query.instance.Session(&gorm.Session{NewDB: true}), nil) + return NewQuery(e.query.ctx, e.query.config, e.query.fullConfig, e.query.instance.Session(&gorm.Session{NewDB: true}), e.query.log, nil) } func (e *Event) SetAttribute(key string, value any) { @@ -101,6 +101,10 @@ func (e *Event) SetAttribute(key string, value any) { } destOfMap := e.getDestOfMap() + if destOfMap == nil { + return + } + destOfMap[e.toDBColumnName(key)] = value e.destOfMap = destOfMap diff --git a/database/gorm/query.go b/database/gorm/query.go index dd64faa3c..550844847 100644 --- a/database/gorm/query.go +++ b/database/gorm/query.go @@ -17,6 +17,7 @@ import ( "github.com/goravel/framework/contracts/config" contractsdatabase "github.com/goravel/framework/contracts/database" contractsorm "github.com/goravel/framework/contracts/database/orm" + "github.com/goravel/framework/contracts/log" "github.com/goravel/framework/database/db" "github.com/goravel/framework/database/gorm/hints" "github.com/goravel/framework/database/orm" @@ -29,15 +30,17 @@ type Query struct { ctx context.Context fullConfig contractsdatabase.FullConfig instance *gormio.DB + log log.Log queries map[string]*Query } -func NewQuery(ctx context.Context, config config.Config, fullConfig contractsdatabase.FullConfig, db *gormio.DB, conditions *Conditions) *Query { +func NewQuery(ctx context.Context, config config.Config, fullConfig contractsdatabase.FullConfig, db *gormio.DB, log log.Log, conditions *Conditions) *Query { queryImpl := &Query{ config: config, ctx: ctx, fullConfig: fullConfig, instance: db, + log: log, queries: make(map[string]*Query), } @@ -48,7 +51,7 @@ func NewQuery(ctx context.Context, config config.Config, fullConfig contractsdat return queryImpl } -func BuildQuery(ctx context.Context, config config.Config, connection string) (*Query, error) { +func BuildQuery(ctx context.Context, config config.Config, connection string, log log.Log) (*Query, error) { configBuilder := db.NewConfigBuilder(config, connection) writeConfigs := configBuilder.Writes() if len(writeConfigs) == 0 { @@ -60,7 +63,7 @@ func BuildQuery(ctx context.Context, config config.Config, connection string) (* return nil, err } - return NewQuery(ctx, config, writeConfigs[0], gorm, nil), nil + return NewQuery(ctx, config, writeConfigs[0], gorm, log, nil), nil } func (r *Query) Association(association string) contractsorm.Association { @@ -727,11 +730,11 @@ func (r *Query) Table(name string, args ...any) contractsorm.Query { } func (r *Query) ToSql() contractsorm.ToSql { - return NewToSql(r.setConditions(r.conditions), false) + return NewToSql(r.setConditions(r.conditions), r.log, false) } func (r *Query) ToRawSql() contractsorm.ToSql { - return NewToSql(r.setConditions(r.conditions), true) + return NewToSql(r.setConditions(r.conditions), r.log, true) } func (r *Query) Update(column any, value ...any) (*contractsorm.Result, error) { @@ -984,7 +987,10 @@ func (r *Query) buildModel() *Query { query, err := r.refreshConnection(r.conditions.model) if err != nil { - return nil + query = r.new(r.instance.Session(&gormio.Session{})) + query.instance.AddError(err) + + return query } return query.new(query.instance.Model(r.conditions.model)) @@ -1122,7 +1128,7 @@ func (r *Query) buildWith(db *gormio.DB) *gormio.DB { if arg, ok := item.args[0].(func(contractsorm.Query) contractsorm.Query); ok { newArgs := []any{ func(tx *gormio.DB) *gormio.DB { - queryImpl := NewQuery(r.ctx, r.config, r.fullConfig, tx, nil) + queryImpl := NewQuery(r.ctx, r.config, r.fullConfig, tx, r.log, nil) query := arg(queryImpl) queryImpl = query.(*Query) queryImpl = queryImpl.buildConditions() @@ -1256,9 +1262,7 @@ func (r *Query) event(event contractsorm.EventType, model, dest any) error { } func (r *Query) new(db *gormio.DB) *Query { - query := NewQuery(r.ctx, r.config, r.fullConfig, db, &r.conditions) - - return query + return NewQuery(r.ctx, r.config, r.fullConfig, db, r.log, &r.conditions) } func (r *Query) omitCreate(value any) error { @@ -1323,7 +1327,7 @@ func (r *Query) refreshConnection(model any) (*Query, error) { query, ok := r.queries[connection] if !ok { var err error - query, err = BuildQuery(r.ctx, r.config, connection) + query, err = BuildQuery(r.ctx, r.config, connection, r.log) if err != nil { return nil, err } diff --git a/database/gorm/query_test.go b/database/gorm/query_test.go index 01f6c77d9..adc3ea41f 100644 --- a/database/gorm/query_test.go +++ b/database/gorm/query_test.go @@ -2545,6 +2545,21 @@ func (s *QueryTestSuite) TestLoadMissing() { } } +func (s *QueryTestSuite) TestModel() { + for driver, query := range s.queries { + s.Run(driver.String(), func() { + // model is valid + user := User{Name: "model_user"} + s.Nil(query.Query().Model(&User{}).Create(&user)) + s.True(user.ID > 0) + + // model is invalid + user1 := User{Name: "model_user"} + s.EqualError(query.Query().Model("users").Create(&user1), "invalid model") + }) + } +} + func (s *QueryTestSuite) TestRaw() { for driver, query := range s.queries { s.Run(driver.String(), func() { diff --git a/database/gorm/test_utils.go b/database/gorm/test_utils.go index dd8e79078..12096eb2f 100644 --- a/database/gorm/test_utils.go +++ b/database/gorm/test_utils.go @@ -20,7 +20,7 @@ const ( TestModelNormal // Switch this value to control the test model. - TestModel = TestModelNormal + TestModel = TestModelMinimum ) type TestTable int @@ -234,10 +234,10 @@ func NewTestQuery(docker testing.DatabaseDriver, withPrefixAndSingular ...bool) ) if len(withPrefixAndSingular) > 0 && withPrefixAndSingular[0] { mockDriver.WithPrefixAndSingular() - query, err = BuildQuery(testContext, mockConfig, docker.Driver().String()) + query, err = BuildQuery(testContext, mockConfig, docker.Driver().String(), nil) } else { mockDriver.Common() - query, err = BuildQuery(testContext, mockConfig, docker.Driver().String()) + query, err = BuildQuery(testContext, mockConfig, docker.Driver().String(), nil) } if err != nil { @@ -276,7 +276,7 @@ func (r *TestQuery) QueryOfReadWrite(config TestReadWriteConfig) (orm.Query, err mockDriver := getMockDriver(r.Docker(), mockConfig, r.Docker().Driver().String()) mockDriver.ReadWrite(config) - return BuildQuery(testContext, mockConfig, r.docker.Driver().String()) + return BuildQuery(testContext, mockConfig, r.docker.Driver().String(), nil) } func getMockDriver(docker testing.DatabaseDriver, mockConfig *mocksconfig.Config, connection string) testMockDriver { diff --git a/database/gorm/to_sql.go b/database/gorm/to_sql.go index 5591daaec..6a516d0fb 100644 --- a/database/gorm/to_sql.go +++ b/database/gorm/to_sql.go @@ -2,15 +2,19 @@ package gorm import ( "gorm.io/gorm" + + "github.com/goravel/framework/contracts/log" ) type ToSql struct { + log log.Log query *Query raw bool } -func NewToSql(query *Query, raw bool) *ToSql { +func NewToSql(query *Query, log log.Log, raw bool) *ToSql { return &ToSql{ + log: log, query: query, raw: raw, } @@ -105,6 +109,9 @@ func (r *ToSql) Update(column any, value ...any) string { func (r *ToSql) sql(db *gorm.DB) string { sql := db.Statement.SQL.String() + if db.Statement.Error != nil { + r.log.Errorf("failed to get sql: %v", db.Statement.Error) + } if !r.raw { return sql } diff --git a/database/gorm/to_sql_test.go b/database/gorm/to_sql_test.go index 23fe76abb..136995014 100644 --- a/database/gorm/to_sql_test.go +++ b/database/gorm/to_sql_test.go @@ -1,18 +1,21 @@ package gorm import ( + "errors" "testing" "github.com/stretchr/testify/suite" ormcontract "github.com/goravel/framework/contracts/database/orm" + mockslog "github.com/goravel/framework/mocks/log" "github.com/goravel/framework/support/docker" "github.com/goravel/framework/support/env" ) type ToSqlTestSuite struct { suite.Suite - query ormcontract.Query + mockLog *mockslog.Log + query ormcontract.Query } func TestToSqlTestSuite(t *testing.T) { @@ -30,22 +33,24 @@ func (s *ToSqlTestSuite) SetupSuite() { s.query = postgresQuery.Query() } -func (s *ToSqlTestSuite) SetupTest() {} +func (s *ToSqlTestSuite) SetupTest() { + s.mockLog = mockslog.NewLog(s.T()) +} func (s *ToSqlTestSuite) TestCount() { - toSql := NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, false) s.Equal("SELECT count(*) FROM \"users\" WHERE \"id\" = $1 AND \"users\".\"deleted_at\" IS NULL", toSql.Count()) - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, true) s.Equal("SELECT count(*) FROM \"users\" WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL", toSql.Count()) } func (s *ToSqlTestSuite) TestCreate() { user := User{Name: "to_sql_create"} - toSql := NewToSql(s.query.(*Query), false) + toSql := NewToSql(s.query.(*Query), s.mockLog, false) s.Equal("INSERT INTO \"users\" (\"created_at\",\"updated_at\",\"deleted_at\",\"name\",\"bio\",\"avatar\") VALUES ($1,$2,$3,$4,$5,$6) RETURNING \"id\"", toSql.Create(&user)) - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, true) s.Contains(toSql.Create(&user), "INSERT INTO \"users\" (\"created_at\",\"updated_at\",\"deleted_at\",\"name\",\"bio\",\"avatar\") VALUES (") s.Contains(toSql.Create(&user), ",NULL,'to_sql_create',NULL,'')") @@ -55,124 +60,130 @@ func (s *ToSqlTestSuite) TestCreate() { } func (s *ToSqlTestSuite) TestDelete() { - toSql := NewToSql(s.query.Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("UPDATE \"users\" SET \"deleted_at\"=$1 WHERE \"id\" = $2 AND \"users\".\"deleted_at\" IS NULL", toSql.Delete(&User{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), false) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("DELETE FROM \"roles\" WHERE \"id\" = $1", toSql.Delete(&Role{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) sql := toSql.Delete(&User{}) s.Contains(sql, "UPDATE \"users\" SET \"deleted_at\"=") s.Contains(sql, "WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL") - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) s.Equal("DELETE FROM \"roles\" WHERE \"id\" = 1", toSql.Delete(&Role{})) } func (s *ToSqlTestSuite) TestFind() { - toSql := NewToSql(s.query.Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("SELECT * FROM \"users\" WHERE \"id\" = $1 AND \"users\".\"deleted_at\" IS NULL", toSql.Find(&User{})) - toSql = NewToSql(s.query.(*Query), false) + toSql = NewToSql(s.query.(*Query), s.mockLog, false) s.Equal("SELECT * FROM \"users\" WHERE \"users\".\"id\" = $1 AND \"users\".\"deleted_at\" IS NULL", toSql.Find(&User{}, 1)) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) s.Equal("SELECT * FROM \"users\" WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL", toSql.Find(&User{})) - toSql = NewToSql(s.query.(*Query), true) + toSql = NewToSql(s.query.(*Query), s.mockLog, true) s.Equal("SELECT * FROM \"users\" WHERE \"users\".\"id\" = 1 AND \"users\".\"deleted_at\" IS NULL", toSql.Find(&User{}, 1)) } func (s *ToSqlTestSuite) TestFirst() { - toSql := NewToSql(s.query.Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("SELECT * FROM \"users\" WHERE \"id\" = $1 AND \"users\".\"deleted_at\" IS NULL ORDER BY \"users\".\"id\" LIMIT $2", toSql.First(&User{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) s.Equal("SELECT * FROM \"users\" WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL ORDER BY \"users\".\"id\" LIMIT 1", toSql.First(&User{})) } func (s *ToSqlTestSuite) TestForceDelete() { - toSql := NewToSql(s.query.Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("DELETE FROM \"users\" WHERE \"id\" = $1", toSql.ForceDelete(&User{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), false) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("DELETE FROM \"roles\" WHERE \"id\" = $1", toSql.ForceDelete(&Role{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) s.Equal("DELETE FROM \"users\" WHERE \"id\" = 1", toSql.ForceDelete(&User{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) s.Equal("DELETE FROM \"roles\" WHERE \"id\" = 1", toSql.ForceDelete(&Role{})) } func (s *ToSqlTestSuite) TestGet() { - toSql := NewToSql(s.query.Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("SELECT * FROM \"users\" WHERE \"id\" = $1 AND \"users\".\"deleted_at\" IS NULL", toSql.Get([]User{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) s.Equal("SELECT * FROM \"users\" WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL", toSql.Get([]User{})) } +func (s *ToSqlTestSuite) TestInvalidModel() { + s.mockLog.EXPECT().Errorf("failed to get sql: %v", errors.New("invalid model")).Once() + toSql := NewToSql(s.query.Model("invalid").Where("id", 1).(*Query), s.mockLog, false) + s.Empty(toSql.Get([]User{})) +} + func (s *ToSqlTestSuite) TestPluck() { - toSql := NewToSql(s.query.Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("SELECT \"id\" FROM \"users\" WHERE \"id\" = $1 AND \"users\".\"deleted_at\" IS NULL", toSql.Pluck("id", User{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) s.Equal("SELECT \"id\" FROM \"users\" WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL", toSql.Pluck("id", User{})) } func (s *ToSqlTestSuite) TestSave() { - toSql := NewToSql(s.query.Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("INSERT INTO \"users\" (\"created_at\",\"updated_at\",\"deleted_at\",\"name\",\"bio\",\"avatar\") VALUES ($1,$2,$3,$4,$5,$6) RETURNING \"id\"", toSql.Save(&User{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) sql := toSql.Save(&User{}) s.Contains(sql, "INSERT INTO \"users\" (\"created_at\",\"updated_at\",\"deleted_at\",\"name\",\"bio\",\"avatar\") VALUES (") s.Contains(sql, ",NULL,'',NULL,'')") } func (s *ToSqlTestSuite) TestSum() { - toSql := NewToSql(s.query.Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, false) s.Equal("SELECT SUM(id) FROM \"users\" WHERE \"id\" = $1 AND \"users\".\"deleted_at\" IS NULL", toSql.Sum("id", User{})) - toSql = NewToSql(s.query.Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Where("id", 1).(*Query), s.mockLog, true) s.Equal("SELECT SUM(id) FROM \"users\" WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL", toSql.Sum("id", User{})) } func (s *ToSqlTestSuite) TestUpdate() { - toSql := NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), false) + toSql := NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, false) s.Equal("UPDATE \"users\" SET \"name\"=$1,\"updated_at\"=$2 WHERE \"id\" = $3 AND \"users\".\"deleted_at\" IS NULL", toSql.Update("name", "goravel")) - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, true) sql := toSql.Update("name", "goravel") s.Contains(sql, "UPDATE \"users\" SET \"name\"='goravel',\"updated_at\"=") s.Contains(sql, "WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL") - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), false) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, false) s.Empty(toSql.Update(0, "goravel")) - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, true) s.Empty(toSql.Update(0, "goravel")) - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), false) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, false) s.Equal("UPDATE \"users\" SET \"name\"=$1,\"updated_at\"=$2 WHERE \"id\" = $3 AND \"users\".\"deleted_at\" IS NULL", toSql.Update(map[string]any{ "name": "goravel", })) - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, true) sql = toSql.Update(map[string]any{ "name": "goravel", }) s.Contains(sql, "UPDATE \"users\" SET \"name\"='goravel',\"updated_at\"=") s.Contains(sql, "WHERE \"id\" = 1 AND \"users\".\"deleted_at\" IS NULL") - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), false) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, false) s.Equal("UPDATE \"users\" SET \"updated_at\"=$1,\"name\"=$2 WHERE \"id\" = $3 AND \"users\".\"deleted_at\" IS NULL", toSql.Update(User{ Name: "goravel", })) - toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), true) + toSql = NewToSql(s.query.Model(&User{}).Where("id", 1).(*Query), s.mockLog, true) sql = toSql.Update(User{ Name: "goravel", }) diff --git a/database/orm.go b/database/orm.go index 264b537ba..312009b06 100644 --- a/database/orm.go +++ b/database/orm.go @@ -7,40 +7,52 @@ import ( "github.com/goravel/framework/contracts/config" contractsorm "github.com/goravel/framework/contracts/database/orm" + "github.com/goravel/framework/contracts/log" "github.com/goravel/framework/database/gorm" "github.com/goravel/framework/database/orm" - "github.com/goravel/framework/support/color" ) type Orm struct { ctx context.Context config config.Config connection string + log log.Log query contractsorm.Query queries map[string]contractsorm.Query refresh func(key any) } -func NewOrm(ctx context.Context, config config.Config, connection string, query contractsorm.Query, refresh func(key any)) (*Orm, error) { +func NewOrm( + ctx context.Context, + config config.Config, + connection string, + query contractsorm.Query, + queries map[string]contractsorm.Query, + log log.Log, + refresh func(key any), +) *Orm { return &Orm{ ctx: ctx, config: config, connection: connection, + log: log, query: query, - queries: map[string]contractsorm.Query{ - connection: query, - }, - refresh: refresh, - }, nil + queries: queries, + refresh: refresh, + } } -func BuildOrm(ctx context.Context, config config.Config, connection string, refresh func(key any)) (*Orm, error) { - query, err := gorm.BuildQuery(ctx, config, connection) +func BuildOrm(ctx context.Context, config config.Config, connection string, log log.Log, refresh func(key any)) (*Orm, error) { + query, err := gorm.BuildQuery(ctx, config, connection, log) if err != nil { return nil, fmt.Errorf("[Orm] Build query for %s connection error: %v", connection, err) } - return NewOrm(ctx, config, connection, query, refresh) + queries := map[string]contractsorm.Query{ + connection: query, + } + + return NewOrm(ctx, config, connection, query, queries, log, refresh), nil } func (r *Orm) Connection(name string) contractsorm.Orm { @@ -48,31 +60,19 @@ func (r *Orm) Connection(name string) contractsorm.Orm { name = r.config.GetString("database.default") } if instance, exist := r.queries[name]; exist { - return &Orm{ - ctx: r.ctx, - config: r.config, - connection: name, - query: instance, - queries: r.queries, - } + return NewOrm(r.ctx, r.config, name, instance, r.queries, r.log, r.refresh) } - queue, err := gorm.BuildQuery(r.ctx, r.config, name) + queue, err := gorm.BuildQuery(r.ctx, r.config, name, r.log) if err != nil || queue == nil { - color.Red().Println(fmt.Sprintf("[Orm] Init %s connection error: %v", name, err)) + r.log.Errorf("[Orm] Init %s connection error: %v", name, err) - return nil + return NewOrm(r.ctx, r.config, name, nil, r.queries, r.log, r.refresh) } r.queries[name] = queue - return &Orm{ - ctx: r.ctx, - config: r.config, - connection: name, - query: queue, - queries: r.queries, - } + return NewOrm(r.ctx, r.config, name, queue, r.queries, r.log, r.refresh) } func (r *Orm) DB() (*sql.DB, error) { diff --git a/database/service_provider.go b/database/service_provider.go index 77db293b7..4711bcd95 100644 --- a/database/service_provider.go +++ b/database/service_provider.go @@ -21,8 +21,9 @@ func (r *ServiceProvider) Register(app foundation.Application) { app.Singleton(BindingOrm, func(app foundation.Application) (any, error) { ctx := context.Background() config := app.MakeConfig() + log := app.MakeLog() connection := config.GetString("database.default") - orm, err := BuildOrm(ctx, config, connection, app.Refresh) + orm, err := BuildOrm(ctx, config, connection, log, app.Refresh) if err != nil { return nil, fmt.Errorf("[Orm] Init %s connection error: %v", connection, err) } diff --git a/foundation/application.go b/foundation/application.go index 758d5434a..c80390c59 100644 --- a/foundation/application.go +++ b/foundation/application.go @@ -111,12 +111,12 @@ func (app *Application) ExecutablePath(path ...string) string { } func (app *Application) Publishes(packageName string, paths map[string]string, groups ...string) { - app.ensurePublishArrayInitialized(packageName) - + if _, exist := app.publishes[packageName]; !exist { + app.publishes[packageName] = make(map[string]string) + } for key, value := range paths { app.publishes[packageName][key] = value } - for _, group := range groups { app.addPublishGroup(group, paths) } @@ -160,12 +160,6 @@ func (app *Application) IsLocale(ctx context.Context, locale string) bool { return app.CurrentLocale(ctx) == locale } -func (app *Application) ensurePublishArrayInitialized(packageName string) { - if _, exist := app.publishes[packageName]; !exist { - app.publishes[packageName] = make(map[string]string) - } -} - func (app *Application) addPublishGroup(group string, paths map[string]string) { if _, exist := app.publishGroups[group]; !exist { app.publishGroups[group] = make(map[string]string) diff --git a/hash/application_test.go b/hash/application_test.go index 5a6909b61..1c0131ebd 100644 --- a/hash/application_test.go +++ b/hash/application_test.go @@ -59,6 +59,7 @@ func (s *ApplicationTestSuite) TestCheckHash() { func (s *ApplicationTestSuite) TestConfigurationOverride() { value := "$argon2id$v=19$m=65536,t=8,p=1$NlVjQm5PQUdWTHVTM1RBUg$Q5T7WfeCI7ucIdk6Na6AdQ" + s.NotNil(s.hashers["argon2id"]) s.True(s.hashers["argon2id"].Check("goravel", value)) s.True(s.hashers["argon2id"].NeedsRehash(value)) } diff --git a/http/middleware/throttle.go b/http/middleware/throttle.go index b2afede6a..f9c4e2361 100644 --- a/http/middleware/throttle.go +++ b/http/middleware/throttle.go @@ -53,7 +53,7 @@ func Throttle(name string) httpcontract.Middleware { func key(ctx httpcontract.Context, limit *httplimit.Limit, name string, index int) string { // if no key is set, use the path and ip address as the default key - if len(limit.Key) == 0 { + if len(limit.Key) == 0 && ctx.Request() != nil { return fmt.Sprintf("throttle:%s:%d:%s:%s", name, index, ctx.Request().Ip(), ctx.Request().Path()) } @@ -64,6 +64,8 @@ func response(ctx httpcontract.Context, limit *httplimit.Limit) { if limit.ResponseCallback != nil { limit.ResponseCallback(ctx) } else { - ctx.Request().AbortWithStatus(httpcontract.StatusTooManyRequests) + if ctx.Request() != nil { + ctx.Request().AbortWithStatus(httpcontract.StatusTooManyRequests) + } } } diff --git a/log/logrus_writer_test.go b/log/logrus_writer_test.go index 685d35f26..57edb3bf9 100644 --- a/log/logrus_writer_test.go +++ b/log/logrus_writer_test.go @@ -472,6 +472,8 @@ func Benchmark_Debug(b *testing.B) { mockDriverConfig(mockConfig) log := NewApplication(mockConfig, json.NewJson()) + assert.NotNil(b, log) + for i := 0; i < b.N; i++ { log.Debug("Debug Goravel") } @@ -484,6 +486,8 @@ func Benchmark_Info(b *testing.B) { mockDriverConfig(mockConfig) log := NewApplication(mockConfig, json.NewJson()) + assert.NotNil(b, log) + for i := 0; i < b.N; i++ { log.Info("Goravel") } @@ -496,6 +500,8 @@ func Benchmark_Warning(b *testing.B) { mockDriverConfig(mockConfig) log := NewApplication(mockConfig, json.NewJson()) + assert.NotNil(b, log) + for i := 0; i < b.N; i++ { log.Warning("Goravel") } @@ -508,6 +514,8 @@ func Benchmark_Error(b *testing.B) { mockDriverConfig(mockConfig) log := NewApplication(mockConfig, json.NewJson()) + assert.NotNil(b, log) + for i := 0; i < b.N; i++ { log.Error("Goravel") } @@ -524,10 +532,10 @@ func Benchmark_Panic(b *testing.B) { mockDriverConfig(mockConfig) log := NewApplication(mockConfig, json.NewJson()) + assert.NotNil(b, log) + for i := 0; i < b.N; i++ { - defer func() { - recover() //nolint:errcheck - }() + defer recover() //nolint:errcheck log.Panic("Goravel") } diff --git a/mail/mail_test.go b/mail/mail_test.go index cae25ad86..08c8551ab 100644 --- a/mail/mail_test.go +++ b/mail/mail_test.go @@ -13,6 +13,8 @@ import ( "net/textproto" "strings" "testing" + + "github.com/stretchr/testify/assert" ) func prepareEmail() *Email { @@ -534,21 +536,16 @@ Content-type: text/plain; charset=ISO-8859-1 This is a test message!`) e, err := NewEmailFromReader(bytes.NewReader(raw)) - if err != nil { - t.Fatalf("Error creating email %s", err.Error()) - } - if e.Subject != ex.Subject { - t.Fatalf("Incorrect subject. %#q != %#q", e.Subject, ex.Subject) - } - if e.From != ex.From { - t.Fatalf("Incorrect \"From\": %#q != %#q", e.From, ex.From) - } - if e.To[0] != ex.To[0] { - t.Fatalf("Incorrect \"To\": %#q != %#q", e.To, ex.To) - } - if e.Cc[0] != ex.Cc[0] { - t.Fatalf("Incorrect \"Cc\": %#q != %#q", e.Cc, ex.Cc) - } + + assert.Nil(t, err) + assert.Equal(t, e.Subject, ex.Subject) + assert.Equal(t, e.From, ex.From) + assert.Len(t, e.To, 1) + assert.Len(t, ex.To, 1) + assert.Equal(t, e.To[0], ex.To[0]) + assert.Len(t, e.Cc, 1) + assert.Len(t, ex.Cc, 1) + assert.Equal(t, e.Cc[0], ex.Cc[0]) } func TestNonMultipartEmailFromReader(t *testing.T) { diff --git a/session/manager_test.go b/session/manager_test.go index 972ffee53..b7eaa477a 100644 --- a/session/manager_test.go +++ b/session/manager_test.go @@ -91,7 +91,7 @@ func (s *ManagerTestSuite) TestExtend() { // driver already exists err = s.manager.Extend("test", NewCustomDriver) s.ErrorIs(err, errors.ErrSessionDriverAlreadyExists) - s.Equal(err.Error(), errors.ErrSessionDriverAlreadyExists.Args("test").Error()) + s.EqualError(err, errors.ErrSessionDriverAlreadyExists.Args("test").Error()) } func (s *ManagerTestSuite) TestBuildSession() { diff --git a/session/session.go b/session/session.go index de0296984..2ed0f9ebd 100644 --- a/session/session.go +++ b/session/session.go @@ -8,7 +8,6 @@ import ( "github.com/goravel/framework/contracts/foundation" sessioncontract "github.com/goravel/framework/contracts/session" - "github.com/goravel/framework/errors" "github.com/goravel/framework/support/color" supportmaps "github.com/goravel/framework/support/maps" "github.com/goravel/framework/support/str" @@ -157,10 +156,6 @@ func (s *Session) Save() error { return err } - if err = s.validateDriver(); err != nil { - return err - } - if err = s.driver.Write(s.GetID(), string(data)); err != nil { return err } @@ -171,6 +166,10 @@ func (s *Session) Save() error { } func (s *Session) SetDriver(driver sessioncontract.Driver) sessioncontract.Session { + if driver == nil { + return s + } + s.driver = driver return s } @@ -221,13 +220,6 @@ func (s *Session) loadSession() { } } -func (s *Session) validateDriver() error { - if s.driver == nil { - return errors.ErrSessionDriverIsNotSet - } - return nil -} - func (s *Session) migrate(destroy ...bool) error { shouldDestroy := false if len(destroy) > 0 { @@ -235,10 +227,6 @@ func (s *Session) migrate(destroy ...bool) error { } if shouldDestroy { - if err := s.validateDriver(); err != nil { - return err - } - if err := s.driver.Destroy(s.GetID()); err != nil { return err } @@ -250,11 +238,6 @@ func (s *Session) migrate(destroy ...bool) error { } func (s *Session) readFromHandler() map[string]any { - if err := s.validateDriver(); err != nil { - color.Red().Println(err) - return nil - } - value, err := s.driver.Read(s.GetID()) if err != nil { color.Red().Println(err) diff --git a/session/session_test.go b/session/session_test.go index c8d38820e..026e237aa 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -165,7 +165,7 @@ func (s *SessionTestSuite) TestMigrate() { // when driver is nil s.session.SetDriver(nil) - s.ErrorIs(s.session.migrate(true), errors.ErrSessionDriverIsNotSet) + s.Nil(s.session.migrate(true)) } func (s *SessionTestSuite) TestMissing() { @@ -301,10 +301,6 @@ func (s *SessionTestSuite) TestSave() { s.Equal(errors.New("error"), s.session.Save()) s.True(s.session.started) - - // when driver is nil - s.session.SetDriver(nil) - s.ErrorIs(s.session.Save(), errors.ErrSessionDriverIsNotSet) } func (s *SessionTestSuite) TestSetID() { diff --git a/support/docker/docker.go b/support/docker/docker.go index 6a9277638..4f00dc80a 100644 --- a/support/docker/docker.go +++ b/support/docker/docker.go @@ -56,7 +56,7 @@ func Sqlites(num int) []testing.DatabaseDriver { func Database(containerType ContainerType, database, username, password string, num int) []testing.DatabaseDriver { if num <= 0 { - return nil + panic("the number of database container must be greater than 0") } var drivers []testing.DatabaseDriver @@ -83,6 +83,10 @@ func Database(containerType ContainerType, database, username, password string, drivers = append(drivers, databaseDriver) } + if len(drivers) != num { + panic(fmt.Sprintf("the number of database container is not enough, expect: %d, got: %d", num, len(drivers))) + } + for _, driver := range drivers { if err := driver.Fresh(); err != nil { panic(err) diff --git a/testing/test_case.go b/testing/test_case.go index d8b28b9ee..a94d889f8 100644 --- a/testing/test_case.go +++ b/testing/test_case.go @@ -18,9 +18,17 @@ func (receiver *TestCase) Seed(seeds ...seeder.Seeder) { } } + if artisanFacade == nil { + panic("Artisan facade is not initialized") + } + artisanFacade.Call(command) } func (receiver *TestCase) RefreshDatabase(seeds ...seeder.Seeder) { + if artisanFacade == nil { + panic("Artisan facade is not initialized") + } + artisanFacade.Call("migrate:refresh") } From 392a7ecbf450a38eb6eaef1c3dc896f483fcaa11 Mon Sep 17 00:00:00 2001 From: Bowen Date: Thu, 3 Oct 2024 23:41:51 +0800 Subject: [PATCH 2/5] fix: nilaway --- database/gorm/query.go | 2 +- database/gorm/test_utils.go | 17 ++---- session/session_test.go | 2 + support/docker/docker.go | 11 ++++ support/docker/docker_test.go | 92 +++++++++++++++++++------------- support/docker/mysql_test.go | 2 +- support/docker/sqlite_test.go | 2 +- support/docker/sqlserver_test.go | 2 +- 8 files changed, 74 insertions(+), 56 deletions(-) diff --git a/database/gorm/query.go b/database/gorm/query.go index 550844847..c2a7f357a 100644 --- a/database/gorm/query.go +++ b/database/gorm/query.go @@ -988,7 +988,7 @@ func (r *Query) buildModel() *Query { query, err := r.refreshConnection(r.conditions.model) if err != nil { query = r.new(r.instance.Session(&gormio.Session{})) - query.instance.AddError(err) + _ = query.instance.AddError(err) return query } diff --git a/database/gorm/test_utils.go b/database/gorm/test_utils.go index 12096eb2f..5291357cf 100644 --- a/database/gorm/test_utils.go +++ b/database/gorm/test_utils.go @@ -12,17 +12,6 @@ import ( supportdocker "github.com/goravel/framework/support/docker" ) -// Define different test model, to improve the local testing speed. -// The minimum model only initials one Sqlite and two Postgres, -// and the normal model initials one Mysql, two Postgres, one Sqlite and one Sqlserver. -const ( - TestModelMinimum = iota - TestModelNormal - - // Switch this value to control the test model. - TestModel = TestModelMinimum -) - type TestTable int const ( @@ -64,7 +53,7 @@ type TestQueries struct { } func NewTestQueries() *TestQueries { - if TestModel == TestModelMinimum { + if supportdocker.TestModel == supportdocker.TestModelMinimum { return &TestQueries{ sqliteDockers: supportdocker.Sqlites(2), postgresDockers: supportdocker.Postgreses(2), @@ -111,7 +100,7 @@ func (r *TestQueries) QueriesOfReadWrite() map[contractsdatabase.Driver]map[stri panic(err) } - if TestModel == TestModelMinimum { + if supportdocker.TestModel == supportdocker.TestModelMinimum { return map[contractsdatabase.Driver]map[string]orm.Query{ contractsdatabase.DriverPostgres: { "mix": postgresQuery, @@ -197,7 +186,7 @@ func (r *TestQueries) queries(withPrefixAndSingular bool) map[contractsdatabase. contractsdatabase.DriverSqlite: r.sqliteDockers[0], } - if TestModel != TestModelMinimum { + if supportdocker.TestModel != supportdocker.TestModelMinimum { driverToDocker[contractsdatabase.DriverMysql] = r.mysqlDockers[0] driverToDocker[contractsdatabase.DriverSqlserver] = r.sqlserverDockers[0] } diff --git a/session/session_test.go b/session/session_test.go index 026e237aa..143cd8570 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -164,6 +164,8 @@ func (s *SessionTestSuite) TestMigrate() { s.NotEqual(oldID, s.session.GetID()) // when driver is nil + oldID = s.session.GetID() + s.driver.On("Destroy", s.session.GetID()).Return(nil).Once() s.session.SetDriver(nil) s.Nil(s.session.migrate(true)) } diff --git a/support/docker/docker.go b/support/docker/docker.go index 4f00dc80a..a8145e844 100644 --- a/support/docker/docker.go +++ b/support/docker/docker.go @@ -6,6 +6,17 @@ import ( "github.com/goravel/framework/contracts/testing" ) +// Define different test model, to improve the local testing speed. +// The minimum model only initials one Sqlite and two Postgres, +// and the normal model initials one Mysql, two Postgres, one Sqlite and one Sqlserver. +const ( + TestModelMinimum = iota + TestModelNormal + + // Switch this value to control the test model. + TestModel = TestModelMinimum +) + type ContainerType string const ( diff --git a/support/docker/docker_test.go b/support/docker/docker_test.go index 70900746d..8955ad8a8 100644 --- a/support/docker/docker_test.go +++ b/support/docker/docker_test.go @@ -25,54 +25,70 @@ func TestDatabase(t *testing.T) { containerType: ContainerTypeMysql, num: 0, }, - { - name: "single mysql", - containerType: ContainerTypeMysql, - num: 1, - }, - { - name: "multiple mysql", - containerType: ContainerTypeMysql, - num: 2, - }, { name: "single postgres", containerType: ContainerTypePostgres, num: 1, }, - { - name: "multiple postgres", - containerType: ContainerTypePostgres, - num: 2, - }, - { - name: "single sqlite", - containerType: ContainerTypeSqlite, - num: 1, - }, - { - name: "multiple sqlite", - containerType: ContainerTypeSqlite, - num: 2, - }, - { - name: "single sqlserver", - containerType: ContainerTypeSqlserver, - num: 1, - }, - { - name: "multiple sqlserver", - containerType: ContainerTypeSqlserver, - num: 2, - }, + } + + if TestModel == TestModelNormal { + tests = append(tests, []struct { + name string + containerType ContainerType + num int + setup func(drivers []contractstesting.DatabaseDriver) + }{ + { + name: "single mysql", + containerType: ContainerTypeMysql, + num: 1, + }, + { + name: "multiple mysql", + containerType: ContainerTypeMysql, + num: 2, + }, + { + name: "multiple postgres", + containerType: ContainerTypePostgres, + num: 2, + }, + { + name: "single sqlite", + containerType: ContainerTypeSqlite, + num: 1, + }, + { + name: "multiple sqlite", + containerType: ContainerTypeSqlite, + num: 2, + }, + { + name: "single sqlserver", + containerType: ContainerTypeSqlserver, + num: 1, + }, + { + name: "multiple sqlserver", + containerType: ContainerTypeSqlserver, + num: 2, + }, + }...) } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - drivers := Database(test.containerType, testDatabase, testUsername, testPassword, test.num) + if test.num == 0 { + assert.Panics(t, func() { + Database(test.containerType, testDatabase, testUsername, testPassword, test.num) + }) + } else { + drivers := Database(test.containerType, testDatabase, testUsername, testPassword, test.num) - assert.Len(t, drivers, test.num) - assert.Len(t, containers[test.containerType], test.num) + assert.Len(t, drivers, test.num) + assert.Len(t, containers[test.containerType], test.num) + } }) } } diff --git a/support/docker/mysql_test.go b/support/docker/mysql_test.go index 4129f9037..18e700f9e 100644 --- a/support/docker/mysql_test.go +++ b/support/docker/mysql_test.go @@ -19,7 +19,7 @@ type MysqlTestSuite struct { } func TestMysqlTestSuite(t *testing.T) { - if env.IsWindows() { + if env.IsWindows() || TestModel == TestModelNormal { t.Skip("Skipping tests of using docker") } diff --git a/support/docker/sqlite_test.go b/support/docker/sqlite_test.go index e20a076c2..eb3275dc2 100644 --- a/support/docker/sqlite_test.go +++ b/support/docker/sqlite_test.go @@ -18,7 +18,7 @@ type SqliteTestSuite struct { } func TestSqliteTestSuite(t *testing.T) { - if env.IsWindows() { + if env.IsWindows() || TestModel == TestModelNormal { t.Skip("Skipping tests of using docker") } diff --git a/support/docker/sqlserver_test.go b/support/docker/sqlserver_test.go index ebc1a0aea..d1a231ef8 100644 --- a/support/docker/sqlserver_test.go +++ b/support/docker/sqlserver_test.go @@ -18,7 +18,7 @@ type SqlserverTestSuite struct { } func TestSqlserverTestSuite(t *testing.T) { - if env.IsWindows() { + if env.IsWindows() || TestModel == TestModelNormal { t.Skip("Skipping tests of using docker") } From be6ba924be25f9a582f31b7cc59be40c1bbef9f5 Mon Sep 17 00:00:00 2001 From: Bowen Date: Thu, 3 Oct 2024 23:42:13 +0800 Subject: [PATCH 3/5] fix: nilaway --- support/docker/docker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/docker/docker.go b/support/docker/docker.go index a8145e844..9be6f4dec 100644 --- a/support/docker/docker.go +++ b/support/docker/docker.go @@ -14,7 +14,7 @@ const ( TestModelNormal // Switch this value to control the test model. - TestModel = TestModelMinimum + TestModel = TestModelNormal ) type ContainerType string From 3108aabc93e3b9c034affe9efc650143dabc38e5 Mon Sep 17 00:00:00 2001 From: Bowen Date: Thu, 3 Oct 2024 23:47:59 +0800 Subject: [PATCH 4/5] fix test --- log/logrus_writer_test.go | 4 +++- session/session_test.go | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/log/logrus_writer_test.go b/log/logrus_writer_test.go index 57edb3bf9..7ae913b87 100644 --- a/log/logrus_writer_test.go +++ b/log/logrus_writer_test.go @@ -535,7 +535,9 @@ func Benchmark_Panic(b *testing.B) { assert.NotNil(b, log) for i := 0; i < b.N; i++ { - defer recover() //nolint:errcheck + defer func() { + recover() //nolint:errcheck + }() log.Panic("Goravel") } diff --git a/session/session_test.go b/session/session_test.go index 143cd8570..3ceac20d2 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -165,9 +165,10 @@ func (s *SessionTestSuite) TestMigrate() { // when driver is nil oldID = s.session.GetID() - s.driver.On("Destroy", s.session.GetID()).Return(nil).Once() + s.driver.On("Destroy", oldID).Return(nil).Once() s.session.SetDriver(nil) s.Nil(s.session.migrate(true)) + s.NotEqual(oldID, s.session.GetID()) } func (s *SessionTestSuite) TestMissing() { From 54305c54a448e22757430e2c4d52a521d5eb875a Mon Sep 17 00:00:00 2001 From: Bowen Date: Fri, 4 Oct 2024 08:02:42 +0800 Subject: [PATCH 5/5] fix test --- database/orm.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/database/orm.go b/database/orm.go index 312009b06..1e297c293 100644 --- a/database/orm.go +++ b/database/orm.go @@ -63,16 +63,16 @@ func (r *Orm) Connection(name string) contractsorm.Orm { return NewOrm(r.ctx, r.config, name, instance, r.queries, r.log, r.refresh) } - queue, err := gorm.BuildQuery(r.ctx, r.config, name, r.log) - if err != nil || queue == nil { + query, err := gorm.BuildQuery(r.ctx, r.config, name, r.log) + if err != nil || query == nil { r.log.Errorf("[Orm] Init %s connection error: %v", name, err) return NewOrm(r.ctx, r.config, name, nil, r.queries, r.log, r.refresh) } - r.queries[name] = queue + r.queries[name] = query - return NewOrm(r.ctx, r.config, name, queue, r.queries, r.log, r.refresh) + return NewOrm(r.ctx, r.config, name, query, r.queries, r.log, r.refresh) } func (r *Orm) DB() (*sql.DB, error) {