blob: 6dca8624e41f731b6a4f32c60b131b11dd0a82ce [file] [log] [blame]
package runner
import (
"fmt"
"os/user"
"time"
"github.com/merico-dev/lake/models/domainlayer/code"
"github.com/merico-dev/lake/models/domainlayer/crossdomain"
"github.com/merico-dev/lake/models/domainlayer/devops"
"github.com/merico-dev/lake/models/domainlayer/ticket"
"github.com/merico-dev/lake/plugins/core"
"github.com/spf13/viper"
"gorm.io/driver/mysql"
"gorm.io/gorm"
gormLogger "gorm.io/gorm/logger"
)
func NewGormDb(config *viper.Viper, logger core.Logger) (*gorm.DB, error) {
dbUrl := config.GetString("DB_URL")
if dbUrl == "" {
return nil, fmt.Errorf("DB_URL is required")
}
dbLoggingLevel := gormLogger.Error
switch config.GetString("DB_LOGGING_LEVEL") {
case "Silent":
dbLoggingLevel = gormLogger.Silent
case "Warn":
dbLoggingLevel = gormLogger.Warn
case "Info":
dbLoggingLevel = gormLogger.Info
}
idleConns := config.GetInt("DB_IDLE_CONNS")
if idleConns <= 0 {
idleConns = 10
}
dbMaxOpenConns := config.GetInt("DB_MAX_CONNS")
if dbMaxOpenConns <= 0 {
dbMaxOpenConns = 100
}
db, err := gorm.Open(mysql.Open(dbUrl), &gorm.Config{
Logger: gormLogger.New(
logger,
gormLogger.Config{
SlowThreshold: time.Second, // Slow SQL threshold
LogLevel: dbLoggingLevel, // Log level
IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
Colorful: true, // Disable color
},
),
// most of our operation are in batch, this can improve performance
PrepareStmt: true,
})
if err != nil {
return nil, err
}
sqlDB, err := db.DB()
if err != nil {
return nil, err
}
sqlDB.SetMaxIdleConns(idleConns)
sqlDB.SetMaxOpenConns(dbMaxOpenConns)
sqlDB.SetConnMaxLifetime(time.Hour)
return db, err
}
func MigrateDb(db *gorm.DB) error {
// domain layer entity
return db.AutoMigrate(
&user.User{},
&code.Repo{},
&code.Commit{},
&code.CommitParent{},
&code.PullRequest{},
&code.PullRequestCommit{},
&code.PullRequestLabel{},
&code.Note{},
&code.RepoCommit{},
&code.Ref{},
&code.RefsCommitsDiff{},
&code.CommitFile{},
&code.PullRequestComment{},
&ticket.Board{},
&ticket.Issue{},
&ticket.IssueLabel{},
&ticket.BoardIssue{},
&ticket.BoardSprint{},
&ticket.Changelog{},
&ticket.Sprint{},
&ticket.SprintIssue{},
&ticket.IssueStatusHistory{},
&ticket.IssueSprintsHistory{},
&ticket.IssueAssigneeHistory{},
&devops.Job{},
&devops.Build{},
&ticket.IssueWorklog{},
&ticket.IssueComment{},
&crossdomain.BoardRepo{},
&crossdomain.PullRequestIssue{},
&crossdomain.IssueCommit{},
&crossdomain.IssueRepoCommit{},
&crossdomain.RefsIssuesDiffs{},
&code.RefsPrCherrypick{},
)
}