예제 #1
0
 def test_dumps_jsonx(self):
     test_cases = [{"abc" : 1, "doc__" : "xxyyzz"},{"doc2__" : "xx", "x" : 1, "doc1__" : "yy", "y" : 2}]
     for obj in test_cases:
         print obj
         binary = misc.dumps_jsonx(copy.deepcopy(obj))
         print binary
         ret_obj = misc.loads_jsonx(binary)
         print ret_obj
         self.assertTrue(len(obj) == len(ret_obj))
         for key, value in obj.items():
             self.assertEqual(value, ret_obj[key])
         self.assertTrue(obj == ret_obj)
예제 #2
0
    def test_dumps_jsonx_body(self):
        req = urllib2.Request("http://www.5173.com")
        res = urllib2.urlopen(req)
        body = res.read()
        body = body.decode("utf-8", "ignore").encode("utf-8")
        message = {"doc__" : body, "url" : "xx"}
        binary = misc.dumps_jsonx(copy.deepcopy(message))
        ret_message = misc.loads_jsonx(binary)
        self.assertEqual(message, ret_message)

        try:
            simplejson.loads(simplejson.dumps(message))
            self.assertFail()
        except:
            pass
예제 #3
0
    def set(self, data_type, ori_data_key, with_get=False, **kwargs):
        """
        parameters:
            with_get: returns original value if True, default is False
            cond: just set values if cond is met, just support redis/hash now
            nx: if just set value if the key does not exist, just support text/json and text/plain, with_get can't be used with nx
            strict: whether set the non-existed field to none, default is True, just support redis/hash
            redis/hash: fields: get fields, just support redis/hash

        content_types:
            text/json: data is dict object, serialize to text, and override all the values,  with_get == False: returns True, else: returns original value
            text/plain: data is str object, set directly, with_get == False: returns True, else: returns original value
            redis/hash: update_map/inc_map are optional, will update specified fields, with_get == False: returns True if any update is not empty, else: returns original value
            redis/set: data_key is set value, with_get == False, returns True, else returns if existed
        """
        #logging.debug("redis set", data_type, ori_data_key, with_get, kwargs)
        data_key = copy.deepcopy(ori_data_key)
        if not self._enabled:
            return None

        name, content_type, enabled = self._prepare_op(data_type, data_key)
        if not enabled:
            return None

        parameters = RedisClient._get_parameters("set", content_type, **kwargs)

        if content_type == "text/json":
            data = parameters["data"]
            nx = parameters["nx"]

            if data is None:
                raise Exception("data can't be null")
            if not isinstance(data, dict):
                raise Exception("text/json type data before dumps should be dict type")
            data = misc.dumps_jsonx(data)
            if nx and with_get:
                raise Exception("nx can't be used with with_get")

            if not with_get:
                if nx:
                    return self._client.setnx(name, data)
                else:
                    return self._client.set(name, data)
            else:
                data = self._client.getset(name, data)
                return self._load_json_object(data)
        elif content_type == "text/plain":
            data = parameters["data"]
            nx = parameters["nx"]

            if not isinstance(data, str):
                data = encode_string(data)
                if data is None:
                    raise Exception("redis set value must be str, %s, %s, %s" % (data_type, data_key, type(data)))
            if nx and with_get:
                raise Exception("nx can't be used with with_get")

            if not with_get:
                if nx:
                    return self._client.setnx(name, data)
                else:
                    return self._client.set(name, data)
            else:
                return self._client.getset(name, data)
        elif content_type == "redis/hash":
            return self._set_hash(data_type, name, parameters["update_map"], parameters["inc_map"], with_get, parameters["fields"], parameters["strict"], parameters["cond"])
        elif content_type == "redis/set":
            if not isinstance(data_key, str):
                data_key = encode_string(data_key)
                if data_key is None:
                    raise Exception("data_key must be str, %s" % data_key)

            existed = self._client.sadd(name, data_key) == 0
            if not with_get:
                return True
            else:
                return existed
        else:
            raise Exception("unsupported data_type for set, %s" % data_type)