45 lines
1.0 KiB
Go
45 lines
1.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"regexp"
|
|
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
|
|
"github.com/sundynix/pets-be/internal/config"
|
|
)
|
|
|
|
var databaseName = regexp.MustCompile(`^[a-zA-Z0-9_-]+$`)
|
|
|
|
// dbinit creates the configured PostgreSQL database once. It does not change other databases.
|
|
func main() {
|
|
cfg, err := config.Load()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
name := cfg.Postgres.Database
|
|
if !databaseName.MatchString(name) {
|
|
log.Fatal("invalid database name")
|
|
}
|
|
maintenance := cfg.Postgres
|
|
maintenance.Database = "postgres"
|
|
db, err := gorm.Open(postgres.Open(maintenance.DSN()), &gorm.Config{})
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
var count int64
|
|
if err := db.Raw("SELECT count(*) FROM pg_database WHERE datname = ?", name).Scan(&count).Error; err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
if count > 0 {
|
|
log.Printf("database %s already exists", name)
|
|
return
|
|
}
|
|
if err := db.Exec(fmt.Sprintf("CREATE DATABASE \"%s\"", name)).Error; err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Printf("created database %s", name)
|
|
}
|