| 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{}, |
| ) |
| } |