package database import ( "context" "fmt" "time" "github.com/scroll-tech/go-ethereum/log" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/utils" ) type gormLogger struct { gethLogger log.Logger } func (g *gormLogger) LogMode(level logger.LogLevel) logger.Interface { return g } func (g *gormLogger) Info(_ context.Context, msg string, data ...interface{}) { infoMsg := fmt.Sprintf(msg, data...) g.gethLogger.Info("gorm", "info message", infoMsg) } func (g *gormLogger) Warn(_ context.Context, msg string, data ...interface{}) { warnMsg := fmt.Sprintf(msg, data...) g.gethLogger.Warn("gorm", "warn message", warnMsg) } func (g *gormLogger) Error(_ context.Context, msg string, data ...interface{}) { errMsg := fmt.Sprintf(msg, data...) g.gethLogger.Error("gorm", "err message", errMsg) } func (g *gormLogger) Trace(_ context.Context, begin time.Time, fc func() (string, int64), err error) { elapsed := time.Since(begin) sql, rowsAffected := fc() g.gethLogger.Debug("gorm", "line", utils.FileWithLineNum(), "cost", elapsed, "sql", sql, "rowsAffected", rowsAffected, "err", err) } // InitDB init the db handler func InitDB(config *Config) (*gorm.DB, error) { tmpGormLogger := gormLogger{ gethLogger: log.Root(), } db, err := gorm.Open(postgres.Open(config.DSN), &gorm.Config{ Logger: &tmpGormLogger, }) if err != nil { return nil, err } sqlDB, err := db.DB() if err != nil { return nil, err } sqlDB.SetMaxOpenConns(config.MaxOpenNum) sqlDB.SetMaxIdleConns(config.MaxIdleNum) if err = sqlDB.Ping(); err != nil { return nil, err } return db, nil } // CloseDB close the db handler. notice the db handler only can close when then program exit. func CloseDB(db *gorm.DB) error { sqlDB, err := db.DB() if err != nil { return err } if err := sqlDB.Close(); err != nil { return err } return nil }