KDOC 56: flagrのコードを読んだメモ

openflagr/flagrを読んだメモ。バックエンドはGoで書かれている。

DB初期化部分

グローバル変数にdb取得関数がある。

var getDB = entity.GetDB

変数の中身となる関数。

// GetDB gets the db singleton
func GetDB() *gorm.DB {
	singletonOnce.Do(func() {
		db, err := connectDB()
		if err != nil {
			if config.Config.DBConnectionDebug {
				logrus.WithField("err", err).Fatal("failed to connect to db")
			} else {
				logrus.Fatal("failed to connect to db")
			}
		}
		db.AutoMigrate(AutoMigrateTables...)
		singletonDB = db
	})

	return singletonDB
}

データベース分岐部分

データベース分岐している箇所。

err = retry.Do( func() error { switch config.Config.DBDriver { case “postgres”: db, err = gorm.Open(postgres.Open(config.Config.DBConnectionStr), &gorm.Config{ Logger: logger, }) case “sqlite3”: db, err = gorm.Open(sqlite.Open(config.Config.DBConnectionStr), &gorm.Config{ Logger: logger, }) case “mysql”: db, err = gorm.Open(mysql.Open(config.Config.DBConnectionStr), &gorm.Config{ Logger: logger, }) } return err }, retry.Attempts(config.Config.DBConnectionRetryAttempts), retry.Delay(config.Config.DBConnectionRetryDelay), )

各データベースによる結合テスト

sqlite, mysql, postgresによる結合テストをしている。

start() { start_test flagr_with_sqlite start_test flagr_with_mysql start_test flagr_with_mysql8 start_test flagr_with_postgres9 start_test flagr_with_postgres13

start_test checkr_flagr_with_sqlite }