# -*- coding: utf-8 -*-
"""
Daily cleanup job.

Can be run as a cronjob to clean out old data from the database (only expired
sessions at the moment).
"""

from contextlib import contextmanager

import six

from django.utils import timezone
from django_extensions.management.jobs import DailyJob


class Job(DailyJob):
    help = "Cache (db) cleanup Job"

    def execute(self):
        from django.conf import settings
        from django.db import transaction
        import os

        if hasattr(transaction, 'atomic'):
            atomic = transaction.atomic
        else:
            @contextmanager
            def atomic(using=None):
                yield
                transaction.commit_unless_managed(using=using)

        if hasattr(settings, 'CACHES'):
            from django.core.cache import caches
            from django.db import router, connections

            for cache_name, cache_options in six.iteritems(settings.CACHES):
                if cache_options['BACKEND'].endswith("DatabaseCache"):
                    cache = caches[cache_name]
                    db = router.db_for_write(cache.cache_model_class)
                    with atomic(using=db):
                        cursor = connections[db].cursor()
                        now = timezone.now()
                        cache._cull(db, cursor, now)
            return

        if hasattr(settings, 'CACHE_BACKEND'):
            if settings.CACHE_BACKEND.startswith('db://'):
                from django.db import connection
                os.environ['TZ'] = settings.TIME_ZONE
                table_name = settings.CACHE_BACKEND[5:]

                with atomic():
                    cursor = connection.cursor()
                    cursor.execute(
                        "DELETE FROM %s WHERE %s < current_timestamp;" % (
                            connection.ops.quote_name(table_name),
                            connection.ops.quote_name('expires')
                        )
                    )
