package store import ( "database/sql" "fmt" "github.com/jmoiron/sqlx" "log" "gitea.deepak.science/deepak/gogmagog/config" "gitea.deepak.science/deepak/gogmagog/models" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/postgres" // Blank imports to provide drivers. _ "github.com/golang-migrate/migrate/v4/source/file" _ "github.com/jackc/pgx/v4/stdlib" ) // GetStore provides a store to back the model based on a postgres connection. func GetStore(dbConf *config.DBConfig) (models.Store, error) { if dbConf.Type == "postgres" { db, err := createPostgresDB(dbConf) if err != nil { return nil, err } return GetPostgresStore(db) } return nil, fmt.Errorf("Unsupported database type: %v", dbConf.Type) } func createPostgresDB(dbConf *config.DBConfig) (*sqlx.DB, error) { connStr := fmt.Sprintf("user=%s password=%s host=%s port=%s database=%s sslmode=disable", dbConf.User, dbConf.Password, dbConf.Host, dbConf.Port, dbConf.Database) tmp, err := sql.Open("pgx", connStr) if err != nil { log.Print("Could not connect to database: \n", err) return nil, err } db := sqlx.NewDb(tmp, "pgx") if err := db.Ping(); err != nil { log.Print("database ping failed\n", err) return nil, err } driver, err := postgres.WithInstance(db.DB, &postgres.Config{}) if err != nil { log.Print("Could not create driver for db migration", err) return nil, err } m, err := migrate.NewWithDatabaseInstance("file://store/migrations", "postgres", driver) if err != nil { log.Print("Could not perform migration", err) return nil, err } if err := m.Up(); err != nil { if err == migrate.ErrNoChange { log.Print("No migration needed.") } else { log.Printf("An error occurred while syncing the database.. %v", err) return nil, err } } return db, nil }