65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
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 v.year, max((select max(episode) from videos where year = v.year)) from videos v 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
|
|
}
|