Add basic postgres db config
This commit is contained in:
+113
@@ -0,0 +1,113 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user