def should_schedule(self, game: str, version: int, name: str, schedule: str) -> bool: """ Given a game/version/name pair and a schedule value, return whether this scheduled work is overdue or not. """ if schedule not in ['daily', 'weekly']: raise Exception( 'Logic error, specify either \'daily\' or \'weekly\' for schedule type!' ) sql = ("SELECT year, day FROM scheduled_work " "WHERE game = :game AND version = :version AND " "name = :name AND schedule = :schedule") cursor = self.execute(sql, { 'game': game, 'version': version, 'name': name, 'schedule': schedule }) if cursor.rowcount != 1: # No scheduled work was registered, so time to get going! return True result = cursor.fetchone() if schedule == 'daily': # Just look at the day and year, make sure it matches year, day = Time.days_into_year() if year != result['year']: # Wrong year, so we certainly need to run! return True if day != result['day']: # Wrong day and we're daily, so need to run! return True if schedule == 'weekly': # Find the beginning of the week (Monday), as days since epoch. if Time.week_in_days_since_epoch() != result['day']: # Wrong week, so we should run! return True # We have already run this work for this schedule return False
def mark_scheduled(self, game: str, version: int, name: str, schedule: str) -> None: if schedule not in ['daily', 'weekly']: raise Exception( 'Logic error, specify either \'daily\' or \'weekly\' for schedule type!' ) if schedule == 'daily': year, day = Time.days_into_year() sql = ( "INSERT INTO scheduled_work (game, version, name, schedule, year, day) " + "VALUES (:game, :version, :name, :schedule, :year, :day) " + "ON DUPLICATE KEY UPDATE year=VALUES(year), day=VALUES(day)") self.execute( sql, { 'game': game, 'version': version, 'name': name, 'schedule': schedule, 'year': year, 'day': day, }, ) if schedule == 'weekly': days = Time.week_in_days_since_epoch() sql = ( "INSERT INTO scheduled_work (game, version, name, schedule, day) " + "VALUES (:game, :version, :name, :schedule, :day) " + "ON DUPLICATE KEY UPDATE day=VALUES(day)") self.execute( sql, { 'game': game, 'version': version, 'name': name, 'schedule': schedule, 'day': days, }, )