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 days that still need episodes numbers rows, err := tx.Query(` select v.upload_date, ifnull( (select max(episode) from videos where upload_date = v.upload_date), substr(upload_date, 6, 2) || substr(upload_date, 9, 2) || '00') from videos v where episode is null group by upload_date`) 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 uploadDate string var lastEpisode int err = rows.Scan(&uploadDate, &lastEpisode) log.Printf("Last episode for %s is %d", uploadDate, 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 upload_date = ? and episode is null order by run, id desc", uploadDate) 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 }