package main import ( "database/sql" _ "embed" "encoding/base64" "encoding/json" "errors" "fmt" ) //go:embed mm.cred var mmDbCred string func GetMmConnString() (string, error) { pw, err := base64.StdEncoding.DecodeString(mmDbCred) if err != nil { return "", err } return fmt.Sprintf("%s:%s@tcp(%s)/moviemanager?parseTime=true", *mmDbUser, pw, *mmDbServer), err } func MmReadOracle() ([]MmOracle, error) { key := "oracle" var oracles []MmOracle data, err := mmCache.Get(key) if err == nil { err = json.Unmarshal(data, &oracles) if err == nil { return oracles, err } } if mmDb == nil { return oracles, errors.New("no DB connection") } oracleQuery := `SELECT m.id, m.title, m.mal_id, COALESCE(SUM(pv.score), 0) AS avgScore FROM movie m JOIN vote pv ON (m.id = pv.movie_id) JOIN promise pp ON (pp.user_id = pv.user_id) JOIN evening me ON (pp.evening_id = me.id) WHERE m.id NOT IN ( SELECT m2.id FROM movie m2 JOIN evening_movie em2 ON (m2.id = em2.movie_id) JOIN evening e2 ON (em2.evening_id = e2.id) WHERE e2.date < CURDATE() ) AND ( m.id IN ( SELECT mm.movie_source FROM movie m3 JOIN movie_movie mm ON (m3.id = mm.movie_target) JOIN evening_movie em3 ON (mm.movie_target = em3.movie_id) JOIN evening e3 ON (em3.evening_id = e3.id) WHERE e3.date < CURDATE() GROUP BY m3.id ) OR m.id NOT IN ( SELECT mm.movie_source FROM movie m4 JOIN movie_movie mm ON (m4.id = mm.movie_source) ) ) AND pp.promised = 1 AND m.aired = 1 AND me.date >= CURDATE() AND me.date < DATE_ADD(CURDATE(), INTERVAL 1 WEEK) GROUP BY m.id ORDER BY avgScore DESC, m.id ASC;` rows, err := mmDb.Query(oracleQuery) if err != nil { return nil, err } defer rows.Close() oracles = make([]MmOracle, 0) for rows.Next() { var oracle MmOracle var qMalId sql.NullInt64 err = rows.Scan(&oracle.Id, &oracle.Title, &qMalId, &oracle.AvgScore) if err != nil { return oracles, err } if qMalId.Valid { oracle.Anime = qMalId.Int64 } oracles = append(oracles, oracle) } err = rows.Err() if err == nil { bytes, err := json.Marshal(oracles) if err == nil { mmCache.Set(key, bytes) } } return oracles, err } func MmReadCharts() ([]MmOracle, error) { if mmDb == nil { return nil, errors.New("no DB connection") } chartsQuery := `SELECT m.id, m.title, m.mal_id FROM movie m JOIN evening_movie em ON em.movie_id = m.id JOIN evening e ON em.evening_id = e.id WHERE e.date <= CURDATE() AND m.mal_id IS NOT NULL;` rows, err := mmDb.Query(chartsQuery) if err != nil { return nil, err } defer rows.Close() charts := make([]MmOracle, 0) for rows.Next() { var chart MmOracle err = rows.Scan(&chart.Id, &chart.Title, &chart.Anime) if err != nil { return charts, err } charts = append(charts, chart) } err = rows.Err() return charts, err }