diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a5a8afd --- /dev/null +++ b/go.mod @@ -0,0 +1,15 @@ +module git.m3d.pw/majomi/mmm + +go 1.22.4 + +require ( + github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8 + github.com/jackc/pgx/v5 v5.6.0 +) + +require ( + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/text v0.14.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..cfd5f77 --- /dev/null +++ b/go.sum @@ -0,0 +1,30 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8 h1:OtSeLS5y0Uy01jaKK4mA/WVIYtpzVm63vLVAPzJXigg= +github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8/go.mod h1:apkPC/CR3s48O2D7Y++n1XWEpgPNNCjXYga3PPbJe2E= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/db/db.go b/internal/db/db.go new file mode 100644 index 0000000..5b8c8f5 --- /dev/null +++ b/internal/db/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.26.0 + +package db + +import ( + "context" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +type DBTX interface { + Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) + Query(context.Context, string, ...interface{}) (pgx.Rows, error) + QueryRow(context.Context, string, ...interface{}) pgx.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx pgx.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/db/migrations/20240630143204_init.down.sql b/internal/db/migrations/20240630143204_init.down.sql new file mode 100644 index 0000000..e69de29 diff --git a/internal/db/migrations/20240630143204_init.up.sql b/internal/db/migrations/20240630143204_init.up.sql new file mode 100644 index 0000000..f3d70ae --- /dev/null +++ b/internal/db/migrations/20240630143204_init.up.sql @@ -0,0 +1,26 @@ +CREATE TABLE IF NOT EXISTS track +( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + path TEXT UNIQUE NOT NULL, + album_artist TEXT NOT NULL, + title TEXT NOT NULL, + album TEXT NOT NULL, + disc INTEGER[][], + year INTEGER NOT NULL, + artist TEXT NOT NULL, + genre TEXT NOT NULL, + lyrics TEXT NOT NULL, + composer TEXT NOT NULL +); +-- +-- CREATE TABLE IF NOT EXISTS album +-- ( +-- id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, +-- path TEXT UNIQUE +-- ); + +CREATE TABLE IF NOT EXISTS artist +( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + name TEXT UNIQUE +); \ No newline at end of file diff --git a/internal/db/models.go b/internal/db/models.go new file mode 100644 index 0000000..3d27784 --- /dev/null +++ b/internal/db/models.go @@ -0,0 +1,33 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.26.0 + +package db + +import ( + "github.com/jackc/pgx/v5/pgtype" +) + +type Album struct { + ID int64 + Path pgtype.Text +} + +type Artist struct { + ID int64 + Name pgtype.Text +} + +type Track struct { + ID int64 + Path string + AlbumArtist string + Title string + Album string + Disc [][]int32 + Year int32 + Artist string + Genre string + Lyrics string + Composer string +} diff --git a/internal/db/querier.go b/internal/db/querier.go new file mode 100644 index 0000000..e819706 --- /dev/null +++ b/internal/db/querier.go @@ -0,0 +1,18 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.26.0 + +package db + +import ( + "context" +) + +type Querier interface { + AddTrack(ctx context.Context, arg AddTrackParams) (Track, error) + Exists(ctx context.Context, path string) (bool, error) + GetAlbumTracks(ctx context.Context, album string) ([]Track, error) + GetTrackByID(ctx context.Context, id int64) (Track, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/db/queries/track.sql b/internal/db/queries/track.sql new file mode 100644 index 0000000..c7d7dc5 --- /dev/null +++ b/internal/db/queries/track.sql @@ -0,0 +1,25 @@ +-- name: GetTrackByID :one +SELECT * +FROM track +WHERE id = $1 +LIMIT 1; + +-- name: AddTrack :one +INSERT INTO track (path, album_artist, title, album, disc, year, artist, genre, lyrics, composer) +VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) +ON CONFLICT DO NOTHING +RETURNING *; + +INSERT INTO artist(name) +VALUES ($1); + +-- name: GetAlbumTracks :many +SELECT * +FROM track +WHERE album = $1 +ORDER BY track.title; + +-- name: Exists :one +SELECT EXISTS (SELECT 1 + FROM track + WHERE path = $1) as exists; \ No newline at end of file diff --git a/internal/db/track.sql.go b/internal/db/track.sql.go new file mode 100644 index 0000000..fca2f30 --- /dev/null +++ b/internal/db/track.sql.go @@ -0,0 +1,138 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.26.0 +// source: track.sql + +package db + +import ( + "context" +) + +const addTrack = `-- name: AddTrack :one +INSERT INTO track (path, album_artist, title, album, disc, year, artist, genre, lyrics, composer) +VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) +ON CONFLICT DO NOTHING +RETURNING id, path, album_artist, title, album, disc, year, artist, genre, lyrics, composer +` + +type AddTrackParams struct { + Path string + AlbumArtist string + Title string + Album string + Disc [][]int32 + Year int32 + Artist string + Genre string + Lyrics string + Composer string +} + +func (q *Queries) AddTrack(ctx context.Context, arg AddTrackParams) (Track, error) { + row := q.db.QueryRow(ctx, addTrack, + arg.Path, + arg.AlbumArtist, + arg.Title, + arg.Album, + arg.Disc, + arg.Year, + arg.Artist, + arg.Genre, + arg.Lyrics, + arg.Composer, + ) + var i Track + err := row.Scan( + &i.ID, + &i.Path, + &i.AlbumArtist, + &i.Title, + &i.Album, + &i.Disc, + &i.Year, + &i.Artist, + &i.Genre, + &i.Lyrics, + &i.Composer, + ) + return i, err +} + +const exists = `-- name: Exists :one +SELECT EXISTS (SELECT 1 + FROM track + WHERE path = $1) as exists +` + +func (q *Queries) Exists(ctx context.Context, path string) (bool, error) { + row := q.db.QueryRow(ctx, exists, path) + var exists bool + err := row.Scan(&exists) + return exists, err +} + +const getAlbumTracks = `-- name: GetAlbumTracks :many +SELECT id, path, album_artist, title, album, disc, year, artist, genre, lyrics, composer +FROM track +WHERE album = $1 +ORDER BY track.title +` + +func (q *Queries) GetAlbumTracks(ctx context.Context, album string) ([]Track, error) { + rows, err := q.db.Query(ctx, getAlbumTracks, album) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Track + for rows.Next() { + var i Track + if err := rows.Scan( + &i.ID, + &i.Path, + &i.AlbumArtist, + &i.Title, + &i.Album, + &i.Disc, + &i.Year, + &i.Artist, + &i.Genre, + &i.Lyrics, + &i.Composer, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getTrackByID = `-- name: GetTrackByID :one +SELECT id, path, album_artist, title, album, disc, year, artist, genre, lyrics, composer +FROM track +WHERE id = $1 +LIMIT 1 +` + +func (q *Queries) GetTrackByID(ctx context.Context, id int64) (Track, error) { + row := q.db.QueryRow(ctx, getTrackByID, id) + var i Track + err := row.Scan( + &i.ID, + &i.Path, + &i.AlbumArtist, + &i.Title, + &i.Album, + &i.Disc, + &i.Year, + &i.Artist, + &i.Genre, + &i.Lyrics, + &i.Composer, + ) + return i, err +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..fe7f767 --- /dev/null +++ b/main.go @@ -0,0 +1,5 @@ +package main + +func main() { + +} diff --git a/sqlc.yaml b/sqlc.yaml new file mode 100644 index 0000000..3a05364 --- /dev/null +++ b/sqlc.yaml @@ -0,0 +1,11 @@ +version: "2" +sql: + - engine: "postgresql" + queries: "internal/db/queries" + schema: "internal/db/migrations" + gen: + go: + package: "db" + out: "internal/db" + sql_package: "pgx/v5" + emit_interface: true diff --git a/table.sql b/table.sql new file mode 100644 index 0000000..e69de29