# Apply Supplementary Indexes Migration to PostgreSQL Database Write-Host "========================================" -ForegroundColor Cyan Write-Host "Apply Supplementary Indexes Migration" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "" # Configuration $connectionString = "Host=localhost;Port=5432;Database=jellyfin_testsdata;Username=jellyfin;Password=YOUR_PASSWORD" $migrationName = "AddSupplementaryIndexes" Write-Host "Step 1: Build the solution" -ForegroundColor Yellow Write-Host "This ensures the migration is compiled..." -ForegroundColor Gray dotnet build src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres\Jellyfin.Database.Providers.Postgres.csproj if ($LASTEXITCODE -ne 0) { Write-Host "❌ Build failed. Please fix compilation errors." -ForegroundColor Red exit 1 } Write-Host "✓ Build successful" -ForegroundColor Green Write-Host "" Write-Host "Step 2: Check current database state" -ForegroundColor Yellow Write-Host "Connecting to jellyfin_testsdata..." -ForegroundColor Gray # Test database connection try { $testQuery = @" SELECT EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_schema = 'library' AND table_name = 'BaseItems' ) as table_exists; "@ $result = psql -U jellyfin -d jellyfin_testsdata -t -c $testQuery 2>&1 if ($LASTEXITCODE -eq 0) { Write-Host "✓ Database connection successful" -ForegroundColor Green } else { Write-Host "❌ Database connection failed" -ForegroundColor Red Write-Host "Error: $result" -ForegroundColor Red Write-Host "" Write-Host "Please ensure:" -ForegroundColor Yellow Write-Host " 1. PostgreSQL is running" -ForegroundColor Gray Write-Host " 2. Database 'jellyfin_testsdata' exists" -ForegroundColor Gray Write-Host " 3. Credentials are correct" -ForegroundColor Gray exit 1 } } catch { Write-Host "❌ Failed to test database connection: $_" -ForegroundColor Red exit 1 } Write-Host "" Write-Host "Step 3: Check for existing indexes" -ForegroundColor Yellow Write-Host "Checking which supplementary indexes already exist..." -ForegroundColor Gray $checkIndexQuery = @" SELECT indexname, CASE WHEN indexname IS NOT NULL THEN 'EXISTS' ELSE 'MISSING' END as status FROM ( VALUES ('idx_baseitems_type_isvirtualitem_topparentid'), ('idx_baseitems_topparentid_isfolder'), ('idx_baseitems_datecreated_filtered'), ('idx_itemvaluesmap_itemvalueid_itemid'), ('idx_activitylogs_userid_datecreated') ) AS wanted(indexname) LEFT JOIN pg_indexes ON pg_indexes.indexname = wanted.indexname ORDER BY wanted.indexname; "@ $indexStatus = psql -U jellyfin -d jellyfin_testsdata -c $checkIndexQuery Write-Host $indexStatus Write-Host "" Write-Host "Step 4: Apply migration using EF Core" -ForegroundColor Yellow Write-Host "This will create any missing indexes..." -ForegroundColor Gray # Option 1: Use dotnet ef (if you have it installed) Write-Host "" Write-Host "Choose migration method:" -ForegroundColor Cyan Write-Host "1. Use dotnet ef database update (requires dotnet-ef tool)" -ForegroundColor White Write-Host "2. Use SQL script generation" -ForegroundColor White Write-Host "3. Apply SQL directly (recommended)" -ForegroundColor White Write-Host "" $choice = Read-Host "Enter your choice (1, 2, or 3)" switch ($choice) { "1" { Write-Host "Applying migration using dotnet ef..." -ForegroundColor Yellow $env:ConnectionStrings__DefaultConnection = $connectionString dotnet ef database update --project src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres\Jellyfin.Database.Providers.Postgres.csproj if ($LASTEXITCODE -eq 0) { Write-Host "✓ Migration applied successfully" -ForegroundColor Green } else { Write-Host "❌ Migration failed" -ForegroundColor Red } } "2" { Write-Host "Generating SQL script..." -ForegroundColor Yellow dotnet ef migrations script --project src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres\Jellyfin.Database.Providers.Postgres.csproj --output sql\migration_supplementary_indexes.sql if ($LASTEXITCODE -eq 0) { Write-Host "✓ SQL script generated at: sql\migration_supplementary_indexes.sql" -ForegroundColor Green Write-Host "" Write-Host "To apply, run:" -ForegroundColor Yellow Write-Host "psql -U jellyfin -d jellyfin_testsdata -f sql\migration_supplementary_indexes.sql" -ForegroundColor White } else { Write-Host "❌ Script generation failed" -ForegroundColor Red } } "3" { Write-Host "Applying SQL directly..." -ForegroundColor Yellow # Apply the SQL from the schema_init script psql -U jellyfin -d jellyfin_testsdata -f sql\schema_init\10_create_supplementary_indexes.sql if ($LASTEXITCODE -eq 0) { Write-Host "✓ Indexes created successfully" -ForegroundColor Green } else { Write-Host "❌ Index creation failed" -ForegroundColor Red } } default { Write-Host "Invalid choice. Exiting." -ForegroundColor Red exit 1 } } Write-Host "" Write-Host "Step 5: Verify indexes were created" -ForegroundColor Yellow $verifyQuery = @" SELECT schemaname, tablename, indexname, pg_size_pretty(pg_relation_size(indexrelid)) as size FROM pg_indexes JOIN pg_stat_user_indexes USING (schemaname, tablename, indexname) WHERE indexname IN ( 'idx_baseitems_type_isvirtualitem_topparentid', 'idx_baseitems_topparentid_isfolder', 'idx_baseitems_datecreated_filtered', 'idx_itemvaluesmap_itemvalueid_itemid', 'idx_activitylogs_userid_datecreated' ) ORDER BY schemaname, tablename, indexname; "@ $verification = psql -U jellyfin -d jellyfin_testsdata -c $verifyQuery Write-Host $verification Write-Host "" Write-Host "========================================" -ForegroundColor Cyan Write-Host "Migration Complete!" -ForegroundColor Green Write-Host "========================================" -ForegroundColor Cyan Write-Host "" Write-Host "Next steps:" -ForegroundColor Yellow Write-Host "1. Restart Jellyfin to clear connection pools" -ForegroundColor White Write-Host "2. Monitor index usage with: psql -U jellyfin -d jellyfin_testsdata -f sql\diagnostics.sql" -ForegroundColor White Write-Host "3. Check performance improvements" -ForegroundColor White Write-Host ""