feat(db/m7-art-providers): migration 0020 + provider-hash queries
Relaxes the artists/albums art_source CHECK constraints to allow the new 'deezer' and 'lastfm' source values alongside the existing accepted set. Adds cover_art_sources_meta.last_registered_providers_hash for the boot-time auto-bump detection: when the registered-provider set changes between deploys, we bump current_version once so 'none' rows become eligible for retry against the new chain. Two sqlc queries added: GetCoverArtProvidersHash reads the stored hash; BumpVersionAndSetProvidersHash atomically increments the version and stores a new hash, returning the new version. Both used by the boot logic in a later task.
This commit is contained in:
@@ -27,6 +27,38 @@ func (q *Queries) BumpSourcesVersion(ctx context.Context) (int32, error) {
|
|||||||
return current_version, err
|
return current_version, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bumpVersionAndSetProvidersHash = `-- name: BumpVersionAndSetProvidersHash :one
|
||||||
|
UPDATE cover_art_sources_meta
|
||||||
|
SET current_version = current_version + 1,
|
||||||
|
last_registered_providers_hash = $1
|
||||||
|
WHERE id = true
|
||||||
|
RETURNING current_version
|
||||||
|
`
|
||||||
|
|
||||||
|
// Atomically increments the version and stores the new provider-set
|
||||||
|
// hash. Called at boot when the registered-provider set has changed
|
||||||
|
// since the last start, so 'none' rows become eligible for retry.
|
||||||
|
// RETURNING gives the new version without a follow-up SELECT.
|
||||||
|
func (q *Queries) BumpVersionAndSetProvidersHash(ctx context.Context, lastRegisteredProvidersHash string) (int32, error) {
|
||||||
|
row := q.db.QueryRow(ctx, bumpVersionAndSetProvidersHash, lastRegisteredProvidersHash)
|
||||||
|
var current_version int32
|
||||||
|
err := row.Scan(¤t_version)
|
||||||
|
return current_version, err
|
||||||
|
}
|
||||||
|
|
||||||
|
const getCoverArtProvidersHash = `-- name: GetCoverArtProvidersHash :one
|
||||||
|
SELECT last_registered_providers_hash
|
||||||
|
FROM cover_art_sources_meta
|
||||||
|
WHERE id = true
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) GetCoverArtProvidersHash(ctx context.Context) (string, error) {
|
||||||
|
row := q.db.QueryRow(ctx, getCoverArtProvidersHash)
|
||||||
|
var last_registered_providers_hash string
|
||||||
|
err := row.Scan(&last_registered_providers_hash)
|
||||||
|
return last_registered_providers_hash, err
|
||||||
|
}
|
||||||
|
|
||||||
const getCurrentSourcesVersion = `-- name: GetCurrentSourcesVersion :one
|
const getCurrentSourcesVersion = `-- name: GetCurrentSourcesVersion :one
|
||||||
SELECT current_version FROM cover_art_sources_meta WHERE id = true
|
SELECT current_version FROM cover_art_sources_meta WHERE id = true
|
||||||
`
|
`
|
||||||
|
|||||||
@@ -253,6 +253,7 @@ type CoverArtProviderSetting struct {
|
|||||||
type CoverArtSourcesMetum struct {
|
type CoverArtSourcesMetum struct {
|
||||||
ID bool
|
ID bool
|
||||||
CurrentVersion int32
|
CurrentVersion int32
|
||||||
|
LastRegisteredProvidersHash string
|
||||||
}
|
}
|
||||||
|
|
||||||
type GeneralLike struct {
|
type GeneralLike struct {
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
-- Restore the prior tighter CHECK constraints (pre-Deezer/Last.fm).
|
||||||
|
-- This will fail if any rows currently have artist_art_source =
|
||||||
|
-- 'deezer' or 'lastfm' (likewise album); operator must clear those
|
||||||
|
-- rows manually before rolling back.
|
||||||
|
|
||||||
|
ALTER TABLE artists DROP CONSTRAINT IF EXISTS artists_artist_art_source_check;
|
||||||
|
ALTER TABLE artists
|
||||||
|
ADD CONSTRAINT artists_artist_art_source_check
|
||||||
|
CHECK (artist_art_source IS NULL
|
||||||
|
OR artist_art_source IN ('theaudiodb','none'));
|
||||||
|
|
||||||
|
ALTER TABLE albums DROP CONSTRAINT IF EXISTS albums_cover_art_source_check;
|
||||||
|
ALTER TABLE albums
|
||||||
|
ADD CONSTRAINT albums_cover_art_source_check
|
||||||
|
CHECK (cover_art_source IS NULL
|
||||||
|
OR cover_art_source IN ('embedded','sidecar','mbcaa','theaudiodb','none'));
|
||||||
|
|
||||||
|
ALTER TABLE cover_art_sources_meta DROP COLUMN IF EXISTS last_registered_providers_hash;
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
-- Relax cover-art and artist-art source CHECK constraints so the new
|
||||||
|
-- Deezer and Last.fm providers (next slice) can persist their IDs as
|
||||||
|
-- accepted source values. Also add the
|
||||||
|
-- last_registered_providers_hash column to cover_art_sources_meta for
|
||||||
|
-- boot-time auto-bump detection (when the registered-provider set
|
||||||
|
-- changes, we bump current_version once so 'none' rows get
|
||||||
|
-- re-eligibled).
|
||||||
|
|
||||||
|
ALTER TABLE artists DROP CONSTRAINT IF EXISTS artists_artist_art_source_check;
|
||||||
|
ALTER TABLE artists
|
||||||
|
ADD CONSTRAINT artists_artist_art_source_check
|
||||||
|
CHECK (artist_art_source IS NULL
|
||||||
|
OR artist_art_source IN ('theaudiodb','deezer','lastfm','none'));
|
||||||
|
|
||||||
|
ALTER TABLE albums DROP CONSTRAINT IF EXISTS albums_cover_art_source_check;
|
||||||
|
ALTER TABLE albums
|
||||||
|
ADD CONSTRAINT albums_cover_art_source_check
|
||||||
|
CHECK (cover_art_source IS NULL
|
||||||
|
OR cover_art_source IN ('embedded','sidecar','mbcaa','theaudiodb','deezer','lastfm','none'));
|
||||||
|
|
||||||
|
ALTER TABLE cover_art_sources_meta
|
||||||
|
ADD COLUMN IF NOT EXISTS last_registered_providers_hash text NOT NULL DEFAULT '';
|
||||||
@@ -44,3 +44,19 @@ UPDATE cover_art_sources_meta
|
|||||||
SET current_version = current_version + 1
|
SET current_version = current_version + 1
|
||||||
WHERE id = true
|
WHERE id = true
|
||||||
RETURNING current_version;
|
RETURNING current_version;
|
||||||
|
|
||||||
|
-- name: GetCoverArtProvidersHash :one
|
||||||
|
SELECT last_registered_providers_hash
|
||||||
|
FROM cover_art_sources_meta
|
||||||
|
WHERE id = true;
|
||||||
|
|
||||||
|
-- name: BumpVersionAndSetProvidersHash :one
|
||||||
|
-- Atomically increments the version and stores the new provider-set
|
||||||
|
-- hash. Called at boot when the registered-provider set has changed
|
||||||
|
-- since the last start, so 'none' rows become eligible for retry.
|
||||||
|
-- RETURNING gives the new version without a follow-up SELECT.
|
||||||
|
UPDATE cover_art_sources_meta
|
||||||
|
SET current_version = current_version + 1,
|
||||||
|
last_registered_providers_hash = $1
|
||||||
|
WHERE id = true
|
||||||
|
RETURNING current_version;
|
||||||
|
|||||||
Reference in New Issue
Block a user