package main import ( "database/sql" "fmt" "log" ) func CalculateEpisodeNumbers(db *sql.DB) error { log.Printf("Calculating episode numbers") // Start a transaction tx, err := db.Begin() if err != nil { return fmt.Errorf("error starting transaction: %w", err) } defer tx.Rollback() // First find all years that still need episodes numbers rows, err := tx.Query("select year, max((select max(episode) from videos where year = year)) from videos where episode is null group by year") if err != nil { return fmt.Errorf("error retrieving rows: %w", err) } // Loop over each year and set the missing episode numbers for rows.Next() { var year, lastEpisode int err = rows.Scan(&year, &lastEpisode) log.Printf("Last episode is %d", lastEpisode) if err != nil { return fmt.Errorf("error getting row: %w", err) } // Find all episodes that need updating episodes, err := tx.Query("select id from videos where year = ? and episode is null order by run, id desc", year) if err != nil { return fmt.Errorf("error retrieving episodes: %w", err) } // Update each episode for episodes.Next() { var episodeId int err = episodes.Scan(&episodeId) if err != nil { return fmt.Errorf("error retrieving episode id: %w", err) } // Set the episode ID lastEpisode++ _, err = tx.Exec("update videos set episode = ? where id = ?", &lastEpisode, &episodeId) if err != nil { return fmt.Errorf("error updating episode id: %w", err) } } } // Commit all changes err = tx.Commit() if err != nil { return fmt.Errorf("error commiting changes: %w", err) } return nil }