Exemple #1
0
    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
Exemple #2
0
    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,
                },
            )