arimelody.me/db.go

98 lines
2.8 KiB
Go
Raw Normal View History

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
}