package db import ( "database/sql" "fmt" "github.com/jmoiron/sqlx" "log" "os" "gitea.deepak.science/deepak/gogmagog/config" "gitea.deepak.science/deepak/gogmagog/models" "gitea.deepak.science/deepak/gogmagog/util" "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" ) type postgresStore struct { db *sqlx.DB } // GetStore provides a store to back the model based on a postgres connection. func GetStore(dbConf *config.DBConfig) models.Store { if dbConf.Type != "postgres" { log.Fatalf("Unsupported database type: " + dbConf.Type) os.Exit(1) } 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.Fatal("Could not connect to database: \n", err) os.Exit(1) } db := sqlx.NewDb(tmp, "pgx") if err := db.Ping(); err != nil { log.Fatal("database ping failed\n", err) os.Exit(1) } driver, err := postgres.WithInstance(tmp, &postgres.Config{}) if err != nil { log.Fatal("Could not create driver for db migration", err) os.Exit(1) } m, err := migrate.NewWithDatabaseInstance("file://db/migrations", "postgres", driver) if err != nil { log.Fatal("Could not perform migration", err) os.Exit(1) } if err := m.Up(); err != nil && err != migrate.ErrNoChange { log.Fatalf("An error occurred while syncing the database.. %v", err) } db.MapperFunc(util.ToSnake) return &postgresStore{db: db} } func (store *postgresStore) SelectActions() ([]*models.Action, error) { actions := make([]*models.Action, 0) err := store.db.Select(&actions, "SELECT action_id, action_description, created_at, updated_at FROM actions") if err != nil { return nil, err } return actions, nil } func (store *postgresStore) SelectPlans() ([]*models.Plan, error) { plans := make([]*models.Plan, 0) err := store.db.Select(&plans, "SELECT plan_id, plan_date FROM plans") if err != nil { return nil, err } return plans, nil }