package main import ( "arimelody.me/arimelody.me/api/v1/music" "fmt" "os" "time" _ "github.com/lib/pq" "github.com/jmoiron/sqlx" ) var schema = `CREATE TABLE IF NOT EXISTS Artists ( id TEXT PRIMARY KEY, name TEXT, website TEXT ); CREATE TABLE IF NOT EXISTS Albums ( id VARCHAR(64) PRIMARY KEY, title TEXT NOT NULL, type TEXT, release_date DATE NOT NULL, artwork TEXT, buyname TEXT, buylink TEXT, description TEXT, lyrics TEXT ); CREATE TABLE IF NOT EXISTS AlbumLinks ( album VARCHAR(64) REFERENCES Albums(id) ON DELETE CASCADE ON UPDATE CASCADE, name TEXT, url TEXT, CONSTRAINT albumlinks_pk PRIMARY KEY (album, name) ); CREATE TABLE IF NOT EXISTS AlbumCredits ( album VARCHAR(64) REFERENCES Albums(ID) ON DELETE CASCADE, artist TEXT REFERENCES Artists(id) ON DELETE CASCADE, role TEXT, meta BOOLEAN, constraint albumcredits_pk PRIMARY KEY (album, artist, role) );` func PushArtist(db *sqlx.DB, artist music.Artist) { fmt.Printf("syncing artist [%s] to database...", artist.Name) db.MustExec("INSERT INTO artists (id, name, website) VALUES ($1, $2, $3) ON CONFLICT (id) DO UPDATE SET name=$2, website=$3", &artist.Id, &artist.Name, &artist.Website, ) fmt.Printf("done!\n") } func PushAlbum(db *sqlx.DB, album music.Album) { fmt.Printf("syncing album [%s] to database...", album.Id) tx := db.MustBegin() tx.MustExec("INSERT INTO albums (id, title, release_date, artwork, buyname, buylink, description, lyrics) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) "+ "ON CONFLICT (id) DO UPDATE SET title=$2, release_date=$3, artwork=$4, buyname=$5, buylink=$6, description=$7, lyrics=$8", &album.Id, &album.Title, album.ReleaseDate.Format("2-Jan-2006"), &album.Artwork, &album.Buyname, &album.Buylink, &album.Description, &album.Lyrics) for _, link := range album.Links { tx.MustExec("INSERT INTO albumlinks (album, name, url) VALUES ($1, $2, $3) ON CONFLICT (album, name) DO UPDATE SET url=$3", &album.Id, &link.Name, &link.Url) } for _, credit := range album.Credits { tx.MustExec("INSERT INTO albumcredits (album, artist, role, meta) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING", &album.Id, &credit.Artist.Id, &credit.Role, &credit.Meta) } tx.Commit() fmt.Printf("done!\n") } func InitDatabase() *sqlx.DB { db, err := sqlx.Connect("postgres", "user=arimimi dbname=arimelody password=fuckingpassword sslmode=disable") if err != nil { fmt.Fprintf(os.Stderr, "unable to create database connection pool: %v\n", err) os.Exit(1) } db.SetConnMaxLifetime(time.Minute * 3) db.SetMaxOpenConns(10) db.SetMaxIdleConns(10) db.MustExec(schema) fmt.Printf("database schema synchronised.\n") return db }