package database import ( "time" "git.ohea.xyz/cursorius/server/config" "context" "fmt" "github.com/jackc/pgx/v5" "github.com/op/go-logging" ) var log = logging.MustGetLogger("cursorius-server") func LaunchDB(conf config.DBConfig) error { dbURL := fmt.Sprintf( "postgres://%v:%v@%v:%v/%v", conf.Username, conf.Password, conf.Address, conf.Port, conf.Name, ) dbURLNoPasswd := fmt.Sprintf( "postgres://%v:********@%v:%v/%v", conf.Username, conf.Address, conf.Port, conf.Name, ) log.Infof("Connecting to database with URL \"%v\"", dbURLNoPasswd) var conn *pgx.Conn var err error for i := 0; i < 10; i++ { conn, err = pgx.Connect(context.Background(), dbURL) if err == nil { defer conn.Close(context.Background()) break } time.Sleep(2 * time.Second) } if err != nil { return fmt.Errorf("Could not open database: %w", err) } versionTableExistsQuery := ` SELECT EXISTS ( SELECT FROM pg_tables WHERE tablename = 'version' );` var versionTableExists bool err = conn.QueryRow(context.Background(), versionTableExistsQuery).Scan(&versionTableExists) if err != nil { return fmt.Errorf("Could not check if database was initalized: %w", err) } if versionTableExists { // TODO: migrations } else { err = initDB(conn) if err != nil { return fmt.Errorf("Could not initalize database: %w", err) } } return nil } func initDB(conn *pgx.Conn) error { createTablesQuery := ` CREATE TABLE version ( version INT NOT NULL ); CREATE TABLE pipelines ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, url TEXT NOT NULL, poll_interval INTEGER ); CREATE TABLE webhooks ( id SERIAL PRIMARY KEY, type TEXT, secret TEXT, pipeline INTEGER, CONSTRAINT fk_pipeline FOREIGN KEY(pipeline) REFERENCES pipelines(id) ); CREATE TABLE runners ( id SERIAL PRIMARY KEY, name TEXT, secret TEXT );` _, err := conn.Exec(context.Background(), createTablesQuery) if err != nil { return err } return nil }