import redis
from django.conf import settings
from django.core.management import BaseCommand

'''
日记相关redis 部分和gaia 分隔
'''
class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument('-t', '--test', action='store_true',
                            help="Run test for redis migrate, a redis server should run on localhost:6379")
        parser.add_argument('-m', '--migrate', action='store_true', help="Redis data migrate")

    def handle(self, *args, **options):
        """
        redis migrate.
        :param args:
        :param options:
        :return:
        """
        for rd in settings.REDIS_MIGRATE_TALOS:
            for prefix in rd['prefix']:
                self.migrate_v2(rd['source'], rd['target'], prefix=prefix)


    def migrate_v2(self, source, target, prefix=""):
        """
        适用于:redis >= 2.6
        :param source:
        :param target:
        :param prefix:
        :return:
        """
        self.stdout.write(self.style.SUCCESS(
            "Start to migrate from %s to %s, prefix: %s" % (
                "redis://" + source['host'] + ":" + str(source['port']) + "/" + str(source['db']),
                "redis://" + target['host'] + ":" + str(target['port']) + "/" + str(target['db']),
                prefix
            )
        ))
        src_rd = redis.StrictRedis(**source)
        dst_rd = redis.StrictRedis(**target)
        total = len(src_rd.keys(prefix + "*"))
        for key in src_rd.keys(prefix + "*"):
            try:
                """ redis> SET """
                v = src_rd.get(key)
                dst_rd.set(key, v)
            except redis.exceptions.ResponseError:
                """ redis> HSET """
                try:
                    v = src_rd.hgetall(key)
                    dst_rd.hmset(key, v)
                except redis.exceptions.ResponseError:
                    """redis> ZADD """
                    zv = src_rd.zrange(key, 0, -1, withscores=True)
                    v = {key.decode(): value for key, value in zv}
                    dst_rd.zadd(key, **v)

        self.stdout.write(self.style.SUCCESS("Migrate success: %s key." % total))